------
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sat, 19 Apr 2008 12:45:17 +0000 (12:45 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sat, 19 Apr 2008 12:45:17 +0000 (12:45 +0000)
Merged changes from trunk into the acq branch. Details below...
------

Merged revisions 8237,8245,8250,8253,8258-8259,8261-8264,8270,8272,8274-8275,8287,8293,8298-8299,8302,8304-8305,8308-8309,8311-8312,8314,8316,8322,8325,8327,8331,8336,8341,8347-8348,8352,8354,8361,8379-8384,8387,8389,8392,8398,8402-8403,8405,8414,8423,8426,8431-8450,8452,8455,8457,8459-8462,8464,8466,8468,8471-8475,8477,8481,8488-8489,8494,8496,8498-8499,8501-8503,8506-8509,8513-8516,8519-8520,8523-8526,8528-8530,8533,8537,8544,8546-8554,8557-8559,8562-8566,8570-8573,8575,8577,8580,8582-8592,8600,8602,8604,8606,8609-8611,8614-8616,8618-8619,8624-8628,8630,8632,8634,8636,8643,8645,8652-8656,8661,8663,8665-8667,8669,8674,8677,8679-8680,8689-8691,8693,8696,8699-8705,8707-8708,8711,8713,8721,8723,8725-8726,8731,8740-8741,8749,8752,8755,8759-8761,8765-8767,8771-8772,8788,8794,8798,8802,8808,8811,8818,8820,8823,8825,8829-8830,8835,8837,8840,8842,8844-8856,8858-8860,8863,8870-8875,8881,8883-8884,8886-8904,8906,8909-8911,8917,8920-8928,8930-8931,8933,8936,8942-8944,8948-8956,8959-8964,8966-8977,8985-8986,8990-8991,8993,8995,8999,9001-9002,9004,9007-9015,9017-9019,9021-9026,9028-9040,9043,9045-9059,9061,9065,9067,9069,9071,9073,9076-9077,9079,9081-9082,9085-9086,9088,9092,9094,9099,9102,9104,9108,9111-9116,9119,9121-9125,9127,9129-9133,9137,9140-9142,9144-9146,9148-9150,9152,9159,9165-9166,9175,9177,9180,9186-9187,9191-9193,9195-9196,9198,9200,9203-9204,9206-9210,9212-9217,9219-9223,9225-9226,9228-9229,9232-9236,9241,9243,9245,9247-9248,9253,9255-9256,9259-9261,9266,9269-9270,9272,9276,9279,9288-9289,9291-9295,9300,9304,9309-9314,9318-9323,9325,9327-9330,9333-9336,9338-9340,9342-9343,9345,9347,9349-9350,9352-9354,9356-9360,9362-9380 via svnmerge from
svn://svn.open-ils.org/ILS/trunk

........
  r8237 | miker | 2007-12-19 17:51:14 -0500 (Wed, 19 Dec 2007) | 1 line

  make z search more robust when using multi-target search
........
  r8245 | dbs | 2007-12-19 21:08:57 -0500 (Wed, 19 Dec 2007) | 2 lines

  Add Armenian translation of OPAC (thanks to tigran.zargaryan@eifl.net)
........
  r8250 | erickson | 2007-12-20 10:58:46 -0500 (Thu, 20 Dec 2007) | 1 line

  added search
........
  r8253 | dbs | 2007-12-20 14:26:51 -0500 (Thu, 20 Dec 2007) | 4 lines

  Enable translation of ils_events.xml, roundtripping from XML to POT to PO to XML.
  Check in a current trunk version of the POT file.
  Still need to enable <desc> elements for each xml:lang to merge into the ultimate XML file.
........
  r8258 | phasefx | 2007-12-20 17:25:25 -0500 (Thu, 20 Dec 2007) | 1 line

  multi-z-source functionality for staff client z39.50 client
........
  r8259 | erickson | 2007-12-20 23:09:53 -0500 (Thu, 20 Dec 2007) | 1 line

  fixed atomic method re-naming
........
  r8261 | dbs | 2007-12-20 23:29:19 -0500 (Thu, 20 Dec 2007) | 2 lines

  Add some documentation to this marvelous class
........
  r8262 | phasefx | 2007-12-21 01:18:07 -0500 (Fri, 21 Dec 2007) | 1 line

  consider .auth for services
........
  r8263 | phasefx | 2007-12-21 01:47:03 -0500 (Fri, 21 Dec 2007) | 1 line

  hardcode native evergreen catalog as a virtual z-source, and show 0 records found if no .count field
........
  r8264 | phasefx | 2007-12-21 01:55:05 -0500 (Fri, 21 Dec 2007) | 1 line

  oops, disable these widgets until the native-evergreen-catalog virtual z-service is in trunk
........
  r8270 | dbs | 2007-12-21 13:11:33 -0500 (Fri, 21 Dec 2007) | 2 lines

  Fix typo that prevents parsing virtual fields
........
  r8272 | dbs | 2007-12-21 13:42:39 -0500 (Fri, 21 Dec 2007) | 2 lines

  Add a little bit of example usage to the docs for idl.pl
........
  r8274 | erickson | 2007-12-21 17:43:58 -0500 (Fri, 21 Dec 2007) | 1 line

  added some documentation.  sorry, dbs, if the format isn't right...  more to come
........
  r8275 | dbs | 2007-12-22 21:41:38 -0500 (Sat, 22 Dec 2007) | 2 lines

  Install Evergreen Python modules via distutils
........
  r8287 | miker | 2007-12-28 11:34:04 -0500 (Fri, 28 Dec 2007) | 1 line

  adding fkey for actor.usr.profile -- Thanks to Jonh from AlphaG for spotting the missing definition
........
  r8293 | phasefx | 2008-01-02 10:38:16 -0500 (Wed, 02 Jan 2008) | 1 line

  refactor the flattening of hold copies, and disallow editing the pickup locations for intransit or ready for pickup holds
........
  r8298 | phasefx | 2008-01-03 11:36:22 -0500 (Thu, 03 Jan 2008) | 1 line

  experiment with svn:keywords
........
  r8299 | phasefx | 2008-01-03 11:38:12 -0500 (Thu, 03 Jan 2008) | 1 line

  copy/paste-o, but keywords seem to work
........
  r8302 | erickson | 2008-01-03 12:10:17 -0500 (Thu, 03 Jan 2008) | 1 line

  forward-porting move to cstore for bib create and replace calls
........
  r8304 | phasefx | 2008-01-03 13:46:51 -0500 (Thu, 03 Jan 2008) | 1 line

  change Build ID to Target Server ID to match reality, and display the svn path the build came from
........
  r8305 | phasefx | 2008-01-03 13:49:23 -0500 (Thu, 03 Jan 2008) | 1 line

  I'm not going to bother parsing the svn keyword for now, so this looks better like this
........
  r8308 | erickson | 2008-01-03 14:13:16 -0500 (Thu, 03 Jan 2008) | 1 line

  fixed typo -- tiemstamp
........
  r8309 | erickson | 2008-01-03 14:42:36 -0500 (Thu, 03 Jan 2008) | 1 line

  replaced unneccesary loop with API call
........
  r8311 | erickson | 2008-01-03 15:59:14 -0500 (Thu, 03 Jan 2008) | 1 line

  showing last year closed dates in addition to this year and beyond
........
  r8312 | erickson | 2008-01-04 09:01:02 -0500 (Fri, 04 Jan 2008) | 1 line

  parsing primary, sequence, and primitive settings from IDL
........
  r8314 | erickson | 2008-01-04 14:19:49 -0500 (Fri, 04 Jan 2008) | 1 line

  added fields where links existed for nonexistant fields.  fixed a typo
........
  r8316 | erickson | 2008-01-04 15:35:44 -0500 (Fri, 04 Jan 2008) | 6 lines

  * added link parsing
  * added an abstraction layer over the IDL class, field, and link objects for class-based access
  * started (slowly) making the move to the more pythonic lower/underscore method names
........
  r8322 | erickson | 2008-01-04 17:12:38 -0500 (Fri, 04 Jan 2008) | 1 line

  logging error for now instead of throwing exception
........
  r8325 | miker | 2008-01-05 20:13:11 -0500 (Sat, 05 Jan 2008) | 1 line

  make the message about duplicate TCN avoidance more clear
........
  r8327 | dbs | 2008-01-06 13:44:22 -0500 (Sun, 06 Jan 2008) | 2 lines

  Typo fix in Python IDL module (virtul -> virtual)
........
  r8331 | erickson | 2008-01-06 14:32:55 -0500 (Sun, 06 Jan 2008) | 1 line

  more IDL api work.  moving to more pythonic lower/underscore method names.  moved global functions to class-level static method.  updated docstring and dependent classes
........
  r8336 | erickson | 2008-01-06 16:06:50 -0500 (Sun, 06 Jan 2008) | 1 line

  changed create_date to create_time to match column in db
........
  r8341 | dbs | 2008-01-06 20:05:01 -0500 (Sun, 06 Jan 2008) | 2 lines

  Enable Python build with regular user to avoid perm problems at clean time.
........
  r8347 | erickson | 2008-01-07 18:16:02 -0500 (Mon, 07 Jan 2008) | 1 line

  plugged in new permission checking call which uses cstore instead of storage
........
  r8348 | phasefx | 2008-01-08 11:50:32 -0500 (Tue, 08 Jan 2008) | 1 line

  refactor and fix dedup of shelving locations, and fix regression when Copy Editor is in View-Only mode
........
  r8352 | phasefx | 2008-01-08 14:28:15 -0500 (Tue, 08 Jan 2008) | 1 line

  refactor spawn_copy_editor and perm check
........
  r8354 | phasefx | 2008-01-08 15:37:09 -0500 (Tue, 08 Jan 2008) | 1 line

  one hell of a typo ;) fixes a regression
........
  r8361 | erickson | 2008-01-09 09:52:48 -0500 (Wed, 09 Jan 2008) | 1 line

  added an is_true function
........
  r8379 | miker | 2008-01-11 20:02:23 -0500 (Fri, 11 Jan 2008) | 1 line

  force flushing of the apache/mod_perl buffer after each record
........
  r8380 | miker | 2008-01-14 17:09:33 -0500 (Mon, 14 Jan 2008) | 1 line

  allow the exporter to accept a container id, for exporting buckets etc
........
  r8381 | miker | 2008-01-14 17:29:13 -0500 (Mon, 14 Jan 2008) | 1 line

  allow cgi params instead of a cookie for auth token
........
  r8382 | dbs | 2008-01-14 23:26:35 -0500 (Mon, 14 Jan 2008) | 2 lines

  Switch to setuptools for dependency handling
........
  r8383 | erickson | 2008-01-15 09:48:34 -0500 (Tue, 15 Jan 2008) | 1 line

  removing deprecated code
........
  r8384 | erickson | 2008-01-15 12:30:07 -0500 (Tue, 15 Jan 2008) | 1 line

  repaired typo
........
  r8387 | erickson | 2008-01-15 18:26:10 -0500 (Tue, 15 Jan 2008) | 1 line

  updated to match opensrf changes, more move away from prefixed functions.
........
  r8389 | dbs | 2008-01-15 22:37:47 -0500 (Tue, 15 Jan 2008) | 4 lines

  Backport from acq-experiment branch:
  Add a build flag for Python modules.
  Use setuptools for building and installing Python modules.
........
  r8392 | erickson | 2008-01-16 12:27:00 -0500 (Wed, 16 Jan 2008) | 1 line

  added acq const
........
  r8398 | erickson | 2008-01-17 12:11:51 -0500 (Thu, 17 Jan 2008) | 1 line

  added a generic event class to model ILS events, removed functional event code from the util class
........
  r8402 | erickson | 2008-01-17 12:57:34 -0500 (Thu, 17 Jan 2008) | 1 line

  added a to_ex method to turn the event into an exception and a runtime raise_and_parse method for 1-line event handling
........
  r8403 | erickson | 2008-01-17 13:00:46 -0500 (Thu, 17 Jan 2008) | 1 line

  repaired event test
........
  r8405 | dbs | 2008-01-17 13:57:17 -0500 (Thu, 17 Jan 2008) | 4 lines

  Move POT files into en-US subdirectory (clutter BAD).
  Provide more granular file and directory handling.
  Repair some of the unit tests to match the reorged dirs.
........
  r8414 | dbs | 2008-01-17 21:58:17 -0500 (Thu, 17 Jan 2008) | 2 lines

  Move hardcoded strings out of offline transaction mgmt interface
........
  r8423 | erickson | 2008-01-18 15:17:47 -0500 (Fri, 18 Jan 2008) | 1 line

  added explicit disconnect
........
  r8426 | erickson | 2008-01-18 17:02:19 -0500 (Fri, 18 Jan 2008) | 1 line

  repaired logic error in reading event status.  assuming existance of code and textcode
........
  r8431 | dbs | 2008-01-19 00:26:34 -0500 (Sat, 19 Jan 2008) | 4 lines

  Move strings out of font_settings.xul; shuffle logic to make i18n possible.
  Correct a typo in offline_manage_xacts.xul.
  Note: chrome/locale is the wrong place for these properties, we probably want to coalesce all JS message catalogs into a single directory, then copy it into both chrome and server XUL.
........
  r8432 | dbs | 2008-01-19 14:33:39 -0500 (Sat, 19 Jan 2008) | 2 lines

  Correct SetEnv syntax for XUL locale
........
  r8433 | dbs | 2008-01-19 15:33:26 -0500 (Sat, 19 Jan 2008) | 2 lines

  Just use one messagecatalog (offline.properties) in chrome
........
  r8434 | dbs | 2008-01-19 15:35:15 -0500 (Sat, 19 Jan 2008) | 2 lines

  Server-side XUL uses server-side message catalogs
........
  r8435 | dbs | 2008-01-19 15:37:46 -0500 (Sat, 19 Jan 2008) | 2 lines

  Define common strings for server-side messagecatalogs
........
  r8436 | dbs | 2008-01-20 06:28:18 -0500 (Sun, 20 Jan 2008) | 4 lines

  Start using locale SSI env to pull in DTD for XUL/XHTML
  Add include and XML entity parsing to XHTML files in /xul/
  Localize a few more admin files
........
  r8437 | dbs | 2008-01-20 07:13:59 -0500 (Sun, 20 Jan 2008) | 2 lines

  Correct "temaplate" typo
........
  r8438 | dbs | 2008-01-20 07:44:43 -0500 (Sun, 20 Jan 2008) | 3 lines

  Localize many of the strings in closed_dates.xhtml;
  Note: some of the forms need to be redesigned to support i18n.
........
  r8439 | dbs | 2008-01-20 13:54:06 -0500 (Sun, 20 Jan 2008) | 2 lines

  The localization madness continues...
........
  r8440 | dbs | 2008-01-20 16:48:37 -0500 (Sun, 20 Jan 2008) | 2 lines

  Restore regression spotted by miker (thanks!)
........
  r8441 | miker | 2008-01-20 21:33:29 -0500 (Sun, 20 Jan 2008) | 1 line

  stylesheet that can turn the Library of Conference MARC data into a nice XML format
........
  r8442 | dbs | 2008-01-20 21:43:57 -0500 (Sun, 20 Jan 2008) | 2 lines

  More staff client localization in server/admin
........
  r8443 | dbs | 2008-01-20 21:49:29 -0500 (Sun, 20 Jan 2008) | 2 lines

  Teach dtd2js.pl to ignore comments.
........
  r8444 | miker | 2008-01-20 21:50:02 -0500 (Sun, 20 Jan 2008) | 1 line

  adding copyright and docs
........
  r8445 | miker | 2008-01-20 21:52:53 -0500 (Sun, 20 Jan 2008) | 1 line

  adding pointer to the original docs
........
  r8446 | dbs | 2008-01-20 22:58:26 -0500 (Sun, 20 Jan 2008) | 3 lines

  Teach i18n Makefile about multiple property file locations.
  Update our POT files.
........
  r8447 | dbs | 2008-01-21 10:08:35 -0500 (Mon, 21 Jan 2008) | 3 lines

  Merge circ.properties into offline.properties (missed it the first time around).
  Now we (truly) have just a single properties file for the offline interfaces.
........
  r8448 | phasefx | 2008-01-21 10:18:47 -0500 (Mon, 21 Jan 2008) | 1 line

  some try/catch goodness for messagecatalog implementation, and throw exception on key not found
........
  r8449 | dbs | 2008-01-21 10:20:39 -0500 (Mon, 21 Jan 2008) | 2 lines

  Clean up staff client 'make' output
........
  r8450 | dbs | 2008-01-21 12:31:02 -0500 (Mon, 21 Jan 2008) | 3 lines

  Eliminate lang.js (old i18n approach).
  Load common.properties in util_overlay.xul so it is available globally.
........
  r8452 | erickson | 2008-01-22 10:49:53 -0500 (Tue, 22 Jan 2008) | 1 line

  beginnings of general purpose org_unit utility functions
........
  r8455 | erickson | 2008-01-22 11:24:42 -0500 (Tue, 22 Jan 2008) | 1 line

  added open-ils.actor app
........
  r8457 | dbs | 2008-01-22 11:34:56 -0500 (Tue, 22 Jan 2008) | 2 lines

  Use the SHELL Makefile variable to set bash, rather than hash-bang
........
  r8459 | dbs | 2008-01-22 12:35:18 -0500 (Tue, 22 Jan 2008) | 3 lines

  Enable build via relative header file and library locations within the build tree
  We had been depending on files existing in /openils/ - egg-and-chicken style
........
  r8460 | dbs | 2008-01-22 12:41:29 -0500 (Tue, 22 Jan 2008) | 3 lines

  Restore Makefile.install to r8000.
  This experimental update was unintentionally included in my previous commit
........
  r8461 | dbs | 2008-01-22 12:51:52 -0500 (Tue, 22 Jan 2008) | 2 lines

  Correct install rules for the c-app headers
........
  r8462 | dbs | 2008-01-22 12:59:24 -0500 (Tue, 22 Jan 2008) | 2 lines

  This actually uses bash syntax; let's be explicit in the hash-bang
........
  r8464 | phasefx | 2008-01-22 14:14:07 -0500 (Tue, 22 Jan 2008) | 1 line

  util.window was relying on xulG, but when called from the main.menu framework, there is no xulG.  This fixes the Operator Change regression, and the chrome Perm Denied/Re-Auth regression
........
  r8466 | erickson | 2008-01-22 15:03:18 -0500 (Tue, 22 Jan 2008) | 1 line

  more org utility code
........
  r8468 | erickson | 2008-01-22 15:10:20 -0500 (Tue, 22 Jan 2008) | 1 line

  more org utility code
........
  r8471 | dbs | 2008-01-22 22:17:07 -0500 (Tue, 22 Jan 2008) | 2 lines

  Reorder admin user insert statements to satisfy foreign key dependencies
........
  r8472 | dbs | 2008-01-22 22:59:40 -0500 (Tue, 22 Jan 2008) | 2 lines

  Typo in debug output
........
  r8473 | dbs | 2008-01-23 08:25:47 -0500 (Wed, 23 Jan 2008) | 2 lines

  We no longer need to call lang.js
........
  r8474 | dbs | 2008-01-23 08:31:36 -0500 (Wed, 23 Jan 2008) | 2 lines

  Localize strings in circ checkin interface
........
  r8475 | erickson | 2008-01-23 08:57:00 -0500 (Wed, 23 Jan 2008) | 1 line

  added method to return flat list of related orgs
........
  r8477 | erickson | 2008-01-23 09:07:42 -0500 (Wed, 23 Jan 2008) | 1 line

  verifying existance of local tree before performing some functions
........
  r8481 | erickson | 2008-01-23 11:30:52 -0500 (Wed, 23 Jan 2008) | 1 line

  added org name sorting to org list retrieval
........
  r8488 | dbs | 2008-01-23 22:18:56 -0500 (Wed, 23 Jan 2008) | 2 lines

  Do not force application type of XHTML files to XUL (wreaks havoc with javascript)
........
  r8489 | dbs | 2008-01-23 23:04:17 -0500 (Wed, 23 Jan 2008) | 2 lines

  Use a more explicit term than "Mult-date" for easier translation
........
  r8494 | miker | 2008-01-24 13:29:44 -0500 (Thu, 24 Jan 2008) | 1 line

  added param sets for voided billing clauses
........
  r8496 | miker | 2008-01-24 13:31:05 -0500 (Thu, 24 Jan 2008) | 1 line

  fixing authority validation with the new input/output methods for the gateway
........
  r8498 | dbs | 2008-01-24 15:51:34 -0500 (Thu, 24 Jan 2008) | 2 lines

  Localize checkin and checkout interfaces
........
  r8499 | miker | 2008-01-25 12:50:59 -0500 (Fri, 25 Jan 2008) | 1 line

  make flags accept 0/1 as well as false/true
........
  r8501 | dbs | 2008-01-27 14:31:23 -0500 (Sun, 27 Jan 2008) | 2 lines

  Correct entity name
........
  r8502 | dbs | 2008-01-27 17:04:03 -0500 (Sun, 27 Jan 2008) | 2 lines

  Correct a mod_xmlent complaint about invalid XML
........
  r8503 | dbs | 2008-01-27 17:38:29 -0500 (Sun, 27 Jan 2008) | 3 lines

  Migrate opac.js over from strbundle to messagecatalog
  Make circ_brief.xul locale-aware
........
  r8506 | miker | 2008-01-27 19:09:49 -0500 (Sun, 27 Jan 2008) | 1 line

  adding create_time column to match the IDL
........
  r8507 | dbs | 2008-01-27 20:38:18 -0500 (Sun, 27 Jan 2008) | 3 lines

  Return null in the event the requested org setting doesn't exist, rather than erroring out.
  Credit berick for fixing this one.
........
  r8508 | dbs | 2008-01-27 23:40:26 -0500 (Sun, 27 Jan 2008) | 2 lines

  Correct a regression introduced by i18n, and make jslint happy while we're at it.
........
  r8509 | erickson | 2008-01-28 10:03:32 -0500 (Mon, 28 Jan 2008) | 1 line

  protecting against edge case where we run off the end of the org table before finding a place to insert the callnumber row
........
  r8513 | miker | 2008-01-28 12:13:33 -0500 (Mon, 28 Jan 2008) | 1 line

  ignore deleted records within a metarecord
........
  r8514 | dbs | 2008-01-28 13:18:39 -0500 (Mon, 28 Jan 2008) | 2 lines

  A bit more checkout.js code cleaning to comply with jslint standards
........
  r8515 | miker | 2008-01-28 15:04:14 -0500 (Mon, 28 Jan 2008) | 1 line

  just use plperl and not plperlu
........
  r8516 | miker | 2008-01-28 15:16:10 -0500 (Mon, 28 Jan 2008) | 1 line

  ok fine. use plperlu
........
  r8519 | erickson | 2008-01-28 15:57:12 -0500 (Mon, 28 Jan 2008) | 1 line

  drastically up the timeout for these long-running transactions
........
  r8520 | miker | 2008-01-28 17:04:02 -0500 (Mon, 28 Jan 2008) | 1 line

  spacing
........
  r8523 | erickson | 2008-01-28 18:20:29 -0500 (Mon, 28 Jan 2008) | 11 lines

  created an external brick configuration file
  brick_ctl can now take disparate sets of IPs for the master and drones
  removed the linux-specific IP grepping in favor of the configured IPs
  made xul building more flexible
  general cleanup

  committing example config file
........
  r8524 | dbs | 2008-01-28 22:10:55 -0500 (Mon, 28 Jan 2008) | 3 lines

  Correct logic error that prevented users from changing their usernames
  (res = '0' because the username isn't found, but '0' != their user ID so it was always failing)
........
  r8525 | dbs | 2008-01-28 23:45:00 -0500 (Mon, 28 Jan 2008) | 2 lines

  Convert z39.50 client over to common.properties strings from lang.js
........
  r8526 | erickson | 2008-01-29 13:21:08 -0500 (Tue, 29 Jan 2008) | 1 line

  added some hold permit exemptions for DCPL and LEE.  this is a PINES thing
........
  r8528 | dbs | 2008-01-29 14:14:29 -0500 (Tue, 29 Jan 2008) | 3 lines

  Return explicit nulls if no matching username / barcode is found (and modify tests accordingly).
  We suspect JSON::XS started returning '0' instead of 0, which threw off our logic.
........
  r8529 | miker | 2008-01-29 16:13:32 -0500 (Tue, 29 Jan 2008) | 1 line

  make double extra sure that the namespace attribute is there!
........
  r8530 | miker | 2008-01-29 16:30:03 -0500 (Tue, 29 Jan 2008) | 1 line

  use default namespaces ... easier to work with anyway, and newer libxmls avoid stripping them
........
  r8533 | dbs | 2008-01-29 22:23:21 -0500 (Tue, 29 Jan 2008) | 2 lines

  We actually need to test for equality with '0'
........
  r8537 | erickson | 2008-01-30 12:13:42 -0500 (Wed, 30 Jan 2008) | 1 line

  ensuring transactions are closed after a billing is applied against a negative balance transaction
........
  r8544 | phasefx | 2008-01-30 14:00:38 -0500 (Wed, 30 Jan 2008) | 1 line

  change D_ALERT log level to D_WARN to avoid unneeded popups
........
  r8546 | dbs | 2008-01-30 16:56:40 -0500 (Wed, 30 Jan 2008) | 2 lines

  Make "make clean" clean the staff_client directory as well
........
  r8547 | miker | 2008-01-31 13:13:37 -0500 (Thu, 31 Jan 2008) | 1 line

  Patch from Scott McKellar plugging several pointer leaks
........
  r8548 | miker | 2008-01-31 13:34:42 -0500 (Thu, 31 Jan 2008) | 27 lines

  Patch from Scott McKellar:

  1. I added the const qualifier to a number of function parameters.

  2. I moved the prototype for _oilsEventParseEvents() from the header
  into the implementation file, and made the function static.  No other
  source file calls it, nor should it.

  3. I removed an extra leading underscore from each of _oilsEventEvents
  and _oilsEventDescriptions, and made them static.

  3. I removed an unhelpful cast from a call to safe_malloc().

  4. I made sure to initialize every member of a new oilsEvent.

  5. In several spots where we update pointer members of an oilsEvent,
  I preceded the update with a free, in order to avoid potential
  memory leaks.

  6. I replaced calls to oilsEventSetPermission() and
  oilsEventSetPayload() with the equivalent inline code.

  7. In oilsEventFree(), the original code would free the json member
  or the payload member but not both.  We now free both.  We also
  free the event member, which we didn't do before.
........
  r8549 | miker | 2008-01-31 13:56:38 -0500 (Thu, 31 Jan 2008) | 1 line

  Patch from Scott Mckellar to plug a few leaks
........
  r8550 | miker | 2008-01-31 14:01:25 -0500 (Thu, 31 Jan 2008) | 15 lines

  1. In main() we allocate a growing_buffer named "json".  I added a
  line to free it.

  2. In commitTransaction() and rollbackTransaction() I eliminated
  a layer of jsonObjectClone(), along with the associated
  jsonObjectFree().  Now we extract the string we want directly from
  the original object without making an unnecessary copy.

  3. I renamed the four macros starting with "E" so as to start
  with "E_" instead.

  4. All functions (other than main()) are now static, as are the three
  variables that had been declared at global scope.
........
  r8551 | miker | 2008-01-31 14:53:27 -0500 (Thu, 31 Jan 2008) | 12 lines

  Patch from Scott McKellar:

  1. In oilsInitIDL: I added the const qualifier to the input parameter.
  This change involved some juggling of a couple of extra variables.

  2. Also in oilsInitIDL: I plugged a potential memory leak related to
  an early return.

  3. In oilsUtilsFetchUserByBarcode we create a jsonObject named
  "card" but we weren't freeing it.  Now we free it.
........
  r8552 | miker | 2008-01-31 14:55:57 -0500 (Thu, 31 Jan 2008) | 1 line

  Missed the header in the last patch (from Scott McKellar)
........
  r8553 | miker | 2008-01-31 14:59:04 -0500 (Thu, 31 Jan 2008) | 1 line

  Patch from Scott McKellar to plug a small leak in open-ils.auth
........
  r8554 | miker | 2008-01-31 15:13:05 -0500 (Thu, 31 Jan 2008) | 1 line

  put source include files in front of installed, system include files in the -I list (avoids mis-matched definition errors when const, etc is corrected)
........
  r8557 | erickson | 2008-01-31 15:52:21 -0500 (Thu, 31 Jan 2008) | 1 line

  disallow marking an item lost that is already marked lost
........
  r8558 | miker | 2008-01-31 16:40:30 -0500 (Thu, 31 Jan 2008) | 1 line

  moving dedup to just where it is needed
........
  r8559 | erickson | 2008-01-31 16:58:50 -0500 (Thu, 31 Jan 2008) | 1 line

  duping method_type before using it as a data in the hash, since method_type is later freed
........
  r8562 | erickson | 2008-01-31 17:45:28 -0500 (Thu, 31 Jan 2008) | 1 line

  comitting initial authoritative auto-magic transactions for cstore
........
  r8563 | miker | 2008-02-01 00:10:42 -0500 (Fri, 01 Feb 2008) | 1 line

  adding 610, 611 and 630 to the list of controlled fields
........
  r8564 | miker | 2008-02-01 09:10:33 -0500 (Fri, 01 Feb 2008) | 1 line

  give cstore the ability to select a subcolumn from a complex datatype, using the transform syntax
........
  r8565 | miker | 2008-02-01 09:20:32 -0500 (Fri, 01 Feb 2008) | 1 line

  subcolumn redux: need to wrap the function call in parens to delimit the subcolumn from the function
........
  r8566 | miker | 2008-02-01 09:24:01 -0500 (Fri, 01 Feb 2008) | 1 line

  it's the little things that getcha .... typo
........
  r8570 | phasefx | 2008-02-01 12:25:05 -0500 (Fri, 01 Feb 2008) | 1 line

  single-row refresh does not realize when an item needs to move between lists, as in the Item Outs interface with Mark Lost or Claimed Returned.  This is a quick fix, needs testing
........
  r8571 | phasefx | 2008-02-01 12:25:57 -0500 (Fri, 01 Feb 2008) | 1 line

  sidestep race condition with new volumes and db replication.. this should fix the Stat Cat popup errors, but we need to test on weezie
........
  r8572 | erickson | 2008-02-01 15:03:45 -0500 (Fri, 01 Feb 2008) | 1 line

  added method to find the org tree segments where a user has a given permission, includes work orgs
........
  r8573 | erickson | 2008-02-01 15:10:26 -0500 (Fri, 01 Feb 2008) | 1 line

  moved old-fashioned perm check to json_query for speed
........
  r8575 | erickson | 2008-02-01 15:19:52 -0500 (Fri, 01 Feb 2008) | 1 line

  removed cstoreditor :funcs import, was causing circular import problems when apputils was imported by cstoreeditor.
........
  r8577 | miker | 2008-02-01 15:38:03 -0500 (Fri, 01 Feb 2008) | 1 line

  adding the usr->barcode link
........
  r8580 | erickson | 2008-02-01 17:25:53 -0500 (Fri, 01 Feb 2008) | 1 line

  created method to return the thinnest full tree which contains a list of org IDs
........
  r8582 | dbs | 2008-02-02 14:48:13 -0500 (Sat, 02 Feb 2008) | 2 lines

  Revert revision 8546 - checked in the wrong file.
........
  r8583 | dbs | 2008-02-02 14:48:53 -0500 (Sat, 02 Feb 2008) | 2 lines

  Make "make clean" clean the staff_client directory as well
........
  r8584 | dbs | 2008-02-02 14:53:18 -0500 (Sat, 02 Feb 2008) | 2 lines

  i18n for checkout and circulation info interfaces
........
  r8585 | dbs | 2008-02-02 16:15:51 -0500 (Sat, 02 Feb 2008) | 2 lines

  i18n for copy details and circulation summary screens
........
  r8586 | miker | 2008-02-02 16:18:14 -0500 (Sat, 02 Feb 2008) | 1 line

  protect against null fingerprints (???)
........
  r8587 | dbs | 2008-02-02 17:16:55 -0500 (Sat, 02 Feb 2008) | 2 lines

  i18n of copy status overlay
........
  r8588 | miker | 2008-02-02 22:51:59 -0500 (Sat, 02 Feb 2008) | 1 line

  initial in-db circ and hold stuff.  this codifies the circ_modifier, and requires that values be registered before importing items that use them.  so, word to the wise, and the importer.  there is some example SQL that will be useful for upgrading embedded in the script files right now.
........
  r8589 | miker | 2008-02-03 14:08:44 -0500 (Sun, 03 Feb 2008) | 48 lines

  Patch from Scott McKellar:

  1. In setSavepoint(), releaseSavepoint() and rollbackSavepoint()
  we were leaking spName.

  2. Deep in doCreate() we were passing the return value of
  jsonObjectToSimpleString() directly to strcmp(), resulting in a leak.
  The strcmp() was inside a complex if condition. which I rearranged so
  as to capture the string and free it.

  Also: I captured and reused the return value from
  jsonObjectGetKeyConst() so as to avoid duplicated calls.

  Aso: I reversed the sense of the if condition and swapped the branches,
  so that it tests for equality rather than inequality.  To my eyes this
  arrangement is more readable.

  3. doRetrieve() was leaking id.

  4. jsonNumberToDBString() was passing the return value of
  jsonObjectToSimpleString() directly to atol() and atof(), thereby
  leaking the memory.  I captured the pointers and freed them.

  5. searchFieldTransform() was leaking val.

  6. In searchJOIN() we were leaking type and filter_op in the case of
  some early returns.  I moved the allocations past the early returns
  so that we don't allocate them until we need them.  I also free them
  as soon as we are done with them.  As a side benefit, I was able to
  avoid allocating filter_op at all in some cases.

  I gave similar treatment to table, although that wasn't being leaked.
  As a result I could avoid having to free it in the early returns.

  A couple of the early returns would leak field or fkey.  I plugged
  those leaks as well.

  I moved the declarations of filter and join_filter to their points
  of first use, in the interest of clarity.

  7. In buildSELECT(): we were passing the return value of
  jsonObjectToSimpleString() directly to osrfHashGet(), thereby leaking
  the memory.  I captured the pointer and freed it.

  8. In doFieldmapperSearch() a do/while loop allocates pkey_val but
  in some cases wasn't freeing it.
........
  r8590 | dbs | 2008-02-04 00:43:50 -0500 (Mon, 04 Feb 2008) | 2 lines

  Bring i18n to the main login window
........
  r8591 | dbs | 2008-02-04 00:56:31 -0500 (Mon, 04 Feb 2008) | 2 lines

  Complete i18n of chrome/cat/opac.js
........
  r8592 | erickson | 2008-02-04 10:36:28 -0500 (Mon, 04 Feb 2008) | 1 line

  repaired logic error in union-tree builder
........
  r8600 | erickson | 2008-02-04 11:23:30 -0500 (Mon, 04 Feb 2008) | 1 line

  no longer clobbering client-provided array of orgs
........
  r8602 | erickson | 2008-02-04 11:28:06 -0500 (Mon, 04 Feb 2008) | 1 line

  verifying existance of org tree before building union tree
........
  r8604 | erickson | 2008-02-04 11:35:03 -0500 (Mon, 04 Feb 2008) | 1 line

  forcing int-ness on flat org keys for consistency
........
  r8606 | erickson | 2008-02-04 11:45:51 -0500 (Mon, 04 Feb 2008) | 1 line

  added a min-depth function for a group of orgs, changed some variable names to be more explicit
........
  r8609 | dbs | 2008-02-04 13:17:10 -0500 (Mon, 04 Feb 2008) | 2 lines

  Bring i18n to JSAN error messages
........
  r8610 | miker | 2008-02-04 16:22:27 -0500 (Mon, 04 Feb 2008) | 1 line

  adding baseline circ matrix models
........
  r8611 | erickson | 2008-02-04 16:52:33 -0500 (Mon, 04 Feb 2008) | 1 line

  repaired some copy/paste errors
........
  r8614 | phasefx | 2008-02-04 17:01:39 -0500 (Mon, 04 Feb 2008) | 1 line

  clear "Red Items are circulating" hint on refresh in Patron Bills interface
........
  r8615 | dbs | 2008-02-04 17:08:53 -0500 (Mon, 04 Feb 2008) | 2 lines

  Fix typo (getStrint->getString)
........
  r8616 | erickson | 2008-02-04 17:14:58 -0500 (Mon, 04 Feb 2008) | 1 line

  added a .ids version of the work ou retrieval function. short circuiting the highest-work-org method if we hit an org with depth 0
........
  r8618 | dbs | 2008-02-04 17:33:11 -0500 (Mon, 04 Feb 2008) | 2 lines

  Bring more i18n love to chrome/main
........
  r8619 | erickson | 2008-02-04 18:40:23 -0500 (Mon, 04 Feb 2008) | 1 line

  moved some of the work org and perm calls into apputils since they will be needed accross applications and they will be hit a lot
........
  r8624 | dbs | 2008-02-04 22:22:51 -0500 (Mon, 04 Feb 2008) | 2 lines

  Bring i18n to main.js
........
  r8625 | dbs | 2008-02-04 22:44:01 -0500 (Mon, 04 Feb 2008) | 2 lines

  Correct common.error vs. common.exception mistake, plus a bit more i18n
........
  r8626 | dbs | 2008-02-04 23:30:59 -0500 (Mon, 04 Feb 2008) | 2 lines

  More i18n for chrome
........
  r8627 | miker | 2008-02-05 08:21:10 -0500 (Tue, 05 Feb 2008) | 1 line

  updating models with (what should be) working display code
........
  r8628 | erickson | 2008-02-05 09:59:55 -0500 (Tue, 05 Feb 2008) | 1 line

  added org descendant/ancestor/full_path utility methods
........
  r8630 | erickson | 2008-02-05 10:05:34 -0500 (Tue, 05 Feb 2008) | 1 line

  fixed calls to new_editor, which will not work in apputils (circular ref)
........
  r8632 | erickson | 2008-02-05 10:15:57 -0500 (Tue, 05 Feb 2008) | 1 line

  fixed some typos
........
  r8634 | erickson | 2008-02-05 10:25:11 -0500 (Tue, 05 Feb 2008) | 1 line

  added a descendants option to the high work org retrieval function
........
  r8636 | erickson | 2008-02-05 10:52:44 -0500 (Tue, 05 Feb 2008) | 1 line

  repaired descendant logic for initial high perm org
........
  r8643 | phasefx | 2008-02-05 14:28:43 -0500 (Tue, 05 Feb 2008) | 1 line

  regression in dos.print kludge.. need to quote path for windows, and assure text is being passed and not objects
........
  r8645 | miker | 2008-02-05 14:35:57 -0500 (Tue, 05 Feb 2008) | 1 line

  updating the exporter config to add the proxy for staff
........
  r8652 | dbs | 2008-02-05 22:44:09 -0500 (Tue, 05 Feb 2008) | 2 lines

  i18n improvements as I go through updating status
........
  r8653 | erickson | 2008-02-05 22:57:01 -0500 (Tue, 05 Feb 2008) | 9 lines

  getting closer on the circmatrixmatchpoint editing
  - using edit_inline on foreign keys to allow for up-front editing of
  objects which link to circmatrixmatchpoint
  - updated some of the __str__ methods to use gettext's unique brand of string interpolation
  - added some blank=False flags for non-required fields
........
  r8654 | erickson | 2008-02-05 23:00:23 -0500 (Tue, 05 Feb 2008) | 1 line

  added example verbose name
........
  r8655 | erickson | 2008-02-05 23:18:00 -0500 (Tue, 05 Feb 2008) | 1 line

  overriding save to force None-ness on the interval fields
........
  r8656 | miker | 2008-02-06 01:24:56 -0500 (Wed, 06 Feb 2008) | 1 line

  use serial instead of plain INT for pkey on circ_mod_test table
........
  r8661 | erickson | 2008-02-06 11:29:55 -0500 (Wed, 06 Feb 2008) | 1 line

  gave cstore editor the ability to check an array of permissions
........
  r8663 | erickson | 2008-02-06 11:39:23 -0500 (Wed, 06 Feb 2008) | 1 line

  fixed variable declaration
........
  r8665 | erickson | 2008-02-06 12:14:41 -0500 (Wed, 06 Feb 2008) | 1 line

  now using the find_highest_perm_org and get_org_tree methods provided in apputils
........
  r8666 | erickson | 2008-02-06 12:33:51 -0500 (Wed, 06 Feb 2008) | 3 lines

  using shared build_org_tree in apputils
........
  r8667 | erickson | 2008-02-06 12:53:33 -0500 (Wed, 06 Feb 2008) | 4 lines

  added vars to store permission error info
........
  r8669 | erickson | 2008-02-06 13:03:15 -0500 (Wed, 06 Feb 2008) | 1 line

  logic bug in new perm checker.  removed some dead code
........
  r8674 | erickson | 2008-02-06 15:23:22 -0500 (Wed, 06 Feb 2008) | 1 line

  added explicit "return undef"
........
  r8677 | miker | 2008-02-06 20:26:36 -0500 (Wed, 06 Feb 2008) | 1 line

  fixing readonly IDL logic
........
  r8679 | dbs | 2008-02-06 23:24:31 -0500 (Wed, 06 Feb 2008) | 2 lines

  Bring copy_status to the world of i18n
........
  r8680 | dbs | 2008-02-06 23:39:38 -0500 (Wed, 06 Feb 2008) | 2 lines

  Ensure ils_events.py is executable
........
  r8689 | miker | 2008-02-07 14:36:16 -0500 (Thu, 07 Feb 2008) | 1 line

  cross-port the per-object perm scheme from the acq branch
........
  r8690 | miker | 2008-02-07 14:48:17 -0500 (Thu, 07 Feb 2008) | 1 line

  adding index for object perms, and re-tabbing a bit
........
  r8691 | miker | 2008-02-07 14:49:48 -0500 (Thu, 07 Feb 2008) | 1 line

  also bringing the permacrud.xsd from acq (thanks for the reminder, Dan!)
........
  r8693 | dbs | 2008-02-07 16:41:17 -0500 (Thu, 07 Feb 2008) | 2 lines

  Typo: lenth -> length
........
  r8696 | dbs | 2008-02-07 17:39:23 -0500 (Thu, 07 Feb 2008) | 2 lines

  Mostly finish off server/circ i18n work
........
  r8699 | miker | 2008-02-08 10:38:30 -0500 (Fri, 08 Feb 2008) | 1 line

  adding subfield setting for idfield
........
  r8700 | erickson | 2008-02-08 12:35:04 -0500 (Fri, 08 Feb 2008) | 1 line

  moving variable decl. until after config is loaded
........
  r8701 | dbs | 2008-02-08 14:56:33 -0500 (Fri, 08 Feb 2008) | 2 lines

  Fix one little typo
........
  r8702 | erickson | 2008-02-08 15:46:18 -0500 (Fri, 08 Feb 2008) | 4 lines

  calling copy_details directly to prevent any issues with the $self variable
........
  r8703 | erickson | 2008-02-08 15:51:54 -0500 (Fri, 08 Feb 2008) | 1 line

  direct function calls to prevent any issues with $self
........
  r8704 | erickson | 2008-02-08 15:57:29 -0500 (Fri, 08 Feb 2008) | 1 line

  direct function calls to prevent any issues with $self.  removed some unused code
........
  r8705 | miker | 2008-02-08 16:01:19 -0500 (Fri, 08 Feb 2008) | 1 line

  moving to direct call syntax instead of indirection based, since it is unsafe
........
  r8707 | dbs | 2008-02-11 00:04:23 -0500 (Mon, 11 Feb 2008) | 2 lines

  Start tackling circ/util.js i18n
........
  r8708 | miker | 2008-02-11 07:52:04 -0500 (Mon, 11 Feb 2008) | 32 lines

  Patch from Scott McKellar which plugs a couple of memory leaks, and
  applies some minor optimizations, as much for clarity as for
  performance.

  1. In buildSELECT() we were leaking defaultselhash in the case of an
  early return.

  2. In doFieldmapperSearch() we were leaking flesh_blob in the case
  of an early return.

  3. In doFieldmapperSearch() I rearranged the logic a bit.  First,
  I performed a single search of meta to get a method type and saved
  the result for reuse, instead of performing the identical search
  repeatedly.  Second, I turned a series of ifs into a series of
  if/elses.  That way we stop searching when we find a match.  More
  importantly, the if/else structure makes it more clear to the reader
  that we're really just branching on method type in a case structure.

  This latter change requires that none of the branches changes the
  contents of ctx->method->userData.  So far as I can tell by tracing
  out all the branches, this condition is satisfied, as one would
  intuitively expect.

  4. Also in doFieldmapperSearch(): I increased the size of the
  growing_buffer sel_list from 16 characters to 64.  Since the
  formatted string is at least 13 characters long, depending on the
  length of the class name and primary key, I suspect that 16
  characters will almost never be big enough.  Even 64 characters
  might be too short.  I don't know how long the values typically
  are in practice.
........
  r8711 | erickson | 2008-02-11 10:44:34 -0500 (Mon, 11 Feb 2008) | 1 line

  new lib IP ranges
........
  r8713 | erickson | 2008-02-11 13:47:54 -0500 (Mon, 11 Feb 2008) | 1 line

  rolling back one change to oilsEventFree, which was causing a double-free.  as noted in a new comment, if event->json is generated, it will contain a pointer to event->payload, which will cause event->payload to be automatically freed at ->payload free time
........
  r8721 | erickson | 2008-02-11 15:37:58 -0500 (Mon, 11 Feb 2008) | 1 line

  augmented parse_and_raise to act as a pass-thru when the provided object is not an event
........
  r8723 | miker | 2008-02-11 15:47:11 -0500 (Mon, 11 Feb 2008) | 1 line

  adde Parse::RecDescent stubbing for future use
........
  r8725 | dbs | 2008-02-11 16:44:51 -0500 (Mon, 11 Feb 2008) | 2 lines

  Complete server/circ/util.js i18n (oh my aching fingers)
........
  r8726 | dbs | 2008-02-11 21:41:11 -0500 (Mon, 11 Feb 2008) | 2 lines

  i18n for the server/main and server/OpenILS directories
........
  r8731 | miker | 2008-02-12 11:13:11 -0500 (Tue, 12 Feb 2008) | 1 line

  arg! typo
........
  r8740 | phasefx | 2008-02-12 23:00:28 -0500 (Tue, 12 Feb 2008) | 1 line

  removing dead code.. Hold Capture interface is a variant of Check In interface
........
  r8741 | dbs | 2008-02-13 11:32:35 -0500 (Wed, 13 Feb 2008) | 2 lines

  Update copyright statement in catalogue footer
........
  r8749 | phasefx | 2008-02-13 23:25:58 -0500 (Wed, 13 Feb 2008) | 1 line

  tweaked wording for Items Out interface to better match reality
........
  r8752 | miker | 2008-02-14 16:39:19 -0500 (Thu, 14 Feb 2008) | 1 line

  in-DB circ matrix models (a couple more to go)
........
  r8755 | erickson | 2008-02-14 21:41:35 -0500 (Thu, 14 Feb 2008) | 1 line

  defaulting selection_ou to the pickup lib instead of home_ou of the recipient
........
  r8759 | miker | 2008-02-15 15:35:53 -0500 (Fri, 15 Feb 2008) | 1 line

  adding test result virtual class and fixing cut-n-paste error
........
  r8760 | miker | 2008-02-15 15:56:40 -0500 (Fri, 15 Feb 2008) | 1 line

  adding hold matrix model data; adding permacrud validation hooks to main xsd
........
  r8761 | phasefx | 2008-02-16 13:15:13 -0500 (Sat, 16 Feb 2008) | 1 line

  Holdings Maintenance interface.  copy_browser.js uses circ/util.js and that needs these properties
........
  r8765 | phasefx | 2008-02-18 16:33:13 -0500 (Mon, 18 Feb 2008) | 1 line

  This method returns 1 or 0. == appears to work whether res equals "1" or 1, is that what we want?
........
  r8766 | phasefx | 2008-02-18 16:41:14 -0500 (Mon, 18 Feb 2008) | 1 line

  This method returns 1 or 0. == appears to work whether res equals "1" or 1, is that what we want?
........
  r8767 | erickson | 2008-02-18 16:55:14 -0500 (Mon, 18 Feb 2008) | 1 line

  returning undef on not-found instead of 0 to prevent id=0 conflicts
........
  r8771 | dbs | 2008-02-19 07:34:58 -0500 (Tue, 19 Feb 2008) | 4 lines

  Add explicit postgresql version dependencies
  Differentiate between Ubuntu Gutsy and Debian Etch postgresql versions
  Update SpiderMonkey version
........
  r8772 | erickson | 2008-02-19 08:54:39 -0500 (Tue, 19 Feb 2008) | 6 lines

  Removing some dead code
  changed (wherever possible) references from objson to the new opensrf/osrf_json.h
  cstore is the last remaining legacy json (objson) client that needs updating
........
  r8788 | erickson | 2008-02-19 18:38:18 -0500 (Tue, 19 Feb 2008) | 1 line

  using explicit namespace in addition to default namespace to account for differences in libxml2 handling
........
  r8794 | dbs | 2008-02-19 23:38:35 -0500 (Tue, 19 Feb 2008) | 2 lines

  French MARC tooltip creator for the cataloging interface
........
  r8798 | dbs | 2008-02-20 10:52:38 -0500 (Wed, 20 Feb 2008) | 3 lines

  Convert entity-ized hyphens back to regular hyphens for easy copy and pasting
  (but escape the second hyphen to avoid "invalid comment" warnings from xsltproc)
........
  r8802 | dbs | 2008-02-20 12:33:33 -0500 (Wed, 20 Feb 2008) | 3 lines

  Update libdbi and libdbi-drivers to 0.8.3 to avoid recent compilation problems on Ubuntu Gutsy
  (Thanks to anarchivist for the heads-up!)
........
  r8808 | miker | 2008-02-21 12:34:28 -0500 (Thu, 21 Feb 2008) | 1 line

  adding authoritative method varients
........
  r8811 | erickson | 2008-02-21 19:09:41 -0500 (Thu, 21 Feb 2008) | 1 line

  added hold permit flag for new holds to prevent max-holds checks on existing holds
........
  r8818 | erickson | 2008-02-22 10:20:05 -0500 (Fri, 22 Feb 2008) | 1 line

  added logic to migrate holds from the deleted records to the master record in title merging
........
  r8820 | erickson | 2008-02-22 10:22:54 -0500 (Fri, 22 Feb 2008) | 1 line

  moved to die_events for in-transaction error handling
........
  r8823 | dbs | 2008-02-22 13:34:56 -0500 (Fri, 22 Feb 2008) | 3 lines

  srfsh wants less, and it's not installed on minimal debian, so let's give it less.
  less is more
........
  r8825 | erickson | 2008-02-22 13:51:26 -0500 (Fri, 22 Feb 2008) | 1 line

  added support for volume-level holds  migration during volume merging
........
  r8829 | dbs | 2008-02-22 19:32:45 -0500 (Fri, 22 Feb 2008) | 2 lines

  Enable custom specified ID to be retained in preprocess subroutine
........
  r8830 | dbs | 2008-02-22 20:34:49 -0500 (Fri, 22 Feb 2008) | 2 lines

  And check for duplicate IDs in the main loop, just like miker asked
........
  r8835 | erickson | 2008-02-26 16:04:19 -0500 (Tue, 26 Feb 2008) | 1 line

  changed error to warning to prevent stderr spewing
........
  r8837 | erickson | 2008-02-26 16:08:02 -0500 (Tue, 26 Feb 2008) | 1 line

  changed the /right/ error to warning to prevent stderr spewing
........
  r8840 | erickson | 2008-02-29 09:08:25 -0500 (Fri, 29 Feb 2008) | 1 line

  checking for xact instead of xact_id to verify session.  at this point in the code, if the editor has not had a reason to create a session yet, xact_id will be undef
........
  r8842 | erickson | 2008-02-29 09:16:22 -0500 (Fri, 29 Feb 2008) | 1 line

  added check for always_xact since xact flag may not be set in authoritative mode
........
  r8844 | miker | 2008-03-01 00:43:04 -0500 (Sat, 01 Mar 2008) | 1 line

  adding initial sru support
........
  r8845 | miker | 2008-03-01 11:13:02 -0500 (Sat, 01 Mar 2008) | 1 line

  moving default grammar to HEREDOC instead of DATA section
........
  r8846 | miker | 2008-03-01 11:31:38 -0500 (Sat, 01 Mar 2008) | 1 line

  adjusting cql qualifier logic
........
  r8847 | miker | 2008-03-01 11:36:54 -0500 (Sat, 01 Mar 2008) | 1 line

  more adjusting of the cql qualifier logic
........
  r8848 | miker | 2008-03-01 11:37:27 -0500 (Sat, 01 Mar 2008) | 1 line

  more adjusting of the cql qualifier logic
........
  r8849 | miker | 2008-03-01 11:41:30 -0500 (Sat, 01 Mar 2008) | 1 line

  use the correct access method for the id list
........
  r8850 | miker | 2008-03-01 11:59:42 -0500 (Sat, 01 Mar 2008) | 1 line

  adding SRU exmple stanza
........
  r8851 | miker | 2008-03-01 14:30:51 -0500 (Sat, 01 Mar 2008) | 1 line

  adding test for SRU perl module in settings tester support script
........
  r8852 | miker | 2008-03-02 23:41:21 -0500 (Sun, 02 Mar 2008) | 1 line

  adding relation modifier support and making relations more strictly follow the cql guidlines
........
  r8853 | miker | 2008-03-02 23:44:33 -0500 (Sun, 02 Mar 2008) | 1 line

  typo
........
  r8854 | miker | 2008-03-03 00:01:59 -0500 (Mon, 03 Mar 2008) | 1 line

  fixing sort and sort_dir in the advanced query syntax
........
  r8855 | miker | 2008-03-03 00:12:04 -0500 (Mon, 03 Mar 2008) | 1 line

  just a space
........
  r8856 | miker | 2008-03-03 18:27:29 -0500 (Mon, 03 Mar 2008) | 1 line

  finally get rid of the diagnostics stuff
........
  r8858 | miker | 2008-03-03 18:45:56 -0500 (Mon, 03 Mar 2008) | 1 line

  remove grouping -- causing some extranious search terms
........
  r8859 | dbs | 2008-03-04 11:01:40 -0500 (Tue, 04 Mar 2008) | 2 lines

  Add SRU to the CPAN dependencies
........
  r8860 | dbs | 2008-03-04 13:09:48 -0500 (Tue, 04 Mar 2008) | 2 lines

  Fix typos (thanks Mark Ellis for pointing these out)
........
  r8863 | erickson | 2008-03-04 15:41:23 -0500 (Tue, 04 Mar 2008) | 1 line

  changed checks and Xs to yes/no to make IE happy. moved thaw date from prompt to form.  added calendar widget to thaw date form.  change UI terminology from freeze/thaw to activate/suspend
........
  r8870 | erickson | 2008-03-05 12:57:12 -0500 (Wed, 05 Mar 2008) | 1 line

  added some circ rules for new circ mods video-mid and dvd-mid
........
  r8871 | erickson | 2008-03-05 17:39:08 -0500 (Wed, 05 Mar 2008) | 1 line

  added a multidomain opensrf_core.xml example.  updated the basic opensrf_core.xml to match opensrf changes (as of opensrf changeset 1253)
........
  r8872 | dbs | 2008-03-05 21:38:03 -0500 (Wed, 05 Mar 2008) | 3 lines

  Whitespace consistency in XML files (plus modelines).
  Bump opensrf.xml.example version to 0.0.3.
........
  r8873 | dbs | 2008-03-05 23:11:30 -0500 (Wed, 05 Mar 2008) | 2 lines

  Remove extraneous <domains> element; otherwise gateway is b0rk3n
........
  r8874 | dbs | 2008-03-06 00:21:02 -0500 (Thu, 06 Mar 2008) | 3 lines

  Make the seed values work with PostgreSQL 8.1 and up...
  (PostgreSQL didn't grok multi-row INSERT statements until 8.2)
........
  r8875 | erickson | 2008-03-06 07:38:01 -0500 (Thu, 06 Mar 2008) | 1 line

  added json::xs to cpan list
........
  r8881 | erickson | 2008-03-06 10:41:21 -0500 (Thu, 06 Mar 2008) | 1 line

  added a common IDL fetching method
........
  r8883 | erickson | 2008-03-06 11:26:58 -0500 (Thu, 06 Mar 2008) | 1 line

  added private client access to public router so error message from the private domain will be handled properly
........
  r8884 | erickson | 2008-03-06 11:31:19 -0500 (Thu, 06 Mar 2008) | 1 line

  fetching IDL from new open-ils idl method.  added a remote_connect option for clients who are not on the private network
........
  r8886 | dbs | 2008-03-06 15:50:21 -0500 (Thu, 06 Mar 2008) | 2 lines

  circStrings, not commonStrings - thanks for finding this one, Bill Ott
........
  r8887 | miker | 2008-03-06 16:03:04 -0500 (Thu, 06 Mar 2008) | 1 line

  v1 of staged search stored procedure(s)
........
  r8888 | miker | 2008-03-06 20:46:42 -0500 (Thu, 06 Mar 2008) | 1 line

  adding alias qualifier to support more than one search class
........
  r8889 | miker | 2008-03-06 20:59:40 -0500 (Thu, 06 Mar 2008) | 1 line

  cut-n-past gotcha
........
  r8890 | miker | 2008-03-06 21:33:47 -0500 (Thu, 06 Mar 2008) | 1 line

  went too far with the aliasing
........
  r8891 | miker | 2008-03-06 21:58:33 -0500 (Thu, 06 Mar 2008) | 1 line

  improve metarecord constituent record test
........
  r8892 | miker | 2008-03-06 23:05:19 -0500 (Thu, 06 Mar 2008) | 1 line

  shiny new search method based on staged search stored proc
........
  r8893 | miker | 2008-03-06 23:13:03 -0500 (Thu, 06 Mar 2008) | 1 line

  explicitly use the JSON module
........
  r8894 | miker | 2008-03-07 10:19:01 -0500 (Fri, 07 Mar 2008) | 1 line

  add preferred language support
........
  r8895 | miker | 2008-03-07 10:40:07 -0500 (Fri, 07 Mar 2008) | 1 line

  adding preferred lang support to the new perl, and adjusting the depth test logic
........
  r8896 | miker | 2008-03-07 10:48:31 -0500 (Fri, 07 Mar 2008) | 1 line

  because Dan understands the importance of proper speeeling
........
  r8897 | miker | 2008-03-07 11:27:16 -0500 (Fri, 07 Mar 2008) | 1 line

  thinkos
........
  r8898 | miker | 2008-03-07 11:29:51 -0500 (Fri, 07 Mar 2008) | 1 line

  typos
........
  r8899 | miker | 2008-03-07 11:48:28 -0500 (Fri, 07 Mar 2008) | 1 line

  typos
........
  r8900 | miker | 2008-03-07 11:51:19 -0500 (Fri, 07 Mar 2008) | 1 line

  typos
........
  r8901 | miker | 2008-03-07 11:54:43 -0500 (Fri, 07 Mar 2008) | 1 line

  remember kids, always execute your prepared queries before fetching from them
........
  r8902 | miker | 2008-03-07 12:15:35 -0500 (Fri, 07 Mar 2008) | 1 line

  trimming the record hashes
........
  r8903 | miker | 2008-03-07 12:18:31 -0500 (Fri, 07 Mar 2008) | 1 line

  actually trimming the record hashes
........
  r8904 | miker | 2008-03-07 13:10:23 -0500 (Fri, 07 Mar 2008) | 1 line

  adding circ_item_list example reporter view; installing staged-search stuff
........
  r8906 | phasefx | 2008-03-07 16:07:15 -0500 (Fri, 07 Mar 2008) | 1 line

  eliminate some redundancy before I try to i18n-ize this
........
  r8909 | phasefx | 2008-03-07 16:44:59 -0500 (Fri, 07 Mar 2008) | 1 line

  Believe these have been replaced by ue.xhtml and family
........
  r8910 | phasefx | 2008-03-07 16:50:08 -0500 (Fri, 07 Mar 2008) | 1 line

  The user perm editor was derived from a previous user editor so there might be some cruft here; for example, take_survey.js
........
  r8911 | phasefx | 2008-03-07 17:34:51 -0500 (Fri, 07 Mar 2008) | 1 line

  bring a little sanity to blank tab labels
........
  r8917 | phasefx | 2008-03-07 22:47:41 -0500 (Fri, 07 Mar 2008) | 1 line

  notify staff if no payments applied or no patron credit added, and do not print receipt. bug #609
........
  r8920 | phasefx | 2008-03-08 02:38:57 -0500 (Sat, 08 Mar 2008) | 1 line

  typos, and working around the fun JSON number/text casting issue
........
  r8921 | phasefx | 2008-03-08 02:40:21 -0500 (Sat, 08 Mar 2008) | 1 line

  some i18n goodness and fixes.  And an extra column for patron lists, and including the last name for staff who collected a payment
........
  r8922 | phasefx | 2008-03-08 02:46:39 -0500 (Sat, 08 Mar 2008) | 1 line

  dead code
........
  r8923 | phasefx | 2008-03-08 02:55:15 -0500 (Sat, 08 Mar 2008) | 1 line

  explicit number casting for JSON results
........
  r8924 | phasefx | 2008-03-08 03:50:59 -0500 (Sat, 08 Mar 2008) | 1 line

  non-cat vs pre-cat labels.  Stop throwing an error dialog if a pre-cat checkout is cancelled
........
  r8925 | phasefx | 2008-03-08 04:02:30 -0500 (Sat, 08 Mar 2008) | 1 line

  Hrmm, global_utils.js gets copied and shared between chrome and remote xul, so not sure what's the best thing to do here for the properties files.  Where do we want the redundancy?  Or can we get rid of it?
........
  r8926 | phasefx | 2008-03-08 04:18:41 -0500 (Sat, 08 Mar 2008) | 1 line

  added a testString binding to messagecat, since z3950.js is generating keys and getString throws an alert when a key is not found
........
  r8927 | phasefx | 2008-03-08 18:57:15 -0500 (Sat, 08 Mar 2008) | 1 line

  this should be quoted
........
  r8928 | phasefx | 2008-03-08 19:20:07 -0500 (Sat, 08 Mar 2008) | 1 line

  layout change for z39.50 client
........
  r8930 | erickson | 2008-03-08 20:03:32 -0500 (Sat, 08 Mar 2008) | 1 line

  initial checkouts-by-circ-mods support
........
  r8931 | phasefx | 2008-03-08 20:12:03 -0500 (Sat, 08 Mar 2008) | 1 line

  working around Number vs String from JSON again.. might be a better way to handle this
........
  r8933 | erickson | 2008-03-08 20:22:02 -0500 (Sat, 08 Mar 2008) | 1 line

  using json true instead of 1
........
  r8936 | miker | 2008-03-09 13:24:11 -0400 (Sun, 09 Mar 2008) | 1 line

  only search where search_field is true
........
  r8942 | miker | 2008-03-09 20:45:35 -0400 (Sun, 09 Mar 2008) | 1 line

  NACO normalization is handy to have around
........
  r8943 | phasefx | 2008-03-09 21:03:32 -0400 (Sun, 09 Mar 2008) | 1 line

  we can't reliably use messagecat with scripts that run before the onload event
........
  r8944 | miker | 2008-03-09 21:06:23 -0400 (Sun, 09 Mar 2008) | 1 line

  some normalization functions for use in in-DB ingest, when it happens
........
  r8948 | erickson | 2008-03-09 22:35:40 -0400 (Sun, 09 Mar 2008) | 1 line

  added initial (basic) staged search support
........
  r8949 | phasefx | 2008-03-09 22:49:04 -0400 (Sun, 09 Mar 2008) | 18 lines

  Switch to .authoritative version of some methods

  We're getting a 404 with these:
  open-ils.search.callnumber.retrieve.authoritative
  open-ils.search.asset.copy.fleshed.batch.retrieve.authoritative
  open-ils.search.biblio.record.copy_count.staff.authoritative
  open-ils.circ.copy_location.retrieve.authoritative
  open-ils.circ.hold.details.retrieve.authoritative
  open-ils.circ.holds.id_list.retrieve.authoritative
  open-ils.circ.open_non_cataloged_circulation.user.authoritative
  open-ils.actor.usergroup.members.retrieve.authoritative
  open-ils.circ.money.billing.retrieve.all.authoritative
  open-ils.circ.money.billable_xact_summary.retrieve.authoritative
  open-ils.circ.money.payment.retrieve.all.authoritative
  open-ils.search.biblio.record.mods_slim.retrieve.authoritative
........
  r8950 | phasefx | 2008-03-09 22:55:21 -0400 (Sun, 09 Mar 2008) | 1 line

  disable .authoritative for these for the time being
........
  r8951 | miker | 2008-03-10 00:04:44 -0400 (Mon, 10 Mar 2008) | 1 line

  making OpenILS::Application the base app so that authoritative works
........
  r8952 | miker | 2008-03-10 00:25:35 -0400 (Mon, 10 Mar 2008) | 18 lines

  Patch from Scott McKellar:

  This patch is mostly a performance tweak.

  1. I replaced all instances of "jsonParseString( "[]" )" with
  "jsonNewObjectType(JSON_ARRAY)", which produces the same result
  with less work.

  2. Likewise I replaced all instances of "jsonParseString( "{}" )"
  with "jsonNewObjectType(JSON_HASH)".

  3. In two spots I eliminated a memset() applied to _tmp_dt, a variable
  of type time_t.

  4. In several calls to strftime() I used the sizeof operator to
  replace hard-coded buffer lengths.
........
  r8953 | miker | 2008-03-10 00:30:59 -0400 (Mon, 10 Mar 2008) | 15 lines

  Patch from Scott McKellar:

  1. The functions _rest_xml_output and _escape_xml are now static, and
  a couple of their parameters are now const.

  2. In json_string_to_xml() we were leaking res_xml in the case of an
  early return.  I moved the early return out of the way.

  3. In _rest_xml_output() we were leaking tag in the case of an early
  return.  I plugged that leak.

  4. In a couple of spots I replaced buffer_data() with buffer_release(),
  and eliminated two intermediate variables that are no longer needed.
........
  r8954 | miker | 2008-03-10 00:34:46 -0400 (Mon, 10 Mar 2008) | 9 lines

  Patch from Scott McKellar:

  In oilsAuthGetTimeout() we make three calls to
  osrf_settings_host_value_object(), which allocates a jsonObject.
  However we were passing the return values directly to another
  function, without capturing the pointers for freeing.  As a result
  we were leaking the jsonObjects thus allocated.
........
  r8955 | miker | 2008-03-10 08:22:53 -0400 (Mon, 10 Mar 2008) | 1 line

  typo and un-PINES-ifying language patch from Karen Collier
........
  r8956 | phasefx | 2008-03-10 11:19:57 -0400 (Mon, 10 Mar 2008) | 1 line

  Flip back to .authoritative version.  Thanks Mike!
........
  r8959 | miker | 2008-03-11 08:26:58 -0400 (Tue, 11 Mar 2008) | 1 line

  initial permacrud application
........
  r8960 | miker | 2008-03-11 08:39:02 -0400 (Tue, 11 Mar 2008) | 1 line

  permacrud for config.metabib_field
........
  r8961 | miker | 2008-03-11 08:52:22 -0400 (Tue, 11 Mar 2008) | 1 line

  all_perms flag and ou-less checking
........
  r8962 | miker | 2008-03-11 08:53:27 -0400 (Tue, 11 Mar 2008) | 1 line

  xsd update for all_perms flag
........
  r8963 | miker | 2008-03-11 08:54:23 -0400 (Tue, 11 Mar 2008) | 1 line

  correction to transit perms
........
  r8964 | erickson | 2008-03-11 11:15:25 -0400 (Tue, 11 Mar 2008) | 1 line

  ported object-specific perm checks from acq-experiment branch to trunk, since it is globally applicable
........
  r8966 | erickson | 2008-03-11 11:46:47 -0400 (Tue, 11 Mar 2008) | 1 line

  added ability to pass an object ID and hint to allowed() for object perm checking
........
  r8967 | miker | 2008-03-11 12:14:17 -0400 (Tue, 11 Mar 2008) | 1 line

  search method
........
  r8968 | miker | 2008-03-11 12:26:45 -0400 (Tue, 11 Mar 2008) | 1 line

  typo; settings-tester update
........
  r8969 | miker | 2008-03-11 12:36:32 -0400 (Tue, 11 Mar 2008) | 1 line

  use the correct context node, duh
........
  r8970 | miker | 2008-03-11 12:49:55 -0400 (Tue, 11 Mar 2008) | 1 line

  generate methods after loading the IDL
........
  r8971 | erickson | 2008-03-11 13:21:35 -0400 (Tue, 11 Mar 2008) | 1 line

  added the permacrud namespace, some log lines for debugging
........
  r8972 | miker | 2008-03-11 13:27:41 -0400 (Tue, 11 Mar 2008) | 1 line

  only test type if we have an object
........
  r8973 | miker | 2008-03-11 13:30:34 -0400 (Tue, 11 Mar 2008) | 1 line

  getAttribute is for elements, not xpath contexts
........
  r8974 | miker | 2008-03-11 14:34:54 -0400 (Tue, 11 Mar 2008) | 1 line

  permacrud search works!
........
  r8975 | miker | 2008-03-11 14:52:51 -0400 (Tue, 11 Mar 2008) | 1 line

  split on pipes, not between every character; also, commit after an update
........
  r8976 | miker | 2008-03-11 14:55:37 -0400 (Tue, 11 Mar 2008) | 1 line

  and return the result of the cstore call
........
  r8977 | miker | 2008-03-11 15:32:53 -0400 (Tue, 11 Mar 2008) | 1 line

  making <context> based orgs work
........
  r8985 | miker | 2008-03-11 21:17:32 -0400 (Tue, 11 Mar 2008) | 1 line

  adding real stylesheet data for mods 2, 3.0 and 3.2; allowing namespace URIs to be non-unique, since MODS reuses the same one
........
  r8986 | miker | 2008-03-12 08:44:43 -0400 (Wed, 12 Mar 2008) | 1 line

  xml_transform class
........
  r8990 | erickson | 2008-03-12 11:39:20 -0400 (Wed, 12 Mar 2008) | 1 line

  changed wording on place-hold-for-me button, moved it farther over to the right.  disbled when any text is in the barcode field
........
  r8991 | erickson | 2008-03-12 11:40:11 -0400 (Wed, 12 Mar 2008) | 1 line

  updated low-hit spellcheck and authority check to honor multi-class search calls
........
  r8993 | erickson | 2008-03-12 12:04:21 -0400 (Wed, 12 Mar 2008) | 1 line

  gave oils_requestor the ability to find the IDL from the settings server based on hostname if none is specified in the path.  passing hostname from the offline-blocked list generator
........
  r8995 | erickson | 2008-03-12 15:16:50 -0400 (Wed, 12 Mar 2008) | 1 line

  repaired bug caused by parsing an empty date.  added some style to the thaw-date form
........
  r8999 | miker | 2008-03-13 01:20:23 -0400 (Thu, 13 Mar 2008) | 1 line

  lots of permacrud definition ... lots to go
........
  r9001 | erickson | 2008-03-13 11:57:51 -0400 (Thu, 13 Mar 2008) | 1 line

  added selection_ou and depth enforcement to hold possibility check for metarecord, title, and volume holds
........
  r9002 | miker | 2008-03-13 12:38:43 -0400 (Thu, 13 Mar 2008) | 1 line

  making old_best tests more explicit
........
  r9004 | erickson | 2008-03-13 14:32:10 -0400 (Thu, 13 Mar 2008) | 1 line

  replaced old-style checkperm call with allowed()
........
  r9007 | erickson | 2008-03-13 21:49:04 -0400 (Thu, 13 Mar 2008) | 1 line

  added basic caching layer for staged search.  still need to do the number juggling to determine real limit/offset values
........
  r9008 | miker | 2008-03-14 09:00:32 -0400 (Fri, 14 Mar 2008) | 1 line

  adding google books view to result pages
........
  r9009 | miker | 2008-03-14 09:28:43 -0400 (Fri, 14 Mar 2008) | 1 line

  thinkos ... it seems to be working now
........
  r9010 | miker | 2008-03-14 09:34:32 -0400 (Fri, 14 Mar 2008) | 1 line

  allow all books in google books to show up, not just previewable ones
........
  r9011 | miker | 2008-03-14 09:35:48 -0400 (Fri, 14 Mar 2008) | 1 line

  correcting comment
........
  r9012 | erickson | 2008-03-14 11:14:41 -0400 (Fri, 14 Mar 2008) | 1 line

  staged search caching and paging
........
  r9013 | erickson | 2008-03-14 11:48:57 -0400 (Fri, 14 Mar 2008) | 1 line

  fixed assumption that available=0 implies no hits, some cleanup
........
  r9014 | miker | 2008-03-14 12:47:52 -0400 (Fri, 14 Mar 2008) | 1 line

  protect against 0 checked
........
  r9015 | phasefx | 2008-03-14 13:37:49 -0400 (Fri, 14 Mar 2008) | 1 line

  this is refactored code, and the environment where it came from had org ids, but I was passing org objects here by mistake in it's new location, so.. flattening the orgs
........
  r9017 | erickson | 2008-03-14 15:03:06 -0400 (Fri, 14 Mar 2008) | 1 line

  stop looking when we have checked all of the possible hits for visibility.  no longer calculating the average estimated hit count.  using the initial estimated hit count
........
  r9018 | miker | 2008-03-14 15:12:38 -0400 (Fri, 14 Mar 2008) | 1 line

  using opac event to fetch the google data once
........
  r9019 | erickson | 2008-03-14 15:22:08 -0400 (Fri, 14 Mar 2008) | 1 line

  removed debugging alert
........
  r9021 | miker | 2008-03-14 16:30:58 -0400 (Fri, 14 Mar 2008) | 1 line

  only using active adjustments
........
  r9022 | miker | 2008-03-14 16:31:23 -0400 (Fri, 14 Mar 2008) | 1 line

  port the slimpac/opensearch to staged search via open-ils.search.biblio.multiclass.query
........
  r9023 | erickson | 2008-03-14 16:32:45 -0400 (Fri, 14 Mar 2008) | 1 line

  output is now backwards compatibable with non-staged api call.  added a config option for turning on staged search
........
  r9024 | miker | 2008-03-14 16:59:28 -0400 (Fri, 14 Mar 2008) | 1 line

  returning the resulting $_ from map
........
  r9025 | erickson | 2008-03-14 17:01:17 -0400 (Fri, 14 Mar 2008) | 1 line

  hiding "end" link with staged search, changed some terminology
........
  r9026 | phasefx | 2008-03-14 17:20:10 -0400 (Fri, 14 Mar 2008) | 1 line

  json number vs string again
........
  r9028 | phasefx | 2008-03-14 17:39:56 -0400 (Fri, 14 Mar 2008) | 1 line

  expose hold freeze/thaw options for staff
........
  r9029 | phasefx | 2008-03-14 17:43:17 -0400 (Fri, 14 Mar 2008) | 1 line

  brain damage.  These are hold focus/range options.. let's keep them hidden until we can tie it to a config option or somesuch
........
  r9030 | miker | 2008-03-14 18:08:14 -0400 (Fri, 14 Mar 2008) | 1 line

  removing some dead code
........
  r9031 | phasefx | 2008-03-14 19:24:52 -0400 (Fri, 14 Mar 2008) | 1 line

  speed up the copy bucket interface a little bit
........
  r9032 | miker | 2008-03-14 21:29:21 -0400 (Fri, 14 Mar 2008) | 1 line

  fixing the slimpac
........
  r9033 | miker | 2008-03-14 23:33:56 -0400 (Fri, 14 Mar 2008) | 1 line

  allow url-based sort/dir to work
........
  r9034 | miker | 2008-03-14 23:50:41 -0400 (Fri, 14 Mar 2008) | 1 line

  minor cleanup; allow numeric OUs
........
  r9035 | miker | 2008-03-14 23:55:18 -0400 (Fri, 14 Mar 2008) | 1 line

  removing relevance span population from metabib search
........
  r9036 | miker | 2008-03-14 23:59:33 -0400 (Fri, 14 Mar 2008) | 1 line

  much more premacrud
........
  r9037 | phasefx | 2008-03-15 00:39:49 -0400 (Sat, 15 Mar 2008) | 1 line

  this was left in from debugging
........
  r9038 | phasefx | 2008-03-15 01:02:31 -0400 (Sat, 15 Mar 2008) | 1 line

  silence some of the debug chatter in the console
........
  r9039 | phasefx | 2008-03-15 01:46:21 -0400 (Sat, 15 Mar 2008) | 1 line

  Sometimes the main window will lose focus and get lowered after clipboard actions... this will make sure the window stays raised (despite the action being called .focus), but we still need to figure out focus
........
  r9040 | phasefx | 2008-03-15 01:46:51 -0400 (Sat, 15 Mar 2008) | 1 line

  tweaks to file picker
........
  r9043 | phasefx | 2008-03-15 01:52:00 -0400 (Sat, 15 Mar 2008) | 1 line

  support empty params for these utility functions
........
  r9045 | phasefx | 2008-03-15 02:52:12 -0400 (Sat, 15 Mar 2008) | 1 line

  more refactoring.. putting all the list CSV functions into list.js
........
  r9046 | phasefx | 2008-03-15 02:53:22 -0400 (Sat, 15 Mar 2008) | 1 line

  interface tweaks: CSV to clipboard, printer, or file
........
  r9047 | miker | 2008-03-15 12:45:21 -0400 (Sat, 15 Mar 2008) | 1 line

  cache the sru query results in the ML
........
  r9048 | miker | 2008-03-16 00:46:29 -0400 (Sun, 16 Mar 2008) | 1 line

  improving relation mapping; adding automatically created explain doc
........
  r9049 | phasefx | 2008-03-16 03:39:04 -0400 (Sun, 16 Mar 2008) | 1 line

  layout and source tweaks
........
  r9050 | phasefx | 2008-03-16 04:43:28 -0400 (Sun, 16 Mar 2008) | 1 line

  new arrow images
........
  r9051 | phasefx | 2008-03-16 04:51:04 -0400 (Sun, 16 Mar 2008) | 1 line

  rethinking record bucket interface
........
  r9052 | phasefx | 2008-03-16 04:55:04 -0400 (Sun, 16 Mar 2008) | 1 line

  dedup Show All in Catalog
........
  r9053 | phasefx | 2008-03-16 04:57:28 -0400 (Sun, 16 Mar 2008) | 1 line

  show last name of bucket owner
........
  r9054 | phasefx | 2008-03-16 05:17:21 -0400 (Sun, 16 Mar 2008) | 1 line

  speed up record bucket display with async flesh on demand
........
  r9055 | phasefx | 2008-03-16 05:30:57 -0400 (Sun, 16 Mar 2008) | 1 line

  bucket item count
........
  r9056 | miker | 2008-03-16 13:58:53 -0400 (Sun, 16 Mar 2008) | 1 line

  Memory leak plugging from Scott McKellar
........
  r9057 | phasefx | 2008-03-16 15:16:04 -0400 (Sun, 16 Mar 2008) | 1 line

  simple search for record bucket interface.. uses an OPAC method that can handle author: title: etc in the search string.  Need to move it to staged search
........
  r9058 | phasefx | 2008-03-16 16:52:06 -0400 (Sun, 16 Mar 2008) | 1 line

  Some focus/label tweaks.  And a help button point to an html file.  Dan and I need to revisit this and come up with a best practice and infrastructure
........
  r9059 | dbs | 2008-03-16 21:16:09 -0400 (Sun, 16 Mar 2008) | 2 lines

  Clean up illegal trailing commas in object initializers
........
  r9061 | dbs | 2008-03-16 22:31:52 -0400 (Sun, 16 Mar 2008) | 4 lines

  Use a table to map search keys to their definitions
  Add some semantic markup (kbd, yeah)
  Use XHTML because we're hep cats
........
  r9065 | miker | 2008-03-18 00:02:21 -0400 (Tue, 18 Mar 2008) | 1 line

  actually test for transcendance, not just for a source
........
  r9067 | erickson | 2008-03-18 09:46:17 -0400 (Tue, 18 Mar 2008) | 1 line

  added search filters and sorting to metarecord results page
........
  r9069 | erickson | 2008-03-18 10:25:49 -0400 (Tue, 18 Mar 2008) | 1 line

  added config option for defining the downloaded record format for each Z source
........
  r9071 | erickson | 2008-03-18 12:13:55 -0400 (Tue, 18 Mar 2008) | 1 line

  implemented hard hold ceilings and basis for soft ceilings
........
  r9073 | erickson | 2008-03-18 12:35:05 -0400 (Tue, 18 Mar 2008) | 1 line

  implemented soft hold ceilings
........
  r9076 | erickson | 2008-03-18 22:27:13 -0400 (Tue, 18 Mar 2008) | 1 line

  ported user prefs call to cstoreEditor, with finer grained perm checking
........
  r9077 | erickson | 2008-03-18 22:27:16 -0400 (Tue, 18 Mar 2008) | 1 line

  fixed typo and repaired boolean test (to be safe) in opac init to enforce user depth preference setting
........
  r9079 | erickson | 2008-03-19 09:46:25 -0400 (Wed, 19 Mar 2008) | 1 line

  ported org-settings update code to cstoreEditor
........
  r9081 | erickson | 2008-03-19 09:53:19 -0400 (Wed, 19 Mar 2008) | 1 line

  coercing setting values that are pure space to nulls
........
  r9082 | phasefx | 2008-03-19 11:34:49 -0400 (Wed, 19 Mar 2008) | 1 line

  make the authority pop-ups more readable
........
  r9085 | erickson | 2008-03-19 11:51:51 -0400 (Wed, 19 Mar 2008) | 1 line

  changed terminology (ceiling to boundary) for clarity.  updated logic to try soft boundary first if it is greater then hard boundary, up to the hard boundary
........
  r9086 | miker | 2008-03-19 12:31:02 -0400 (Wed, 19 Mar 2008) | 1 line

  add the ability to turn off forced-https
........
  r9088 | erickson | 2008-03-19 15:28:14 -0400 (Wed, 19 Mar 2008) | 1 line

  moved PREFIX def to top
........
  r9092 | miker | 2008-03-19 21:40:07 -0400 (Wed, 19 Mar 2008) | 1 line

  fixing the freshmeat feed link; moving to rss v2 from atom for feeds, to make feed readers happier
........
  r9094 | miker | 2008-03-19 22:50:12 -0400 (Wed, 19 Mar 2008) | 1 line

  adding extra staff checks for record visibility
........
  r9099 | erickson | 2008-03-20 08:09:52 -0400 (Thu, 20 Mar 2008) | 1 line

  removed old comment.  removed unnucessary grep call
........
  r9102 | erickson | 2008-03-20 09:46:47 -0400 (Thu, 20 Mar 2008) | 1 line

  added some timing logs
........
  r9104 | miker | 2008-03-21 00:06:34 -0400 (Fri, 21 Mar 2008) | 1 line

  remove fleshing capabilities inside permacrud -- may reimplement in a cruddy fashsion later
........
  r9108 | erickson | 2008-03-21 15:24:22 -0400 (Fri, 21 Mar 2008) | 1 line

  protecting against undefined copy array
........
  r9111 | dbs | 2008-03-23 21:49:14 -0400 (Sun, 23 Mar 2008) | 2 lines

  Localization for offline transaction management
........
  r9112 | dbs | 2008-03-23 21:57:09 -0400 (Sun, 23 Mar 2008) | 2 lines

  Missed a few strings in offline transaction management
........
  r9113 | miker | 2008-03-23 22:38:06 -0400 (Sun, 23 Mar 2008) | 1 line

  protect against null params to transforms in SQL
........
  r9114 | miker | 2008-03-23 23:24:02 -0400 (Sun, 23 Mar 2008) | 1 line

  move the default proxy html into a heredoc
........
  r9115 | miker | 2008-03-23 23:25:57 -0400 (Sun, 23 Mar 2008) | 1 line

  arg! typo
........
  r9116 | dbs | 2008-03-23 23:33:30 -0400 (Sun, 23 Mar 2008) | 2 lines

  Move some more hardcoded strings to i18n.
........
  r9119 | miker | 2008-03-24 00:42:43 -0400 (Mon, 24 Mar 2008) | 1 line

  removing unused (and broken) code
........
  r9121 | dbs | 2008-03-24 10:33:48 -0400 (Mon, 24 Mar 2008) | 3 lines

  Tooltips now contain field names, thanks to miker's fancy XSL
  Now we can expose these in the cataloging interface
........
  r9122 | dbs | 2008-03-24 11:41:09 -0400 (Mon, 24 Mar 2008) | 3 lines

  Generate <name> fields just like miker's fancy XSL for LoC MARC
  Normalize linefeeds to be consistent with marcedit-tooltips.xml
........
  r9123 | miker | 2008-03-24 13:47:25 -0400 (Mon, 24 Mar 2008) | 1 line

  add timezone info to times -- only used currently for hours of operation
........
  r9124 | miker | 2008-03-24 13:59:52 -0400 (Mon, 24 Mar 2008) | 1 line

  add timezone info to times -- only used currently for hours of operation
........
  r9125 | miker | 2008-03-24 14:24:52 -0400 (Mon, 24 Mar 2008) | 1 line

  use gmtime for time-only calc
........
  r9127 | erickson | 2008-03-24 15:58:02 -0400 (Mon, 24 Mar 2008) | 1 line

  trimming null entries from end of results array
........
  r9129 | dbs | 2008-03-24 16:38:59 -0400 (Mon, 24 Mar 2008) | 4 lines

  Make MARC editor tooltips localized resources
  Add fr-CA version of MARC editor tooltips (thanks to Library and Archives Canada for the permission to use their translation)
  Need to fix the dang locale preference lookup; we're just going with the default for now
........
  r9130 | dbs | 2008-03-24 20:05:26 -0400 (Mon, 24 Mar 2008) | 3 lines

  Hmm. xulplanet.com appears to have better xul docs than mozilla.org
  Basic locale preferences for MARC editor tooltips are now working
........
  r9131 | dbs | 2008-03-24 20:57:25 -0400 (Mon, 24 Mar 2008) | 2 lines

  i18n for bib_brief.xul
........
  r9132 | dbs | 2008-03-24 21:18:41 -0400 (Mon, 24 Mar 2008) | 2 lines

  Duplicate IDs do not work for message catalogs
........
  r9133 | dbs | 2008-03-24 23:22:42 -0400 (Mon, 24 Mar 2008) | 3 lines

  Start bringing i18n to the copy browser.
  Repair a typo in bib_brief.xul
........
  r9137 | dbs | 2008-03-25 23:28:32 -0400 (Tue, 25 Mar 2008) | 2 lines

  Knock off a few more strings for i18n
........
  r9140 | dbs | 2008-03-26 21:35:47 -0400 (Wed, 26 Mar 2008) | 2 lines

  Default to staged search (and avoid complaints in the logs about no value for use_staged_search)
........
  r9141 | miker | 2008-03-26 22:29:20 -0400 (Wed, 26 Mar 2008) | 1 line

  adding org types to permacrud
........
  r9142 | miker | 2008-03-26 23:52:16 -0400 (Wed, 26 Mar 2008) | 5 lines

  The advanced query syntax parser here was cribbed from the original implemenation inside the OpenSearch server.  mod_perl, due to being too clever by half, required a call to decode_utf8 to shove raw octets into the correct shape.  Becuase the data coming to this implementation comes from opensrf, which is unicode end-to-end via JSON, it's somebody else's job to make sure the characters are properly encoded, and once they get to us they're already proper UTF-8 character strings.  Thus, no need for (and things broken by) the call to decode_utf8.

  Why is that explanation so long?  So that we don't do it again ... :)
........
  r9144 | miker | 2008-03-27 00:17:10 -0400 (Thu, 27 Mar 2008) | 1 line

  escape regexp-special characters
........
  r9145 | miker | 2008-03-27 00:33:59 -0400 (Thu, 27 Mar 2008) | 1 line

  use POSIX regexp operator instead of ILIKE
........
  r9146 | miker | 2008-03-27 00:36:16 -0400 (Thu, 27 Mar 2008) | 1 line

  comment out the debuging NOTICE
........
  r9148 | miker | 2008-03-27 01:25:29 -0400 (Thu, 27 Mar 2008) | 1 line

  adding org_unit retrieve checks
........
  r9149 | miker | 2008-03-27 01:26:22 -0400 (Thu, 27 Mar 2008) | 1 line

  procting permacrud search from failed retrieve
........
  r9150 | miker | 2008-03-27 02:15:43 -0400 (Thu, 27 Mar 2008) | 1 line

  adding "at least one, please!" check to org types
........
  r9152 | miker | 2008-03-27 21:01:40 -0400 (Thu, 27 Mar 2008) | 1 line

  adding permission group tree to permacrud
........
  r9159 | miker | 2008-03-29 00:21:56 -0400 (Sat, 29 Mar 2008) | 1 line

  add cross-checks for perm creation; add perm assignment checks
........
  r9165 | erickson | 2008-03-30 20:55:27 -0400 (Sun, 30 Mar 2008) | 1 line

  added new ip range
........
  r9166 | erickson | 2008-03-31 16:51:39 -0400 (Mon, 31 Mar 2008) | 1 line

  added new freezethaw dep
........
  r9175 | erickson | 2008-04-01 10:25:05 -0400 (Tue, 01 Apr 2008) | 1 line

  added style to indicate a hold thaw date is either invalid or <= today
........
  r9177 | erickson | 2008-04-01 11:29:45 -0400 (Tue, 01 Apr 2008) | 1 line

  no longer allowing hold updates when date is invalid or <= today
........
  r9180 | erickson | 2008-04-01 12:24:16 -0400 (Tue, 01 Apr 2008) | 1 line

  little more fine tuning of the thaw date handling; fixed post-create edit bug for thaw dates
........
  r9186 | dbs | 2008-04-01 21:19:36 -0400 (Tue, 01 Apr 2008) | 2 lines

  Add non-default refresh of org_tree proximity, per 2008/02/28 discussion on open-ils-dev
........
  r9187 | dbs | 2008-04-01 21:24:06 -0400 (Tue, 01 Apr 2008) | 2 lines

  We need to install the new org_tree proximity script if we're going to use it
........
  r9191 | phasefx | 2008-04-02 13:04:36 -0400 (Wed, 02 Apr 2008) | 1 line

  Change some of the wording for hold freeze/thaw.  Need to rethink fancy_prompt in light of i18n (maybe do away with it), so there are some lingering uses of freeze/thaw in the staff client
........
  r9192 | miker | 2008-04-02 13:07:25 -0400 (Wed, 02 Apr 2008) | 1 line

  get the text value, then transform
........
  r9193 | phasefx | 2008-04-02 13:35:56 -0400 (Wed, 02 Apr 2008) | 1 line

  Fix the Macros button for all template types.  Remove a + + from some string concatenation that was putting NaN in the display
........
  r9195 | phasefx | 2008-04-02 14:17:02 -0400 (Wed, 02 Apr 2008) | 1 line

  typo in properties name
........
  r9196 | phasefx | 2008-04-02 14:26:56 -0400 (Wed, 02 Apr 2008) | 1 line

  some of the column definitions in the copy browser use circStrings
........
  r9198 | erickson | 2008-04-02 15:52:09 -0400 (Wed, 02 Apr 2008) | 1 line

  using boolean test wrapper function
........
  r9200 | erickson | 2008-04-02 16:02:31 -0400 (Wed, 02 Apr 2008) | 1 line

  added logic to run the hold targeter if a hold is un-frozen by the user
........
  r9203 | dbs | 2008-04-02 22:22:15 -0400 (Wed, 02 Apr 2008) | 2 lines

  First cut at automated checks for problems with i18n string properties
........
  r9204 | dbs | 2008-04-02 22:27:41 -0400 (Wed, 02 Apr 2008) | 2 lines

  Correct problems found by check_properties.py
........
  r9206 | phasefx | 2008-04-03 01:06:57 -0400 (Thu, 03 Apr 2008) | 1 line

  fill in the missing entities between these two lang.dtd files.  Will the POTS stuff do this for us Dan?
........
  r9207 | dbs | 2008-04-03 10:10:22 -0400 (Thu, 03 Apr 2008) | 2 lines

  C&P error in internal instructions; might as well make'em right
........
  r9208 | phasefx | 2008-04-03 12:57:43 -0400 (Thu, 03 Apr 2008) | 1 line

  some entities for hold interfaces
........
  r9209 | phasefx | 2008-04-03 13:41:49 -0400 (Thu, 03 Apr 2008) | 1 line

  some i18n, fewer steps for freezing/thawing holds, and disabling editing of hold range/focus through css.  Needs more testing
........
  r9210 | erickson | 2008-04-03 14:01:36 -0400 (Thu, 03 Apr 2008) | 1 line

  merge error, forgot to pass orig_hold
........
  r9212 | miker | 2008-04-03 20:43:23 -0400 (Thu, 03 Apr 2008) | 1 line

  use a safer test for bool grantable flag
........
  r9213 | miker | 2008-04-03 22:11:04 -0400 (Thu, 03 Apr 2008) | 1 line

  adding backend support for system-supplied "search groups" -- user search groups to come later
........
  r9214 | miker | 2008-04-03 22:23:13 -0400 (Thu, 03 Apr 2008) | 1 line

  make the row unique
........
  r9215 | dbs | 2008-04-03 22:51:54 -0400 (Thu, 03 Apr 2008) | 2 lines

  Trivial - ensure "Done" gets placed on its own line.
........
  r9216 | phasefx | 2008-04-03 23:41:02 -0400 (Thu, 03 Apr 2008) | 1 line

  prevent duplicate rows in patron holds interface
........
  r9217 | miker | 2008-04-03 23:56:23 -0400 (Thu, 03 Apr 2008) | 1 line

  adding bib_level filter support
........
  r9219 | miker | 2008-04-04 00:36:51 -0400 (Fri, 04 Apr 2008) | 1 line

  adding lasso support to copy count calls
........
  r9220 | miker | 2008-04-04 00:44:47 -0400 (Fri, 04 Apr 2008) | 1 line

  adding base-line copy counting for lasso groups
........
  r9221 | phasefx | 2008-04-04 00:57:59 -0400 (Fri, 04 Apr 2008) | 1 line

  more i18n, prevent hold activation date from being set to Today, and auto-suspend holds when activation date is set
........
  r9222 | miker | 2008-04-04 07:58:26 -0400 (Fri, 04 Apr 2008) | 1 line

  adding lasso data support for use by the OPAC
........
  r9223 | miker | 2008-04-04 08:06:52 -0400 (Fri, 04 Apr 2008) | 1 line

  use the fieldmapper objects ...
........
  r9225 | erickson | 2008-04-04 09:17:13 -0400 (Fri, 04 Apr 2008) | 1 line

  patch from Brandon to avoid showing opac-invisible stat cats in public display: http://list.georgialibraries.org/pipermail/open-ils-dev/2008-March/002731.html
........
  r9226 | phasefx | 2008-04-04 10:48:17 -0400 (Fri, 04 Apr 2008) | 1 line

  Forward-port a disallow for editing pickup lib for intransit holds.  This may eventually need to become configurable based on policy, in which case we will need to handle the transits involved
........
  r9228 | miker | 2008-04-04 11:07:36 -0400 (Fri, 04 Apr 2008) | 1 line

  adding bib_level mapping table
........
  r9229 | miker | 2008-04-04 11:30:43 -0400 (Fri, 04 Apr 2008) | 1 line

  adding bib_level filter to the advanced search
........
  r9232 | miker | 2008-04-04 14:53:01 -0400 (Fri, 04 Apr 2008) | 1 line

  begin exposing lassos in the OPAC
........
  r9233 | miker | 2008-04-04 16:32:28 -0400 (Fri, 04 Apr 2008) | 1 line

  trying to move towards lassos
........
  r9234 | miker | 2008-04-04 17:18:09 -0400 (Fri, 04 Apr 2008) | 1 line

  copy counts come back, but must be interpreted differently
........
  r9235 | miker | 2008-04-04 17:18:48 -0400 (Fri, 04 Apr 2008) | 1 line

  copy counts come back, but must be interpreted differently
........
  r9236 | miker | 2008-04-05 07:44:42 -0400 (Sat, 05 Apr 2008) | 1 line

  display the lasso name when appropriate
........
  r9241 | miker | 2008-04-06 22:28:05 -0400 (Sun, 06 Apr 2008) | 1 line

  display consolidated copy counts on the result page, and hide the ou_type header bar
........
  r9243 | miker | 2008-04-07 10:25:02 -0400 (Mon, 07 Apr 2008) | 1 line

  adding "first5" function to trim zip codes
........
  r9245 | miker | 2008-04-07 10:57:20 -0400 (Mon, 07 Apr 2008) | 1 line

  add "first word" support -- use for callnumber prefix
........
  r9247 | phasefx | 2008-04-07 12:27:53 -0400 (Mon, 07 Apr 2008) | 1 line

  prevent the viewing of foreign non-cats from polluting local non-cat dropdown lists
........
  r9248 | miker | 2008-04-07 12:31:39 -0400 (Mon, 07 Apr 2008) | 1 line

  set some sequences after insertion
........
  r9253 | erickson | 2008-04-07 13:27:16 -0400 (Mon, 07 Apr 2008) | 1 line

  repaired close tag
........
  r9255 | erickson | 2008-04-07 13:52:23 -0400 (Mon, 07 Apr 2008) | 1 line

  returning home org in AQ field for patron info requests.  Thanks for the SIP support, David
........
  r9256 | miker | 2008-04-07 13:52:28 -0400 (Mon, 07 Apr 2008) | 1 line

  adding cross-check perms to "ccs"
........
  r9259 | dbs | 2008-04-07 20:42:32 -0400 (Mon, 07 Apr 2008) | 2 lines

  When you hit an error, you want to see the entire error message
........
  r9260 | dbs | 2008-04-07 21:11:35 -0400 (Mon, 07 Apr 2008) | 2 lines

  Back on that i18n horse
........
  r9261 | dbs | 2008-04-07 22:38:32 -0400 (Mon, 07 Apr 2008) | 2 lines

  Bring copy_browser.xul to the i18n party
........
  r9266 | dbs | 2008-04-08 11:06:30 -0400 (Tue, 08 Apr 2008) | 2 lines

  i18n for copy_buckets.js and copy_buckets.xul
........
  r9269 | dbs | 2008-04-08 12:46:43 -0400 (Tue, 08 Apr 2008) | 2 lines

  Missing formatting flag for a common error message.
........
  r9270 | dbs | 2008-04-08 12:52:54 -0400 (Tue, 08 Apr 2008) | 2 lines

  Finish the copy_buckets i18n.
........
  r9272 | dbs | 2008-04-08 17:18:36 -0400 (Tue, 08 Apr 2008) | 2 lines

  25% of the way through i18n of copy_editor.js
........
  r9276 | dbs | 2008-04-08 21:29:35 -0400 (Tue, 08 Apr 2008) | 2 lines

  Finish i18n for the easy part of copy_editor.js
........
  r9279 | dbs | 2008-04-08 22:33:09 -0400 (Tue, 08 Apr 2008) | 2 lines

  i18n for the strings in the copy_editor.xul
........
  r9288 | phasefx | 2008-04-09 22:17:26 -0400 (Wed, 09 Apr 2008) | 1 line

  protect against empty list items
........
  r9289 | dbs | 2008-04-09 22:18:34 -0400 (Wed, 09 Apr 2008) | 2 lines

  i18n for copy_notes.xul
........
  r9291 | dbs | 2008-04-10 09:12:17 -0400 (Thu, 10 Apr 2008) | 2 lines

  Probably need to define our message catalogs
........
  r9292 | dbs | 2008-04-10 09:12:49 -0400 (Thu, 10 Apr 2008) | 2 lines

  i18n for copy_summary
........
  r9293 | dbs | 2008-04-10 09:59:09 -0400 (Thu, 10 Apr 2008) | 2 lines

  Initial stab at marcedit i18n
........
  r9294 | dbs | 2008-04-10 10:42:17 -0400 (Thu, 10 Apr 2008) | 2 lines

  Make our i18n messagecatalog strings work (need global.css for binding xbl)
........
  r9295 | dbs | 2008-04-10 12:11:11 -0400 (Thu, 10 Apr 2008) | 2 lines

  Syntax errors in copy_editor.js
........
  r9300 | miker | 2008-04-10 21:15:37 -0400 (Thu, 10 Apr 2008) | 1 line

  adding permacrud app to the example config
........
  r9304 | miker | 2008-04-10 21:59:08 -0400 (Thu, 10 Apr 2008) | 1 line

  copyright header
........
  r9309 | miker | 2008-04-10 23:45:49 -0400 (Thu, 10 Apr 2008) | 1 line

  merging admin interface from the dojo-admin branch
........
  r9310 | miker | 2008-04-10 23:50:01 -0400 (Thu, 10 Apr 2008) | 1 line

  merging dojo-ified fieldmapper from the dojo-admin branch
........
  r9311 | dbs | 2008-04-11 11:37:25 -0400 (Fri, 11 Apr 2008) | 2 lines

  python-dev is required to build OpenSRF python packages
........
  r9312 | miker | 2008-04-11 11:44:56 -0400 (Fri, 11 Apr 2008) | 7 lines

  Patch from Scott McKellar:

  These patches use the new function osrfHashIteratorKey() to fetch
  the current key from an osrfHashIterator, instead of accessing it
  directly.
........
  r9313 | dbs | 2008-04-11 12:52:46 -0400 (Fri, 11 Apr 2008) | 2 lines

  web/js/opensrf directory has to exist before we can install into it
........
  r9314 | erickson | 2008-04-11 14:14:13 -0400 (Fri, 11 Apr 2008) | 1 line

  putting OpenSRF.js into the dojo dir so dojo can find it
........
  r9318 | miker | 2008-04-11 22:49:38 -0400 (Fri, 11 Apr 2008) | 1 line

  Patch from Scott McKellar to use new osrfHash iterator key function
........
  r9319 | phasefx | 2008-04-12 12:15:34 -0400 (Sat, 12 Apr 2008) | 1 line

  differentiate entities for editing items and editing volumes
........
  r9320 | phasefx | 2008-04-12 12:47:55 -0400 (Sat, 12 Apr 2008) | 1 line

  oy, extraneous quotation mark
........
  r9321 | erickson | 2008-04-13 08:32:26 -0400 (Sun, 13 Apr 2008) | 1 line

  initial credit card and paypal processing code.  this still needs some refactoring to accomodate the staff and patron workflows.
........
  r9322 | erickson | 2008-04-13 08:32:54 -0400 (Sun, 13 Apr 2008) | 1 line

  added prereqs for credit card processing
........
  r9323 | erickson | 2008-04-13 09:07:53 -0400 (Sun, 13 Apr 2008) | 1 line

  added initial Event handling code
........
  r9325 | erickson | 2008-04-13 11:51:04 -0400 (Sun, 13 Apr 2008) | 1 line

  user and auth session management class
........
  r9327 | dbs | 2008-04-13 14:17:49 -0400 (Sun, 13 Apr 2008) | 9 lines

  At various points in opac_utils.js, there are calls to doLogout() (no parms).
  However, Firefox complains that doLogout() is not defined.

  The only defined function is doLogout(noredirect) (one parm).

  As I can't find any instances of doLogout being called with a parameter,
  and I can't see noredirect being used anywhere in the function, the
  simplest patch appears to be to just remove the parameter from the prototype.
........
  r9328 | dbs | 2008-04-13 14:23:17 -0400 (Sun, 13 Apr 2008) | 2 lines

  dbi_get_result_long is deprecated; using dbi_get_result_int instead
........
  r9329 | dbs | 2008-04-13 19:46:53 -0400 (Sun, 13 Apr 2008) | 2 lines

  Clean up the problems I introduced during i18n-ization
........
  r9330 | dbs | 2008-04-13 20:13:53 -0400 (Sun, 13 Apr 2008) | 3 lines

  Fix problems introduced during i18n-ization
  (JavaScript strings don't span multiple lines by default)
........
  r9333 | erickson | 2008-04-13 22:52:50 -0400 (Sun, 13 Apr 2008) | 1 line

  added function to get the highest org list for a given permission
........
  r9334 | miker | 2008-04-14 08:29:49 -0400 (Mon, 14 Apr 2008) | 1 line

  add support for async calls via an async kwarg
........
  r9335 | miker | 2008-04-14 09:16:42 -0400 (Mon, 14 Apr 2008) | 1 line

  adding open-ils.fielder app
........
  r9336 | miker | 2008-04-14 09:24:05 -0400 (Mon, 14 Apr 2008) | 1 line

  better name for the method
........
  r9338 | miker | 2008-04-14 09:32:00 -0400 (Mon, 14 Apr 2008) | 1 line

  logging and simpler method call
........
  r9339 | erickson | 2008-04-14 09:32:05 -0400 (Mon, 14 Apr 2008) | 1 line

  augmented the org descendants retrieval method to take an optional list of orgs
........
  r9340 | miker | 2008-04-14 09:51:53 -0400 (Mon, 14 Apr 2008) | 1 line

  editor returns an array
........
  r9342 | erickson | 2008-04-14 10:04:47 -0400 (Mon, 14 Apr 2008) | 1 line

  added a parallel method for perm_org_set which returns the sub-tree for each of the perm orgs
........
  r9343 | miker | 2008-04-14 11:22:58 -0400 (Mon, 14 Apr 2008) | 1 line

  add new permacrud permissions to the base set
........
  r9345 | erickson | 2008-04-14 13:38:59 -0400 (Mon, 14 Apr 2008) | 1 line

  added versions of work perm org fetcher to return flat list of all org units or org IDs.  if no depth is provided to get_org_depth, do not default to 0
........
  r9347 | erickson | 2008-04-14 13:57:25 -0400 (Mon, 14 Apr 2008) | 1 line

  fixed method name typo
........
  r9349 | erickson | 2008-04-14 14:29:35 -0400 (Mon, 14 Apr 2008) | 1 line

  org_unit_list and org_id_list now return sub-lists, segregated by branches of the org tree.  the first item in each list is the highest perm or for that branch of the tree
........
  r9350 | miker | 2008-04-14 14:39:08 -0400 (Mon, 14 Apr 2008) | 1 line

  moving seed data out of the schema files
........
  r9352 | erickson | 2008-04-14 15:03:36 -0400 (Mon, 14 Apr 2008) | 1 line

  rolling back segregation by branch.. if that kind of pre-sorting is needed, just grab the tree
........
  r9353 | erickson | 2008-04-14 16:21:49 -0400 (Mon, 14 Apr 2008) | 1 line

  added a synchronous option to user session fetching
........
  r9354 | erickson | 2008-04-14 16:22:14 -0400 (Mon, 14 Apr 2008) | 1 line

  checking to make sure the potential event is actually an object before using the "in" operator
........
  r9356 | dbs | 2008-04-14 20:23:18 -0400 (Mon, 14 Apr 2008) | 3 lines

  i18n for the MARC editor
  Note that marcedit.js doesn't like messagecatalog calls for some reason
........
  r9357 | dbs | 2008-04-14 21:37:00 -0400 (Mon, 14 Apr 2008) | 2 lines

  Typo
........
  r9358 | dbs | 2008-04-14 22:42:21 -0400 (Mon, 14 Apr 2008) | 3 lines

  Move inline calls into my_init(); messagecatalog isn't visible until after onload event
  Thanks to phasefx and miker for the assist!
........
  r9359 | miker | 2008-04-15 07:59:51 -0400 (Tue, 15 Apr 2008) | 1 line

  dojo.require OpenSRF, since we use it herein.  it will only be loaded if it has not been before
........
  r9360 | dbs | 2008-04-15 08:18:51 -0400 (Tue, 15 Apr 2008) | 2 lines

  marc_view i18n
........
  r9362 | miker | 2008-04-15 12:02:42 -0400 (Tue, 15 Apr 2008) | 1 line

  updating dewey extractor
........
  r9363 | miker | 2008-04-15 12:42:11 -0400 (Tue, 15 Apr 2008) | 1 line

  default to pulling all fields from field_safe classes
........
  r9364 | miker | 2008-04-15 13:09:40 -0400 (Tue, 15 Apr 2008) | 1 line

  fixing fielder with no fields
........
  r9365 | miker | 2008-04-15 13:17:22 -0400 (Tue, 15 Apr 2008) | 1 line

  getting perl fieldmapper class name from idl
........
  r9366 | miker | 2008-04-15 20:50:26 -0400 (Tue, 15 Apr 2008) | 1 line

  backend i18n dojo wrapper
........
  r9367 | miker | 2008-04-15 20:50:56 -0400 (Tue, 15 Apr 2008) | 1 line

  default error handler typo
........
  r9368 | dbs | 2008-04-15 21:38:49 -0400 (Tue, 15 Apr 2008) | 3 lines

  And so it is done. OpenSRF.js has been renamed to DojoSRF.js.
  Case-insensitive platforms of the world, rejoice.
........
  r9369 | miker | 2008-04-16 13:48:34 -0400 (Wed, 16 Apr 2008) | 1 line

  arg! typo
........
  r9370 | miker | 2008-04-17 01:21:21 -0400 (Thu, 17 Apr 2008) | 1 line

  in-db translation Digit widget
........
  r9371 | miker | 2008-04-17 01:28:05 -0400 (Thu, 17 Apr 2008) | 1 line

  pull in my own requirements
........
  r9372 | miker | 2008-04-17 14:04:26 -0400 (Thu, 17 Apr 2008) | 1 line

  use the class hint for the fully qualified field name, instead of the table (which is not always available)
........
  r9373 | miker | 2008-04-17 14:54:50 -0400 (Thu, 17 Apr 2008) | 1 line

  locale parsing based on URL knowledge (because apache is not helping); aou.name translation support
........
  r9374 | miker | 2008-04-17 15:21:56 -0400 (Thu, 17 Apr 2008) | 1 line

  move locale parsing out to a separate javascript file; translations of group names and descriptions
........
  r9375 | miker | 2008-04-18 01:12:11 -0400 (Fri, 18 Apr 2008) | 1 line

  dojo-ify fmall.js
........
  r9376 | miker | 2008-04-18 01:14:48 -0400 (Fri, 18 Apr 2008) | 1 line

  refactoring the translation widget some more -- happier with grids now, only slightly painful
........
  r9377 | miker | 2008-04-18 01:15:51 -0400 (Fri, 18 Apr 2008) | 1 line

  put the translation widget into the status grid
........
  r9378 | miker | 2008-04-18 01:16:33 -0400 (Fri, 18 Apr 2008) | 1 line

  load fmall.js via dojo in fieldmapper.Fieldmapper
........
  r9379 | miker | 2008-04-18 10:08:31 -0400 (Fri, 18 Apr 2008) | 1 line

  adding Identifier to fieldmapper classes
........
  r9380 | miker | 2008-04-18 10:17:37 -0400 (Fri, 18 Apr 2008) | 1 line

  typo in identifier setting
........

git-svn-id: svn://svn.open-ils.org/ILS/branches/acq-experiment@9385 dcc99617-32d9-48b4-a31d-7c20da2025e4

334 files changed:
Evergreen/conf/lib_ips.txt
Evergreen/src/extras/import/import_holdings.pl
Evergreen/src/extras/import/quick_metarecord_map.sql
Evergreen/src/javascript/backend/circ/circ_item_config.js
Evergreen/src/javascript/backend/circ/circ_permit_hold.js
Evergreen/xul/staff_client/server/patron/ue_config.js
Open-ILS/admin/ils_admin/setup/ils_data/models.py
Open-ILS/examples/apache/eg_vhost.conf
Open-ILS/examples/fm_IDL.xml
Open-ILS/examples/oils_sip.xml.example
Open-ILS/examples/opensrf.xml.example
Open-ILS/examples/opensrf_core.xml.example
Open-ILS/examples/opensrf_core.xml.example.multidomain [new file with mode: 0644]
Open-ILS/examples/permacrud.xsd
Open-ILS/src/Makefile
Open-ILS/src/apachemods/json_xml.c
Open-ILS/src/apachemods/json_xml.h
Open-ILS/src/apachemods/mod_rest_gateway.c [deleted file]
Open-ILS/src/apachemods/mod_rest_gateway.h [deleted file]
Open-ILS/src/apachemods/mod_xmlbuilder.c [deleted file]
Open-ILS/src/c-apps/Makefile
Open-ILS/src/c-apps/oils_auth.c
Open-ILS/src/c-apps/oils_cstore.c
Open-ILS/src/c-apps/oils_event.c
Open-ILS/src/c-apps/oils_fetch.c [deleted file]
Open-ILS/src/c-apps/oils_idl-core.c
Open-ILS/src/cgi-bin/lib-setup.cgi
Open-ILS/src/extras/Makefile.install
Open-ILS/src/extras/autogen.sh
Open-ILS/src/extras/ils_events.xml
Open-ILS/src/extras/import/build-oils-db.sh
Open-ILS/src/extras/import/marc2bre.pl
Open-ILS/src/extras/oils_requestor.c
Open-ILS/src/extras/org_lasso_js.pl [new file with mode: 0644]
Open-ILS/src/extras/org_tree_js.pl
Open-ILS/src/extras/org_tree_proximity.pl [new file with mode: 0644]
Open-ILS/src/javascript/backend/circ/circ_lib.js
Open-ILS/src/javascript/backend/circ/circ_permit_hold.js
Open-ILS/src/perlmods/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Actor/ClosedDates.pm
Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm
Open-ILS/src/perlmods/OpenILS/Application/Actor/UserGroups.pm
Open-ILS/src/perlmods/OpenILS/Application/Cat.pm
Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/CopyLocations.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/HoldNotify.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Money.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/NonCat.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/ScriptBuilder.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/StatCat.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Survey.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Transit.pm
Open-ILS/src/perlmods/OpenILS/Application/Collections.pm
Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm [new file with mode: 0644]
Open-ILS/src/perlmods/OpenILS/Application/Fielder.pm [new file with mode: 0644]
Open-ILS/src/perlmods/OpenILS/Application/PermaCrud.pm [new file with mode: 0644]
Open-ILS/src/perlmods/OpenILS/Application/Search/AddedContent.pm
Open-ILS/src/perlmods/OpenILS/Application/Search/Authority.pm
Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm
Open-ILS/src/perlmods/OpenILS/Application/Search/CNBrowse.pm
Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm
Open-ILS/src/perlmods/OpenILS/Application/Search/Zips.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/FTS.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/perlmods/OpenILS/Const.pm
Open-ILS/src/perlmods/OpenILS/Reporter/SQLBuilder.pm
Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm
Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm
Open-ILS/src/perlmods/OpenILS/Utils/PermitHold.pm
Open-ILS/src/perlmods/OpenILS/WWW/Exporter.pm
Open-ILS/src/perlmods/OpenILS/WWW/Proxy.pm
Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm
Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm
Open-ILS/src/python/oils/utils/idl.py
Open-ILS/src/reporter/clark-kent.pl
Open-ILS/src/sql/Pg/002.functions.config.sql
Open-ILS/src/sql/Pg/005.schema.actors.sql
Open-ILS/src/sql/Pg/020.schema.functions.sql
Open-ILS/src/sql/Pg/090.schema.action.sql
Open-ILS/src/sql/Pg/100.circ_matrix.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/110.hold_matrix.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/300.schema.staged_search.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/800.fkeys.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/951.data.MODS-xsl.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/952.data.MODS3-xsl.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/953.data.MODS32-xsl.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/build-db.sh
Open-ILS/src/sql/Pg/example.reporter-extension.sql
Open-ILS/src/support-scripts/brick_ctl.sh
Open-ILS/src/support-scripts/offline-blocked-list.pl
Open-ILS/src/support-scripts/oils_brick.cfg.example [new file with mode: 0644]
Open-ILS/src/support-scripts/settings-tester.pl
Open-ILS/web/conify/global/actor/org_unit.html [new file with mode: 0644]
Open-ILS/web/conify/global/actor/org_unit.js [new file with mode: 0644]
Open-ILS/web/conify/global/actor/org_unit_type.html [new file with mode: 0644]
Open-ILS/web/conify/global/actor/org_unit_type.js [new file with mode: 0644]
Open-ILS/web/conify/global/admin.html [new file with mode: 0644]
Open-ILS/web/conify/global/admin.js [new file with mode: 0644]
Open-ILS/web/conify/global/config/copy_status.html [new file with mode: 0644]
Open-ILS/web/conify/global/config/copy_status.js [new file with mode: 0644]
Open-ILS/web/conify/global/permission/grp_tree.html [new file with mode: 0644]
Open-ILS/web/conify/global/permission/grp_tree.js [new file with mode: 0644]
Open-ILS/web/conify/global/permission/perm_list.html [new file with mode: 0644]
Open-ILS/web/conify/global/permission/perm_list.js [new file with mode: 0644]
Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js [new file with mode: 0644]
Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js [new file with mode: 0644]
Open-ILS/web/js/dojo/fieldmapper/dojoData.js [new file with mode: 0644]
Open-ILS/web/js/dojo/fieldmapper/hash.js [new file with mode: 0644]
Open-ILS/web/js/dojo/openils/Event.js [new file with mode: 0644]
Open-ILS/web/js/dojo/openils/I18N.js [new file with mode: 0644]
Open-ILS/web/js/dojo/openils/User.js [new file with mode: 0644]
Open-ILS/web/opac/common/js/config.js
Open-ILS/web/opac/common/js/init.js
Open-ILS/web/opac/common/js/opac_utils.js
Open-ILS/web/opac/common/js/org_utils.js
Open-ILS/web/opac/extras/slimpac/start.html
Open-ILS/web/opac/locale/en-CA/lang.dtd
Open-ILS/web/opac/locale/en-US/lang.dtd
Open-ILS/web/opac/locale/en-US/opac.dtd
Open-ILS/web/opac/skin/default/css/layout.css
Open-ILS/web/opac/skin/default/js/adv_global.js
Open-ILS/web/opac/skin/default/js/copy_details.js
Open-ILS/web/opac/skin/default/js/depth_selector.js
Open-ILS/web/opac/skin/default/js/holds.js
Open-ILS/web/opac/skin/default/js/mresult.js
Open-ILS/web/opac/skin/default/js/myopac.js
Open-ILS/web/opac/skin/default/js/result_common.js
Open-ILS/web/opac/skin/default/js/rresult.js
Open-ILS/web/opac/skin/default/js/search_bar.js
Open-ILS/web/opac/skin/default/xml/advanced/advanced_global.xml
Open-ILS/web/opac/skin/default/xml/common/holds.xml
Open-ILS/web/opac/skin/default/xml/common/js_common.xml
Open-ILS/web/opac/skin/default/xml/common/statusbar.xml
Open-ILS/web/opac/skin/default/xml/myopac/myopac_holds.xml
Open-ILS/web/opac/skin/default/xml/result/filtersort.xml
Open-ILS/web/opac/skin/default/xml/result/result_info.xml
Open-ILS/web/opac/skin/default/xml/result/result_table.xml
Open-ILS/web/opac/theme/default/css/colors.css
Open-ILS/web/reports/oils_rpt_tforms.js
Open-ILS/web/reports/xul/transforms.js
Open-ILS/xsl/locDoc2xml.xsl [new file with mode: 0644]
Open-ILS/xul/staff_client/Makefile
Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js
Open-ILS/xul/staff_client/chrome/content/OpenILS/util/fmall.js
Open-ILS/xul/staff_client/chrome/content/admin/survey.js
Open-ILS/xul/staff_client/chrome/content/admin/survey_wizard.xul
Open-ILS/xul/staff_client/chrome/content/auth/controller.js
Open-ILS/xul/staff_client/chrome/content/auth/session.js
Open-ILS/xul/staff_client/chrome/content/cat/opac.js
Open-ILS/xul/staff_client/chrome/content/cat/opac.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline_checkin.js
Open-ILS/xul/staff_client/chrome/content/circ/offline_checkin.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline_checkout.js
Open-ILS/xul/staff_client/chrome/content/circ/offline_checkout.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline_in_house_use.js
Open-ILS/xul/staff_client/chrome/content/circ/offline_in_house_use.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline_register.js
Open-ILS/xul/staff_client/chrome/content/circ/offline_register.xul
Open-ILS/xul/staff_client/chrome/content/circ/offline_renew.js
Open-ILS/xul/staff_client/chrome/content/circ/offline_renew.xul
Open-ILS/xul/staff_client/chrome/content/legacy/_browse.xul [deleted file]
Open-ILS/xul/staff_client/chrome/content/legacy/_marc.xul [deleted file]
Open-ILS/xul/staff_client/chrome/content/main/JSAN.js
Open-ILS/xul/staff_client/chrome/content/main/about.html
Open-ILS/xul/staff_client/chrome/content/main/bindings.xml
Open-ILS/xul/staff_client/chrome/content/main/constants.js
Open-ILS/xul/staff_client/chrome/content/main/main.js
Open-ILS/xul/staff_client/chrome/content/main/main.xul
Open-ILS/xul/staff_client/chrome/content/main/menu.js
Open-ILS/xul/staff_client/chrome/content/main/menu_frame.xul
Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul
Open-ILS/xul/staff_client/chrome/content/main/simple_auth.xul
Open-ILS/xul/staff_client/chrome/content/util/error.js
Open-ILS/xul/staff_client/chrome/content/util/file.js
Open-ILS/xul/staff_client/chrome/content/util/list.js
Open-ILS/xul/staff_client/chrome/content/util/network.js
Open-ILS/xul/staff_client/chrome/content/util/print.js
Open-ILS/xul/staff_client/chrome/content/util/window.js
Open-ILS/xul/staff_client/chrome/locale/en-US/admin.properties [deleted file]
Open-ILS/xul/staff_client/chrome/locale/en-US/auth.properties [new file with mode: 0644]
Open-ILS/xul/staff_client/chrome/locale/en-US/cat.properties [deleted file]
Open-ILS/xul/staff_client/chrome/locale/en-US/circ.properties [deleted file]
Open-ILS/xul/staff_client/chrome/locale/en-US/common.properties [deleted file]
Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties [new file with mode: 0644]
Open-ILS/xul/staff_client/defaults/preferences/prefs.js
Open-ILS/xul/staff_client/external/dtd2js.pl [deleted file]
Open-ILS/xul/staff_client/external/dtd2js.sh [deleted file]
Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul
Open-ILS/xul/staff_client/server/admin/cash_reports.xhtml
Open-ILS/xul/staff_client/server/admin/closed_dates.js
Open-ILS/xul/staff_client/server/admin/closed_dates.xhtml
Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml
Open-ILS/xul/staff_client/server/admin/font_settings.xul
Open-ILS/xul/staff_client/server/admin/hold_pull_list.xhtml
Open-ILS/xul/staff_client/server/admin/hold_pull_list.xul
Open-ILS/xul/staff_client/server/admin/index.xhtml
Open-ILS/xul/staff_client/server/admin/non_cat_types.js
Open-ILS/xul/staff_client/server/admin/non_cat_types.xhtml
Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.xul
Open-ILS/xul/staff_client/server/admin/org_settings.js
Open-ILS/xul/staff_client/server/admin/org_settings.xhtml
Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml
Open-ILS/xul/staff_client/server/admin/transit_list.js
Open-ILS/xul/staff_client/server/admin/transit_list.xul
Open-ILS/xul/staff_client/server/admin/upload_xacts.xhtml
Open-ILS/xul/staff_client/server/cat/bib_brief.xul
Open-ILS/xul/staff_client/server/cat/copy_browser.js
Open-ILS/xul/staff_client/server/cat/copy_browser.xul
Open-ILS/xul/staff_client/server/cat/copy_buckets.js
Open-ILS/xul/staff_client/server/cat/copy_buckets.xul
Open-ILS/xul/staff_client/server/cat/copy_buckets_overlay.xul
Open-ILS/xul/staff_client/server/cat/copy_buckets_quick.xul
Open-ILS/xul/staff_client/server/cat/copy_editor.js
Open-ILS/xul/staff_client/server/cat/copy_editor.xul
Open-ILS/xul/staff_client/server/cat/copy_notes.xul
Open-ILS/xul/staff_client/server/cat/copy_summary.xul
Open-ILS/xul/staff_client/server/cat/marc_new.xul
Open-ILS/xul/staff_client/server/cat/marc_view.html
Open-ILS/xul/staff_client/server/cat/marc_view.xul
Open-ILS/xul/staff_client/server/cat/marcedit-tooltips.xml [deleted file]
Open-ILS/xul/staff_client/server/cat/marcedit.css
Open-ILS/xul/staff_client/server/cat/marcedit.js
Open-ILS/xul/staff_client/server/cat/marcedit.xul
Open-ILS/xul/staff_client/server/cat/record_buckets.js
Open-ILS/xul/staff_client/server/cat/record_buckets.xul
Open-ILS/xul/staff_client/server/cat/record_buckets_overlay.xul
Open-ILS/xul/staff_client/server/cat/spine_labels.js
Open-ILS/xul/staff_client/server/cat/spine_labels.xul
Open-ILS/xul/staff_client/server/cat/util.js
Open-ILS/xul/staff_client/server/cat/volume_copy_creator.js
Open-ILS/xul/staff_client/server/cat/volume_copy_creator.xul
Open-ILS/xul/staff_client/server/cat/z3950.js
Open-ILS/xul/staff_client/server/cat/z3950.xul
Open-ILS/xul/staff_client/server/circ/checkin.js
Open-ILS/xul/staff_client/server/circ/checkin.xul
Open-ILS/xul/staff_client/server/circ/checkin_overlay.xul
Open-ILS/xul/staff_client/server/circ/checkout.js
Open-ILS/xul/staff_client/server/circ/checkout.xul
Open-ILS/xul/staff_client/server/circ/checkout_overlay.xul
Open-ILS/xul/staff_client/server/circ/circ_brief.xul
Open-ILS/xul/staff_client/server/circ/circ_summary.xul
Open-ILS/xul/staff_client/server/circ/copy_details.xul
Open-ILS/xul/staff_client/server/circ/copy_status.js
Open-ILS/xul/staff_client/server/circ/copy_status.xul
Open-ILS/xul/staff_client/server/circ/copy_status_overlay.xul
Open-ILS/xul/staff_client/server/circ/hold_capture.js [deleted file]
Open-ILS/xul/staff_client/server/circ/hold_capture.xul [deleted file]
Open-ILS/xul/staff_client/server/circ/hold_capture_overlay.xul [deleted file]
Open-ILS/xul/staff_client/server/circ/in_house_use.js
Open-ILS/xul/staff_client/server/circ/in_house_use.xul
Open-ILS/xul/staff_client/server/circ/pre_cat_fields.xul
Open-ILS/xul/staff_client/server/circ/print_list_template_editor.js
Open-ILS/xul/staff_client/server/circ/print_list_template_editor.xul
Open-ILS/xul/staff_client/server/circ/util.js
Open-ILS/xul/staff_client/server/locale/en-US/admin.properties [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
Open-ILS/xul/staff_client/server/locale/en-US/circ.properties [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/common.properties [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/marcedit-tooltips.xml [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/multiclass_search_help.html [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/fr-CA/marcedit-tooltips.xml [new file with mode: 0644]
Open-ILS/xul/staff_client/server/main/data.xul
Open-ILS/xul/staff_client/server/main/gen_offline_widgets.xul
Open-ILS/xul/staff_client/server/main/ws_info.xul
Open-ILS/xul/staff_client/server/patron/adv_barcode_entry.xul [deleted file]
Open-ILS/xul/staff_client/server/patron/barcode_entry.js [deleted file]
Open-ILS/xul/staff_client/server/patron/barcode_entry.xul
Open-ILS/xul/staff_client/server/patron/bill_details.xul
Open-ILS/xul/staff_client/server/patron/bill_history.xul
Open-ILS/xul/staff_client/server/patron/bill_wizard.xul
Open-ILS/xul/staff_client/server/patron/bills.js
Open-ILS/xul/staff_client/server/patron/bills.xul
Open-ILS/xul/staff_client/server/patron/display.js
Open-ILS/xul/staff_client/server/patron/hold_notices.xul
Open-ILS/xul/staff_client/server/patron/holds.js
Open-ILS/xul/staff_client/server/patron/holds.xul
Open-ILS/xul/staff_client/server/patron/holds_overlay.xul
Open-ILS/xul/staff_client/server/patron/info.xul
Open-ILS/xul/staff_client/server/patron/info_group.xul
Open-ILS/xul/staff_client/server/patron/info_notes.xul
Open-ILS/xul/staff_client/server/patron/info_surveys.xul
Open-ILS/xul/staff_client/server/patron/items.js
Open-ILS/xul/staff_client/server/patron/items.xul
Open-ILS/xul/staff_client/server/patron/items_overlay.xul
Open-ILS/xul/staff_client/server/patron/search_result.js
Open-ILS/xul/staff_client/server/patron/search_result.xul
Open-ILS/xul/staff_client/server/patron/summary.js
Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
Open-ILS/xul/staff_client/server/patron/take_survey.js [deleted file]
Open-ILS/xul/staff_client/server/patron/ue_config.js
Open-ILS/xul/staff_client/server/patron/user_edit.js
Open-ILS/xul/staff_client/server/patron/user_edit.xml
Open-ILS/xul/staff_client/server/patron/user_editor.js [deleted file]
Open-ILS/xul/staff_client/server/patron/user_editor.xhtml [deleted file]
Open-ILS/xul/staff_client/server/patron/util.js
Open-ILS/xul/staff_client/server/skin/global.css
Open-ILS/xul/staff_client/server/skin/media/images/down_arrow.png [new file with mode: 0644]
Open-ILS/xul/staff_client/server/skin/media/images/left_arrow.png [new file with mode: 0644]
Open-ILS/xul/staff_client/server/skin/media/images/right_arrow.png [new file with mode: 0644]
Open-ILS/xul/staff_client/server/skin/media/images/up_arrow.png [new file with mode: 0644]
build/i18n/Makefile
build/i18n/po/admin.properties.pot [deleted file]
build/i18n/po/cat.properties.pot [deleted file]
build/i18n/po/circ.properties.pot [deleted file]
build/i18n/po/common.properties.pot [deleted file]
build/i18n/po/db.seed.pot [deleted file]
build/i18n/po/en-US/admin.properties.pot [new file with mode: 0644]
build/i18n/po/en-US/cat.properties.pot [new file with mode: 0644]
build/i18n/po/en-US/circ.properties.pot [new file with mode: 0644]
build/i18n/po/en-US/common.properties.pot [new file with mode: 0644]
build/i18n/po/en-US/db.seed.pot [new file with mode: 0644]
build/i18n/po/en-US/fm_IDL.pot [new file with mode: 0644]
build/i18n/po/en-US/ils_events.xml.pot [new file with mode: 0644]
build/i18n/po/en-US/lang.dtd.pot [new file with mode: 0644]
build/i18n/po/en-US/offline.properties.pot [new file with mode: 0644]
build/i18n/po/en-US/opac.dtd.pot [new file with mode: 0644]
build/i18n/po/fm_IDL.pot [deleted file]
build/i18n/po/hy/opac.dtd.po [new file with mode: 0644]
build/i18n/po/lang.dtd.pot [deleted file]
build/i18n/po/opac.dtd.pot [deleted file]
build/i18n/scripts/ils_events.py [new file with mode: 0755]
build/i18n/scripts/marc_tooltip_maker.py [new file with mode: 0644]
build/i18n/tests/check_properties.py [new file with mode: 0644]
build/i18n/tests/testpo.py
install.sh

index 9721739..75d571f 100644 (file)
@@ -428,3 +428,10 @@ WGRL-PC    168.12.204.1    168.12.204.254
 WGRL-TA        168.12.205.1    168.12.205.254
 WGRL-VR        168.12.206.1    168.12.206.254
 WGRL-MZ 168.12.220.1 168.12.220.254
+WGRL-WB 168.12.224.1 168.12.224.255
+LBRLS-LB    168.13.31.1 168.13.31.255
+LBRLS-CORD  168.13.28.1 168.13.28.255
+LBRLS-DOOLY 168.13.29.1 168.13.29.255
+LBRLS-UNAD  168.13.30.1 168.13.30.255
+LBRLS-SCH   168.13.33.1 168.13.33.255
+LBRLS-BYRM  168.13.27.1 168.13.27.255
index b7ed454..cd7cf4b 100755 (executable)
@@ -1,6 +1,9 @@
 #!/usr/bin/perl -w
 use strict;
-use XML::LibXML;
+use UNIVERSAL::require;
+use MARC::Charset;
+use MARC::Batch;
+use MARC::File::XML;
 use Time::HiRes qw/time/;
 use Getopt::Long;
 use Data::Dumper;
@@ -36,16 +39,17 @@ my %status_map = (
 
 $|=1;
 
-my ($userid,$cn_id,$cp_id,$cp_file,$cn_file,$lib_map_field,$id_tag, $marc_file) =
-       (1, 1, 1, 'asset_copy.sql','asset_volume.sql','shortname','./controlfield[@tag="001"]');
+my ($userid,$cn_id,$cp_id,$cp_file,$cn_file,$lib_map_field,$id_tag,$id_field,$id_subfield, $marc_file) =
+       (1, 1, 1, 'asset_copy.sql','asset_volume.sql','shortname','001');
 
-my ($holding_tag,$bc,$lbl,$own,$pr,$cpn,$avail) =
-       ('./datafield[@tag="999"]','i','a','m','p','c','k');
+my ($skip,$enc,$marctype,$holding_tag,$bc,$lbl,$own,$pr,$cpn,$avail) =
+       (0,'utf-8','XML','999','i','a','m','p','c','k');
 
 my ($db_driver,$db_host,$db_name,$db_user,$db_pw) =
        ('Pg','localhost','evergreen','postgres','postgres');
 
 GetOptions (   
+       "encoding=s"            => \$enc,
        "copy_file=s"           => \$cp_file,
        "volume_file=s"         => \$cn_file,
        "userid=i"              => \$userid,
@@ -57,18 +61,32 @@ GetOptions (
        "db_user=s"             => \$db_user,
        "db_pw=s"               => \$db_pw,
        "lib_map_field=s"       => \$lib_map_field,
-       "id_tag_xpath=s"        => \$id_tag,
-       "holding_tag_xpath=s"   => \$holding_tag,
+       "id_field=s"            => \$id_field,
+       "id_subfield=s"         => \$id_subfield,
+       "holding_field=s"       => \$holding_tag,
        "item_barcode=s"        => \$bc,
        "item_call_number=s"    => \$lbl,
        "item_owning_lib=s"     => \$own,
        "item_price=s"          => \$pr,
        "item_copy_number=s"    => \$cpn,
        "item_copy_status=s"    => \$avail,
-       "marc_file=s"   => \$marc_file,
+       "marc_file=s"           => \$marc_file,
+       "marctype=s"            => \$marctype,
+       "skip=i"                => \$skip,
 
 );
 
+if ($marctype eq 'XML') {
+       'open'->use(':utf8');
+} else {
+        bytes->use();
+}
+
+if ($enc) {
+       MARC::Charset->ignore_errors(1);
+        MARC::Charset->assume_encoding($enc);
+}
+
 my $dsn = "dbi:$db_driver:host=$db_host;dbname=$db_name";
 my $dbh = DBI->connect($dsn,$db_user,$db_pw);
 
@@ -87,67 +105,44 @@ while (my $lib = $sth->fetchrow_arrayref) {
 my $tcn_sth = $dbh->prepare("SELECT id FROM biblio.record_entry WHERE tcn_value = ?");
 my $rec_id;
 
-open CP, ">$cp_file" or die "Can't open $cp_file!  $!\n";
-open CN, ">$cn_file" or die "Can't open $cn_file!  $!\n";
+open CP, ">>$cp_file" or die "Can't open $cp_file!  $!\n";
+open CN, ">>$cn_file" or die "Can't open $cn_file!  $!\n";
 
-
-print CP <<SQL;
+print CP <<SQL if (!$skip);
 SET CLIENT_ENCODING TO 'UNICODE';
 COPY asset.copy (id,circ_lib,editor,creator,barcode,call_number,copy_number,status,loan_duration,fine_level,circulate,deposit,deposit_amount,price,ref,opac_visible) FROM STDIN;
 SQL
 
-print CN <<SQL;
+print CN <<SQL if (!$skip);
 SET CLIENT_ENCODING TO 'UNICODE';
 COPY asset.call_number (id,editor,creator,record,label,owning_lib) FROM STDIN;
 SQL
 
 my $xact_id = time;
 
-my $parser = XML::LibXML->new();
+my $batch = MARC::Batch->new( $marctype => $marc_file );
+$batch->strict_off();
+$batch->warnings_off();
 
 my $cn_map;
-my $doc;
-
-$doc = $parser->parse_file( $marc_file );
-my $xc = XML::LibXML::XPathContext->new($doc);
-my @records = $xc->findnodes('//record');
-foreach my $record (@records) {
-
-       my $tcn;
-       my $success = 0;
-       try {
-               $tcn = $xc->findvalue( $id_tag, $record );
-               $success = 1;
-       } catch Error with {
-               my $e = shift;
-               warn $e;
-       };      
-       next unless $success;
-
-       $tcn =~ s/^\s*(\.+)\s*/$1/o;
-       $tcn =~ s/\s+/_/go;
-       
-       unless ($tcn) {
-               warn "\nNo TCN found in rec!!\n";
-               next;
-       }
+my $count = 0;
+my $record;
+while ( try { $record = $batch->next } otherwise { $record = -1 } ) {
+       next if ($record == -1);
+       $count++;
+       next if ($count <= $skip);
 
-       $tcn_sth->execute($tcn);
-       $tcn_sth->bind_col(1, \$rec_id);
-       $tcn_sth->fetch;
+       $rec_id = $record->subfield( $id_field => $id_subfield );
 
-       unless ($rec_id) {
-               warn "\n !! TCN $tcn not in the map!\n";
-               next;
-       }
+       next unless ($rec_id);
 
-       for my $node ($xc->findnodes($holding_tag, $record)) {
-               my $barcode = $xc->findvalue( "./*[\@code=\"$bc\"]", $node );
-               my $label = $xc->findvalue( "./*[\@code=\"$lbl\"]", $node );
-               my $owning_lib = $$lib_map{ $xc->findvalue( "./*[\@code=\"$own\"]", $node ) };
-               my $price = $xc->findvalue( "./*[\@code=\"$pr\"]", $node );
-               my $copy_number = $xc->findvalue( "./*[\@code=\"$cpn\"]", $node ) || 0;
-               my $available = $xc->findvalue( "./*[\@code=\"$avail\"]", $node ) || '';
+       for my $field ($record->field($holding_tag)) {
+               my $barcode = $field->subfield( $bc );
+               my $label = $field->subfield( $lbl );
+               my $owning_lib = $$lib_map{ $field->subfield( $own ) };
+               my $price = $field->subfield( $pr );
+               my $copy_number = $field->subfield( $cpn ) || '\N';
+               my $available = $field->subfield( $avail ) || '';
 
                my $status = $status_map{$available} || 0;
 
@@ -157,8 +152,8 @@ foreach my $record (@records) {
 
                $barcode =~ s/\\/\\\\/og;
                $label =~ s/\\/\\\\/og;
-               $price =~ s/\$//og;
-               if ($price !~ /^\s*\d{1,6}\.\d{2}\s*$/o) {
+               $price =~ s/\$//og if($price);
+               if (!defined($price) || $price !~ /^\s*\d{1,6}\.\d{2}\s*$/o) {
                        $price = '0.00';
                }
 
index a402c86..89a8364 100644 (file)
@@ -10,7 +10,8 @@ INSERT INTO metabib.metarecord (fingerprint,master_record)
          FROM  (SELECT DISTINCT ON (fingerprint)
                        fingerprint, id, quality
                  FROM  biblio.record_entry
-                 ORDER BY fingerprint, quality desc) AS x;
+                 ORDER BY fingerprint, quality desc) AS x
+         WHERE fingerprint IS NOT NULL;
 
 INSERT INTO metabib.metarecord_source_map (metarecord,source)
        SELECT  m.id, b.id
index ec1f518..d98f762 100644 (file)
@@ -230,6 +230,14 @@ var CIRC_MOD_MAP = {
                maxFine                                 : 'overdue_mid'
        },
 
+       'dvd-mid'                                                       : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule          : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
        'e-book' : {
                SIPMediaType                    : '001',
                magneticMedia                   : 'f',
@@ -356,6 +364,15 @@ var CIRC_MOD_MAP = {
                maxFine                                 : 'overdue_mid'
        },
 
+       'video-mid'     : {
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule          : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+
        'facbestslr'    : {
                SIPMediaType                    : '001',
                magneticMedia                   : 'f',
index 80b36b8..c40e885 100644 (file)
@@ -10,10 +10,12 @@ var isStaffHold = isGroupDescendantId('Staff', requestor.profile);
 
 /* non-staff members are allowed 50 open holds at most */
 if( ! isStaffHold ) {
-   var count = userHoldCount(patron.id);
-   log_info("patron has " + count + " open holds");
-   if( count >= 50 ) 
-      result.events.push('MAX_HOLDS');
+    if(newHold) {
+        var count = userHoldCount(patron.id);
+        log_info("patron has " + count + " open holds");
+        if( count >= 50 ) 
+            result.events.push('MAX_HOLDS');
+    }
 } else {
     log_info("This is a staff-placed hold");
 }
@@ -70,6 +72,26 @@ if( ( marcItemType == 'g' ||
 
        log_info("this is a range-protected item...");
 
+       /* ------------------------------------------------------------------------ */
+       /** This patch allows DCPL and LEE patrons to place 
+               holds on protected items accross their systems.  In short, if the pickup lib,
+               owning lib, and patron home (or request lib) are all within either of the two 
+               systems, allow the hold */
+       if(
+               /* DCPL=33, LEE=115 */
+               (hasCommonAncestor(holdPickupLib, 33, 1) || hasCommonAncestor(holdPickupLib, 115, 1)) &&
+               (hasCommonAncestor(volume.owning_lib, 33, 1) || hasCommonAncestor(volume.owning_lib, 115, 1)) &&
+               (
+                       hasCommonAncestor(patron.home_ou.id, 33, 1) || hasCommonAncestor(patron.home_ou.id, 115, 1) || 
+                       hasCommonAncestor(holdRequestLib.id, 33, 1) || hasCommonAncestor(holdRequestLib.id, 115, 1)
+               )) {
+
+               log_info("DCPL and LEE are allowed to place holds on protected items accross the two systems");
+               return;
+       }
+       /* ------------------------------------------------------------------------ */
+
+
     if( ! hasCommonAncestor( volume.owning_lib, holdPickupLib, 1 ) ) {
 
         /* we don't want these items to transit to the pickup lib */
index e540314..917efdc 100644 (file)
@@ -37,12 +37,12 @@ var barredAlerted = false;
 
 function uEditUsrnameBlur(field) {
        var usrname = uEditNodeVal(field);
-       if(!usrname) return;
+       if (!usrname) { return; }
        var req = new Request(CHECK_USERNAME, SESSION, usrname);
        req.callback( 
                function(r) {
                        var res = r.getResultObject();
-                       if( res && res != patron.id() ) {
+                       if( res !== null && res != patron.id() ) {
                                field.widget.onblur = null; /* prevent alert storm */
                                alertId('ue_dup_username');
                                field.widget.onblur = uEditUsrnameBlur;
@@ -67,7 +67,7 @@ function uEditBarcodeBlur(field) {
        req.callback( 
                function(r) {
                        var res = r.getResultObject();
-                       if( res && res != patron.id() ) {
+                       if( res == 1 ) {
                                field.widget.onblur = null; /* prevent alert storm */
                                alertId('ue_dup_barcode');
                                field.widget.onblur = uEditBarcodeBlur;
index 42e4ba2..ea19cec 100644 (file)
@@ -2,6 +2,7 @@ from django.db import models
 from django.db.models import signals
 from django.dispatch import dispatcher
 import datetime
+from gettext import gettext as _
 
 INTERVAL_HELP_TEXT = _('examples: "1 hour", "14 days", "3 months", "DD:HH:MM:SS.ms"')
 CHAR_MAXLEN=200 # just provide a sane default
@@ -220,6 +221,36 @@ class HoursOfOperation(models.Model):
     Config tables
     -------------------------------------------------------------- """
 
+class CircModifier(models.Model):
+    code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
+    name = models.CharField(maxlength=CHAR_MAXLEN)
+    description = models.CharField(maxlength=CHAR_MAXLEN);
+    sip2_media_type = models.CharField(maxlength=CHAR_MAXLEN);
+    magnetic_media = models.BooleanField()
+    class Admin:
+        search_fields = ['name','code']
+        list_display = ('code','name','description','sip2_media_type','magnetic_media')
+    class Meta:
+        db_table = 'circ_modifier'
+        ordering = ['name']
+        verbose_name = _('Circulation Modifier')
+    def __str__(self):
+        return self.name
+
+
+class VideoRecordingFormat(models.Model):
+    code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
+    value = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
+    class Admin:
+        search_fields = ['value','code']
+        list_display = ('value','code')
+    class Meta:
+        db_table = 'videorecording_format_map'
+        ordering = ['code']
+        verbose_name = _('Video Recording Format')
+    def __str__(self):
+        return self.value
+
 class RuleCircDuration(models.Model):
     name = models.CharField(maxlength=CHAR_MAXLEN)
     extended = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
@@ -236,6 +267,89 @@ class RuleCircDuration(models.Model):
     def __str__(self):
         return self.name
 
+class CircMatrixMatchpoint(models.Model):
+    active = models.BooleanField(blank=False, default=True)
+    org_unit_id = models.ForeignKey(OrgUnit, db_column='org_unit', blank=False)
+    grp_id = models.ForeignKey(GrpTree, db_column='grp', blank=False, verbose_name=_("User Group"))
+    circ_modifier_id = models.ForeignKey(CircModifier, db_column='circ_modifier', null=True,blank=True)
+    marc_type_id = models.ForeignKey('ItemTypeMap', db_column='marc_type', null=True,blank=True)
+    marc_form_id = models.ForeignKey('ItemFormMap', db_column='marc_form', null=True,blank=True)
+    marc_vr_format_id = models.ForeignKey('VideoRecordingFormat', db_column='marc_vr_format', null=True,blank=True)
+    ref_flag = models.BooleanField(null=True)
+    usr_age_lower_bound = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT, null=True, blank=True)
+    usr_age_upper_bound = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT, null=True, blank=True)
+
+    def save(self):
+        ''' Override to force None-ness on the interval fields '''
+        if self.usr_age_lower_bound == "":
+            self.usr_age_lower_bound = None
+        if self.usr_age_upper_bound == "":
+            self.usr_age_upper_bound = None
+        return models.Model.save(self)
+
+    class Admin:
+        search_fields = ['grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id',
+            'marc_vr_format_id','usr_age_lower_bound','usr_age_upper_bound']
+
+        list_display = ('grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id',
+            'marc_vr_format_id','ref_flag','usr_age_lower_bound','usr_age_upper_bound')
+
+        list_filter = ['grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id','marc_vr_format_id']
+    class Meta:
+        db_table = 'circ_matrix_matchpoint'
+        ordering = ['id']
+        verbose_name = _('Circulation Matrix Matchpoint')
+    def __str__(self):
+        return _("OrgUnit: %(orgid)s, Group: %(grpid)s, Circ Modifier: %(modid)s") % {
+            'orgid':self.org_unit_id, 'grpid':self.grp_id, 'modid':self.circ_modifier_id}
+
+class CircMatrixTest(models.Model):
+    matchpoint_id =  models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', blank=False, primary_key=True, 
+        edit_inline=models.TABULAR, core=True, num_in_admin=1)
+    max_items_out = models.IntegerField(null=True, blank=True)
+    max_overdue = models.IntegerField(null=True, blank=True)
+    max_fines = models.FloatField(max_digits=8, decimal_places=2, null=True, blank=True)
+    script_test = models.CharField(maxlength=CHAR_MAXLEN, null=True, blank=True)
+    class Admin:
+        list_display = ('matchpoint_id','max_items_out','max_overdue','max_fines','script_test')
+    class Meta:
+        db_table = 'circ_matrix_test'
+        ordering = ['matchpoint_id']
+        verbose_name = _('Circ Matrix Test')
+    def __str__(self):
+        return _("%(mid)s, Max Items Out: %(iout)s, Max Overdue: %(odue)s, Max Fines: %(fines)s") % {
+            'mid': self.matchpoint_id, 'iout' : self.max_items_out, 'odue':self.max_overdue, 'fines':self.max_fines}
+
+class CircMatrixCircModTest(models.Model):
+    matchpoint_id =  models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', blank=False, edit_inline=True,core=True, num_in_admin=1)
+    items_out = models.IntegerField(blank=False)
+    circ_mod_id = models.ForeignKey(CircModifier, db_column='circ_mod', blank=False)
+    class Admin:
+        search_fields = ['circ_mod_id']
+        list_display = ('matchpoint_id','circ_mod_id','items_out')
+    class Meta:
+        db_table = 'circ_matrix_circ_mod_test'
+        ordering = ['matchpoint_id']
+        verbose_name = _('Circ Matrix Items Out Cirulation Modifier Subtest')
+    def __str__(self):
+        return _("%(mid)s, Restriction: %(mod)s") % {'mid': self.matchpoint_id,'mod':self.circ_mod_id}
+
+class CircMatrixRuleSet(models.Model):
+    matchpoint_id =  models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', 
+        blank=False, primary_key=True, edit_inline=True,core=True, num_in_admin=1)
+    duration_rule_id = models.ForeignKey(RuleCircDuration, db_column='duration_rule', blank=False)
+    recurring_fine_rule_id = models.ForeignKey('RuleRecurringFine', db_column='recurring_fine_rule', blank=False)
+    max_fine_rule_id = models.ForeignKey('RuleMaxFine', db_column='max_fine_rule', blank=False)
+    class Admin:
+        search_fields = ['matchoint_id']
+        list_display = ('matchpoint_id','duration_rule_id','recurring_fine_rule_id','max_fine_rule_id')
+    class Meta:
+        db_table = 'circ_matrix_ruleset'
+        ordering = ['matchpoint_id']
+        verbose_name = _('Circ Matrix Rule Set')
+    def __str__(self):
+        return _("Duration: %(dur)s, Recurring Fine: %(rfine)s, Max Fine: %(mfine)s") % {
+            'dur':self.duration_rule_id, 'rfine':self.recurring_fine_rule_id, 'mfine':self.max_fine_rule_id}
 
 class RuleMaxFine(models.Model):
     name = models.CharField(maxlength=CHAR_MAXLEN)
index d6838fe..7716719 100644 (file)
@@ -99,8 +99,17 @@ OSRFGatewayConfig /openils/conf/opensrf_core.xml
 </LocationMatch>
        
 # ----------------------------------------------------------------------------------
-# Run server-side XUL through xmlent to load the correct XML entities
+# Run server-side XUL and XHTML through xmlent to load the correct XML entities
 # ----------------------------------------------------------------------------------
+<LocationMatch /xul/.*\.xhtml$>
+    Options +Includes
+    AddOutputFilter INCLUDES;XMLENT .xhtml
+    allow from all
+
+    # We only support one locale (en-US) for the time being
+    SetEnv locale en-US
+</LocationMatch>
+
 <LocationMatch /xul/.*\.xul$>
     Options +Includes
     XMLEntContentType "application/vnd.mozilla.xul+xml"
@@ -108,9 +117,10 @@ OSRFGatewayConfig /openils/conf/opensrf_core.xml
     allow from all
 
     # We only support one locale (en-US) for the time being
-    SetEnv locale=en-US
+    SetEnv locale en-US
 </LocationMatch>
 
+
 # ----------------------------------------------------------------------------------
 # Supercat feeds
 # ----------------------------------------------------------------------------------
@@ -149,6 +159,13 @@ OSRFGatewayConfig /openils/conf/opensrf_core.xml
     PerlSendHeader On
     allow from all
 </Location>
+<Location /opac/extras/sru>
+    SetHandler perl-script
+    PerlHandler OpenILS::WWW::SuperCat::sru_search
+    Options +ExecCGI
+    PerlSendHeader On
+    allow from all
+</Location>
 <Location /opac/extras/feed/freshmeat>
     SetHandler perl-script
     PerlHandler OpenILS::WWW::SuperCat::changes_feed
@@ -202,7 +219,10 @@ OSRFGatewayConfig /openils/conf/opensrf_core.xml
 # ----------------------------------------------------------------------------------
 <Location /exporter>
     SetHandler perl-script
-    PerlHandler OpenILS::WWW::Exporter
+    PerlSetVar OILSProxyTitle "Exporter Login"
+    PerlSetVar OILSProxyDescription "Please log in to export records"
+    PerlSetVar OILSProxyPermissions "STAFF_LOGIN"
+    PerlHandler OpenILS::WWW::Proxy OpenILS::WWW::Exporter
     Options +ExecCGI
     allow from all
 </Location>
index aada429..2f216be 100644 (file)
@@ -1,4 +1,28 @@
-<IDL xmlns="http://opensrf.org/spec/IDL/base/v1" xmlns:oils_persist="http://open-ils.org/spec/opensrf/IDL/persistence/v1" xmlns:oils_obj="http://open-ils.org/spec/opensrf/IDL/objects/v1" xmlns:reporter="http://open-ils.org/spec/opensrf/IDL/reporter/v1" xmlns:crud="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+Copyright (C) 2006-2008 Georgia Public Library Service
+Copyright (C) 2008 Equinox Software, Inc
+Author: Mike Rylander <miker@esilibrary.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.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+-->
+
+<IDL xmlns="http://opensrf.org/spec/IDL/base/v1" xmlns:oils_persist="http://open-ils.org/spec/opensrf/IDL/persistence/v1" xmlns:oils_obj="http://open-ils.org/spec/opensrf/IDL/objects/v1" xmlns:reporter="http://open-ils.org/spec/opensrf/IDL/reporter/v1" xmlns:permacrud="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
 
        <!-- Virtual classes -->
        <class id="mups" controller="open-ils.cstore" oils_obj:fieldmapper="money::user_payment_summary" oils_persist:virtual="true">
                </fields>
        </class>
 
+       <class id="amtr" controller="open-ils.cstore" oils_obj:fieldmapper="action::matrix_test_result" oils_persist:virtual="true">
+               <fields oils_persist:primary="matchpoint">
+                       <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="Matchpoint ID" name="matchpoint" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Success" name="success" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Failure Part" name="fail_part" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+               </fields>
+               <links>
+                       <link field="matchpoint" reltype="has_a" key="id" map="" class="ccmm"/>
+               </links>
+       </class>
+
 
        <!-- Actually in the DB -->
        <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">
                </links>
        </class>
 
+       <class id="ccm" controller="open-ils.cstore" oils_obj:fieldmapper="config::circ_modifier" oils_persist:tablename="config.circ_modifier" reporter:label="Circulation Modifier">
+               <fields oils_persist:primary="code">
+                       <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="Code" name="code" oils_obj:array_position="3" oils_persist:virtual="false" reporter:selector="name" reporter:datatype="id"/>
+                       <field reporter:label="Name" name="name" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+                       <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="SIP2 Media Type" name="sip2_media_type" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+                       <field reporter:label="Magnetic Media" name="magnetic_media" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="bool"/>
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_CIRC_MOD" context_field="parent_ou"/>
+                <retrieve/>
+                <update permission="UPDATE_CIRC_MOD" context_field="parent_ou"/>
+                <delete permission="DELETE_CIRC_MOD" context_field="parent_ou"/>
+            </actions>
+        </permacrud>
+       </class>
+
+       <class id="cvrfm" controller="open-ils.cstore" oils_obj:fieldmapper="config::videorecording_format_map" oils_persist:tablename="config.videorecording_format_map" reporter:label="Videorecording Format">
+               <fields oils_persist:primary="code">
+                       <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="Code" name="code" oils_obj:array_position="3" oils_persist:virtual="false" reporter:selector="name" reporter:datatype="id"/>
+                       <field reporter:label="Name" name="name" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_VR_FORMAT" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_VR_FORMAT" global_required="true"/>
+                <delete permission="DELETE_VR_FORMAT" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+
+       <class id="chmm" controller="open-ils.cstore" oils_obj:fieldmapper="config::hold_matrix_matchpoint" oils_persist:tablename="config.hold_matrix_matchpoint" reporter:label="Hold Matrix Matchpoint">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.hold_matrix_matchpoint_id_seq">
+                       <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="Matchpoint ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Active?" name="active" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="User Home Library" name="user_home_ou" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Request Library" name="request_ou" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Pickup Library" name="pickup_ou" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Owning Library" name="item_owning_ou" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Item Circ Library" name="item_circ_ou" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="User Permission Group" name="usr_grp" oils_obj:array_position="10" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Requestor Permission Group" name="requestor_grp" oils_obj:array_position="11" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Circulation Modifier" name="circ_modifier" oils_obj:array_position="12" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="MARC Type" name="marc_type" oils_obj:array_position="13" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="MARC Form" name="marc_form" oils_obj:array_position="14" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="Videorecording Format" name="marc_vr_format" oils_obj:array_position="15" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="Reference?" name="ref_flag" oils_obj:array_position="16" oils_persist:virtual="false" reporter:datatype="bool"/>
+               </fields>
+               <links>
+                       <link field="user_home_ou" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="request_ou" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="pickup_ou" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="item_owning_ou" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="item_circ_ou" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="usr_grp" reltype="has_a" key="id" map="" class="pgt"/>
+                       <link field="requestor_grp" reltype="has_a" key="id" map="" class="pgt"/>
+                       <link field="circ_modifier" reltype="has_a" key="id" map="" class="ccm"/>
+                       <link field="marc_type" reltype="has_a" key="id" map="" class="ccm"/>
+                       <link field="marc_type" reltype="has_a" key="code" map="" class="citm"/>
+                       <link field="marc_form" reltype="has_a" key="code" map="" class="cifm"/>
+                       <link field="marc_vr_format" reltype="has_a" key="code" map="" class="cvrfm"/>
+               </links>
+       </class>
+
+       <class id="ccmm" controller="open-ils.cstore" oils_obj:fieldmapper="config::circ_matrix_matchpoint" oils_persist:tablename="config.circ_matrix_matchpoint" reporter:label="Circulation Matrix Matchpoint">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.circ_matrix_matchpoint_id_seq">
+                       <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="Matchpoint ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Active?" name="active" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Org Unit" name="org_unit" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Permission Group" name="grp" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Circulation Modifier" name="circ_modifier" oils_obj:array_position="7" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="MARC Type" name="marc_type" oils_obj:array_position="8" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="MARC Form" name="marc_form" oils_obj:array_position="9" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="Videorecording Format" name="marc_vr_format" oils_obj:array_position="10" oils_persist:virtual="false" oils_persist:primitive="string" reporter:datatype="link"/>
+                       <field reporter:label="Reference?" name="ref_flag" oils_obj:array_position="11" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="User Age: Lower Bound" name="usr_age_lower_bound" oils_obj:array_position="12" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field reporter:label="User Age: Upper Bound" name="usr_age_upper_bound" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="text"/>
+               </fields>
+               <links>
+                       <link field="org_unit" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="grp" reltype="has_a" key="id" map="" class="pgt"/>
+                       <link field="circ_modifier" reltype="has_a" key="id" map="" class="ccm"/>
+                       <link field="marc_type" reltype="has_a" key="id" map="" class="ccm"/>
+                       <link field="marc_type" reltype="has_a" key="code" map="" class="citm"/>
+                       <link field="marc_form" reltype="has_a" key="code" map="" class="cifm"/>
+                       <link field="marc_vr_format" reltype="has_a" key="code" map="" class="cvrfm"/>
+               </links>
+       </class>
+
+       <class id="chmt" controller="open-ils.cstore" oils_obj:fieldmapper="config::hold_matrix_test" oils_persist:tablename="config.hold_matrix_test" reporter:label="Hold Matrix Test Set">
+               <fields oils_persist:primary="matchpoint">
+                       <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="Matchpoint ID" name="matchpoint" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Holdable?" name="holdable" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Range is from Owning Lib?" name="distance_is_from_owner" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Transit Range" name="transit_range" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Max Holds" name="max_holds" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Max includes Frozen" name="include_frozen_holds" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Copy Age Hold Protection Rule" name="age_hold_protect_rule" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="link"/>
+               </fields>
+               <links>
+                       <link field="matchpoint" reltype="has_a" key="id" map="" class="ccmm"/>
+                       <link field="age_hold_protect_rule" reltype="has_a" key="id" map="" class="crahp"/>
+               </links>
+       </class>
+
+       <class id="ccmt" controller="open-ils.cstore" oils_obj:fieldmapper="config::circ_matrix_test" oils_persist:tablename="config.circ_matrix_test" reporter:label="Circulation Matrix Test Set">
+               <fields oils_persist:primary="matchpoint">
+                       <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="Matchpoint ID" name="matchpoint" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Circulate?" name="circulate" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="bool"/>
+                       <field reporter:label="Max Items Out" name="max_items_out" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Max Overdue" name="max_overdue" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Max Fines" name="max_fines" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="money"/>
+                       <field reporter:label="Test Script" name="script_test" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+               </fields>
+               <links>
+                       <link field="matchpoint" reltype="has_a" key="id" map="" class="ccmm"/>
+               </links>
+       </class>
+
+       <class id="ccmcmt" controller="open-ils.cstore" oils_obj:fieldmapper="config::circ_matrix_circ_mod_test" oils_persist:tablename="config.circ_matrix_circ_mod_test" reporter:label="Circulation Matrix Circulation Modifier Subtest">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.circ_matrix_circ_mod_test_id_seq">
+                       <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="Test ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Matchpoint ID" name="matchpoint" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Items Out" name="items_out" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Circulation Modifier" name="circ_mod" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+               </fields>
+               <links>
+                       <link field="matchpoint" reltype="has_a" key="id" map="" class="ccmm"/>
+                       <link field="circ_mod" reltype="has_a" key="id" map="" class="ccm"/>
+               </links>
+       </class>
+
+       <class id="ccmrs" controller="open-ils.cstore" oils_obj:fieldmapper="config::circ_matrix_ruleset" oils_persist:tablename="config.circ_matrix_ruleset" reporter:label="Circulation Matrix Rule Set">
+               <fields oils_persist:primary="matchpoint">
+                       <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="Matchpoint ID" name="matchpoint" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field reporter:label="Duration Rule" name="duration_rule" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Recurring Fine Rule" name="recurring_fine_rule" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Max Fine Rule" name="max_fine_rule" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+               </fields>
+               <links>
+                       <link field="matchpoint" reltype="has_a" key="id" map="" class="ccmm"/>
+                       <link field="duration_rule" reltype="has_a" key="name" map="" class="crcd"/>
+                       <link field="max_fine_rule" reltype="has_a" key="name" map="" class="crmf"/>
+                       <link field="recuring_fine_rule" reltype="has_a" key="name" map="" class="crrf"/>
+               </links>
+       </class>
+
        <class id="cit" controller="open-ils.cstore" oils_obj:fieldmapper="config::identification_type" oils_persist:tablename="config.identification_type" reporter:label="Identification Type">
                <fields oils_persist:primary="id" oils_persist:sequence="config.identification_type_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                </fields>
                <links/>
        </class>
+
        <class id="asvq" controller="open-ils.cstore" oils_obj:fieldmapper="action::survey_question" oils_persist:tablename="action.survey_question" reporter:label="User Survey Question">
                <fields oils_persist:primary="id" oils_persist:sequence="action.survey_question_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                </links>
         <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
             <actions>
-                <create permission="TRANSIT_COPY" context_field="owner">
-                    <context link="target_copy" field="circ_lib"/>
-                </create>
+                <create permission="TRANSIT_COPY"/>
                 <retrieve/>
                 <update permission="UPDATE_TRANSIT" context_field="dest|source"/>
                 <delete permission="DELETE_TRANSIT" context_field="dest|source"/>
                        <field reporter:label="Language" name="value" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_LANGUAGE" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_LANGUAGE" global_required="true"/>
+                <delete permission="DELETE_LANGUAGE" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="mccp" controller="open-ils.cstore" oils_obj:fieldmapper="money::credit_card_payment" oils_persist:tablename="money.credit_card_payment">
                <fields oils_persist:primary="id" oils_persist:sequence="money.payment_id_seq">
                        <link field="xact" reltype="has_a" key="id" map="" class="mbt"/>
                </links>
        </class>
+       <class id="cxt" controller="open-ils.cstore" oils_obj:fieldmapper="config::xml_transform" oils_persist:tablename="config.xml_transform" reporter:label="XML/XSLT Transform Definition">
+               <fields oils_persist:primary="name">
+                       <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 name="field_class" oils_obj:array_position="3" oils_persist:virtual="false" />
+                       <field reporter:label="Name" name="name" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" />
+                       <field reporter:label="Namespace URI" name="namespace_uri" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field reporter:label="Namespace Prefix" name="prefix" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field reporter:label="XSLT" name="xslt" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_XML_TRANSFORM" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_XML_TRANSFORM" global_required="true"/>
+                <delete permission="DELETE_XML_TRANSFORM" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
        <class id="cmf" controller="open-ils.cstore" oils_obj:fieldmapper="config::metabib_field" oils_persist:tablename="config.metabib_field">
                <fields oils_persist:primary="id" oils_persist:sequence="config.metabib_field_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="facet_field" oils_obj:array_position="10" oils_persist:virtual="false" reporter:datatype="bool" />
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_METABIB_FIELD" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_METABIB_FIELD" global_required="true"/>
+                <delete permission="DELETE_METABIB_FIELD" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="cam" controller="open-ils.cstore" oils_obj:fieldmapper="config::audience_map" oils_persist:tablename="config.audience_map" reporter:label="Audience Map">
                <fields oils_persist:primary="code" oils_persist:sequence="">
                        <field reporter:label="Audience" name="value" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_AUDIENCE" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_AUDIENCE" global_required="true"/>
+                <delete permission="DELETE_AUDIENCE" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="cifm" controller="open-ils.cstore" oils_obj:fieldmapper="config::item_form_map" oils_persist:tablename="config.item_form_map" reporter:label="Item Form Map">
                <fields oils_persist:primary="code" oils_persist:sequence="">
                        <field reporter:label="Item Form" name="value" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ITEM_FORM" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_ITEM_FORM" global_required="true"/>
+                <delete permission="DELETE_ITEM_FORM" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="acn" controller="open-ils.cstore" oils_obj:fieldmapper="asset::call_number" oils_persist:tablename="asset.call_number" reporter:label="Call Number/Volume">
                <fields oils_persist:primary="id" oils_persist:sequence="asset.call_number_id_seq">
                        <link field="notes" reltype="has_many" key="call_number" map="" class="acnn"/>
                        <link field="copies" reltype="has_many" key="call_number" map="" class="acp"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_VOLUME" context_field="owning_lib"/>
+                <retrieve/>
+                <update permission="UPDATE_VOLUME" context_field="owning_lib"/>
+                <delete permission="DELETE_VOLUME" context_field="owning_lib"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="cst" controller="open-ils.cstore" oils_obj:fieldmapper="config::standing" oils_persist:tablename="config.standing">
                <fields oils_persist:primary="id" oils_persist:sequence="config.standing_id_seq">
                        <link field="collector" reltype="has_a" key="id" map="" class="au"/>
                        <link field="location" reltype="has_a" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="money.collections_tracker.create" context_field="location"/>
+                <retrieve/>
+                <delete permission="money.collections_tracker.create" context_field="location"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="bre" controller="open-ils.cstore" oils_obj:fieldmapper="biblio::record_entry" oils_persist:tablename="biblio.record_entry" reporter:core="true" reporter:label="Bibliographic Record">
                <fields oils_persist:primary="id" oils_persist:sequence="biblio.record_entry_id_seq">
                        <link field="series_field_entries" reltype="has_many" key="source" map="" class="msefe"/>
                        <link field="full_record_entries" reltype="has_many" key="record" map="" class="mfr"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_MARC|IMPORT_MARC" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_MARC" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="aouhoo" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_unit::hours_of_operation" oils_persist:tablename="actor.hours_of_operation">
                <fields oils_persist:primary="id" oils_persist:sequence="">
                <links>
                        <link field="org_unit" reltype="might_have" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_HOURS_OF_OPERATION" context_field="org_unit"/>
+                <retrieve/>
+                <update permission="UPDATE_HOURS_OF_OPERATION" context_field="org_unit"/>
+                <delete permission="DELETE_HOURS_OF_OPERATION" context_field="org_unit"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="aoucd" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_unit::closed_date" oils_persist:tablename="actor.org_unit_closed">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.org_unit_closed_id_seq">
                <links>
                        <link field="org_unit" reltype="has_a" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ORG_UNIT_CLOSING" context_field="org_unit"/>
+                <retrieve/>
+                <update permission="UPDATE_ORG_UNIT_CLOSING" context_field="org_unit"/>
+                <delete permission="DELETE_ORG_UNIT_CLOSING" context_field="org_unit"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="crcd" controller="open-ils.cstore" oils_obj:fieldmapper="config::rules::circ_duration" oils_persist:tablename="config.rule_circ_duration">
                <fields oils_persist:primary="id" oils_persist:sequence="config.rule_circ_duration_id_seq">
                </fields>
                <links>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_CIRC_DURATION" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_CIRC_DURATION" global_required="true"/>
+                <delete permission="DELETE_CIRC_DURATION" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="mobts" controller="open-ils.cstore" oils_obj:fieldmapper="money::open_billable_transaction_summary" oils_persist:tablename="money.open_billable_xact_summary">
                <fields oils_persist:primary="id" oils_persist:sequence="">
                        <link field="owning_copy" reltype="has_a" key="id" map="" class="acp"/>
                        <link field="creator" reltype="has_a" key="id" map="" class="au"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_COPY_NOTE">
+                    <context link="owning_copy" field="circ_lib"/>
+                </create>
+                <retrieve permission="VIEW_COPY_NOTES">
+                    <context link="owning_copy" field="circ_lib"/>
+                </retrieve>
+                <update permission="UPDATE_COPY_NOTE">
+                    <context link="owning_copy" field="circ_lib"/>
+                </update>
+                <delete permission="DELETE_COPY_NOTE">
+                    <context link="owning_copy" field="circ_lib"/>
+                </delete>
+            </actions>
+        </permacrud>
        </class>
        <class id="mfr" controller="open-ils.cstore" oils_obj:fieldmapper="metabib::full_rec" oils_persist:tablename="metabib.full_rec" reporter:label="Flattened MARC Fields">
                <fields oils_persist:primary="id" oils_persist:sequence="metabib.full_rec_id_seq">
                        <field name="name" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_NET_ACCESS_LEVEL" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_NET_ACCESS_LEVEL" global_required="true"/>
+                <delete permission="DELETE_NET_ACCESS_LEVEL" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ppl" controller="open-ils.cstore" oils_obj:fieldmapper="permission::perm_list" oils_persist:tablename="permission.perm_list">
                <fields oils_persist:primary="id" oils_persist:sequence="permission.perm_list_id_seq">
                        <field name="id" oils_obj:array_position="5" oils_persist:virtual="false" reporter:selector="code" reporter:datatype="id"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_PERM" global_required="true"/>
+                <retrieve permission="CREATE_PERM|UPDATE_PERM|DELETE_PERM" global_required="true"/>
+                <update permission="UPDATE_PERM" global_required="true"/>
+                <delete permission="DELETE_PERM" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="mmrsm" controller="open-ils.cstore" oils_obj:fieldmapper="metabib::metarecord_source_map" oils_persist:tablename="metabib.metarecord_source_map">
                <fields oils_persist:primary="id" oils_persist:sequence="metabib.metarecord_source_map_id_seq">
                        <link field="record" reltype="has_a" key="id" map="" class="bre"/>
                        <link field="item_lang" reltype="has_a" key="code" map="" class="clm"/>
                        <link field="item_type" reltype="has_a" key="code" map="" class="citm"/>
+                       <link field="bib_level" reltype="has_a" key="code" map="" class="cblvl"/>
                        <link field="item_form" reltype="has_a" key="code" map="" class="cifm"/>
                        <link field="audience" reltype="has_a" key="code" map="" class="cam"/>
                        <link field="lit_form" reltype="has_a" key="code" map="" class="clfm"/>
                        <field name="name" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_COPY_STATUS" global_required="true"/>
+                <retrieve permission="CREATE_COPY_STATUS|UPDATE_COPY_STATUS|DELETE_COPY_STATUS" global_required="true"/>
+                <update permission="UPDATE_COPY_STATUS" global_required="true"/>
+                <delete permission="DELETE_COPY_STATUS" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ausp" controller="open-ils.cstore" oils_obj:fieldmapper="actor::user_standing_penalty" oils_persist:tablename="actor.usr_standing_penalty">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.usr_standing_penalty_id_seq">
                <links>
                        <link field="call_number" reltype="has_a" key="id" map="" class="acn"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_VOLUME_NOTE">
+                    <context link="call_number" field="owning_lib"/>
+                </create>
+                <retrieve permission="VIEW_VOLUME_NOTES">
+                    <context link="call_number" field="owning_lib"/>
+                </retrieve>
+                <update permission="UPDATE_VOLUME_NOTE">
+                    <context link="call_number" field="owning_lib"/>
+                </update>
+                <delete permission="DELETE_VOLUME_NOTE">
+                    <context link="call_number" field="owning_lib"/>
+                </delete>
+            </actions>
+        </permacrud>
        </class>
        <class id="arn" controller="open-ils.cstore" oils_obj:fieldmapper="authority::record_note" oils_persist:tablename="authority.record_note">
                <fields oils_persist:primary="id" oils_persist:sequence="authority.record_note_id_seq">
                <links>
                        <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_COPY_LOCATION" context_field="owning_lib"/>
+                <retrieve/>
+                <update permission="UPDATE_COPY_LOCATION" context_field="owning_lib"/>
+                <delete permission="DELETE_COPY_LOCATION" context_field="owning_lib"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ascecm" controller="open-ils.cstore" oils_obj:fieldmapper="asset::stat_cat_entry_copy_map" oils_persist:tablename="asset.stat_cat_entry_copy_map">
                <fields oils_persist:primary="id" oils_persist:sequence="asset.stat_cat_entry_copy_map_id_seq">
                </links>
        </class>
        <class id="citm" controller="open-ils.cstore" oils_obj:fieldmapper="config::item_type_map" oils_persist:tablename="config.item_type_map" reporter:label="Item Type Map">
-               <fields oils_persist:primary="code" oils_persist:sequence="">
+               <fields oils_persist:primary="code">
                        <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="Item Type" name="value" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ITEM_TYPE" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_ITEM_TYPE" global_required="true"/>
+                <delete permission="DELETE_ITEM_TYPE" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+       <class id="cblvl" controller="open-ils.cstore" oils_obj:fieldmapper="config::bib_level_map" oils_persist:tablename="config.bib_level_map" reporter:label="Bib Level Map">
+               <fields oils_persist:primary="code">
+                       <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="Bib Level Code" name="code" oils_obj:array_position="3" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Bib Level" name="value" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text" oils_persist:i18n="true"/>
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_BIB_LEVEL" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_BIB_LEVEL" global_required="true"/>
+                <delete permission="DELETE_BIB_LEVEL" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+       <class id="sra" controller="open-ils.cstore" oils_obj:fieldmapper="search::relevance_adjustment" oils_persist:tablename="search.relevance_adjustment" reporter:label="Relevance Adjustment">
+               <fields oils_persist:primary="id" oils_persist:sequence="search.relevance_adjustment_id_seq">
+                       <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="Active" name="active" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="bool"/>
+                       <field reporter:label="Index Field" name="field" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="link"/>
+                       <field reporter:label="Bump Type" name="bump" oils_obj:array_position="6" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Multiplier" name="multiplier" oils_obj:array_position="7" oils_persist:virtual="false"  reporter:datatype="number"/>
+               </fields>
+               <links>
+            <link field="field" reltype="has_a" key="id" map="" class="cmf"/>
+        </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_RELEVANCE_ADJUSTMENT" global_required="true"/>
+                <retrieve permission="CREATE_RELEVANCE_ADJUSTMENT|UPDATE_RELEVANCE_ADJUSTMENT|DELETE_RELEVANCE_ADJUSTMENT" global_required="true"/>
+                <update permission="UPDATE_RELEVANCE_ADJUSTMENT" global_required="true"/>
+                <delete permission="DELETE_RELEVANCE_ADJUSTMENT" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+       <class id="lasso" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_lasso" oils_persist:tablename="actor.org_lasso">
+               <fields oils_persist:primary="id" oils_persist:sequence="actor.org_lasso_id_seq">
+                       <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 name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="name" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_LASSO" global_required="true"/>
+                <retrieve permission="CREATE_LASSO|UPDATE_LASSO|DELETE_LASSO" global_required="true"/>
+                <update permission="UPDATE_LASSO" global_required="true"/>
+                <delete permission="DELETE_LASSO" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+       <class id="lmap" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_lasso_map" oils_persist:tablename="actor.org_lasso_map">
+               <fields oils_persist:primary="id" oils_persist:sequence="actor.org_lasso_map_id_seq">
+                       <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 name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="lasso" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="org_unit" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+               </fields>
+               <links>
+                       <link field="lasso" reltype="has_a" key="id" map="" class="lasso"/>
+                       <link field="org_unit" reltype="has_a" key="id" map="" class="aou"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_LASSO_MAP" global_required="true"/>
+                <retrieve permission="CREATE_LASSO_MAP|UPDATE_LASSO_MAP|DELETE_LASSO_MAP" global_required="true"/>
+                <update permission="UPDATE_LASSO_MAP" global_required="true"/>
+                <delete permission="DELETE_LASSO_MAP" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="aoup" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_unit_proximity" oils_persist:tablename="actor.org_unit_proximity">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.org_unit_proximity_id_seq">
                        <link field="to_org" reltype="has_a" key="id" map="" class="aou"/>
                </links>
        </class>
+       <class id="ssr" controller="open-ils.cstore" oils_obj:fieldmapper="search::search_result" oils_persist:tablename="search.search_result" oils_persist:readonly="true">
+               <fields oils_persist:primary="id" oils_persist:sequence="actor.org_unit_proximity_id_seq">
+                       <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="Relevance" name="rel" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="float"/>
+                       <field reporter:label="Record" name="record" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Total Results" name="total" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="int" />
+                       <field reporter:label="Checked" name="checked" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Visible" name="visible" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Deleted" name="deleted" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="int"/>
+                       <field reporter:label="Excluded" name="excluded" oils_obj:array_position="10" oils_persist:virtual="false" reporter:datatype="int"/>
+               </fields>
+               <links/>
+       </class>
        <class id="asv" controller="open-ils.cstore" oils_obj:fieldmapper="action::survey" oils_persist:tablename="action.survey" reporter:label="Survey">
                <fields oils_persist:primary="id" oils_persist:sequence="action.survey_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <link field="responses" reltype="has_many" key="survey" map="" class="asvr"/>
                        <link field="questions" reltype="has_many" key="survey" map="" class="asvq"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_SURVEY" context_field="owner"/>
+                <retrieve/>
+                <update permission="UPDATE_SURVEY" context_field="owner"/>
+                <delete permission="DELETE_SURVEY" context_field="owner"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="aoa" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_address" oils_persist:tablename="actor.org_address">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.org_address_id_seq">
                <links>
                        <link field="org_unit" reltype="has_a" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ORG_ADDRESS" context_field="org_unit"/>
+                <retrieve/>
+                <update permission="UPDATE_ORG_ADDRESS" context_field="org_unit"/>
+                <delete permission="DELETE_ORG_ADDRESS" context_field="org_unit"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ahr" controller="open-ils.cstore" oils_obj:fieldmapper="action::hold_request" oils_persist:tablename="action.hold_request" reporter:core="true" reporter:label="Hold Request">
                <fields oils_persist:primary="id" oils_persist:sequence="action.hold_request_id_seq">
                        <link field="bib_rec" reltype="might_have" key="id" map="" class="rhrr"/>
                </links>
        </class>
-       <class id="aou" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_unit" oils_persist:tablename="actor.org_unit" reporter:label="Organizational Unit">
+       <class id="aou" controller="open-ils.cstore" oils_obj:fieldmapper="actor::org_unit" oils_persist:tablename="actor.org_unit" reporter:label="Organizational Unit" oils_persist:field_safe="true">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.org_unit_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
                        <link field="checkins" reltype="has_many" key="checkin_lib" map="" class="circ"/>
                        <link field="workstations" reltype="has_many" key="owning_lib" map="" class="aws"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ORG_UNIT" context_field="parent_ou"/>
+                <retrieve permission="CREATE_ORG_UNIT|UPDATE_ORG_UNIT|DELETE_ORG_UNIT">
+                    <context field="id"/>
+                    <context field="parent_ou"/>
+                               </retrieve>
+                <update permission="UPDATE_ORG_UNIT" context_field="id"/>
+                <delete permission="DELETE_ORG_UNIT" context_field="parent_ou"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ccnb" controller="open-ils.cstore" oils_obj:fieldmapper="container::call_number_bucket" oils_persist:tablename="container.call_number_bucket">
                <fields oils_persist:primary="id" oils_persist:sequence="container.call_number_bucket_id_seq">
                        <link field="children" reltype="has_many" key="parent" map="" class="aout"/>
                        <link field="org_units" reltype="has_many" key="ou_type" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_ORG_TYPE" global_required="true"/>
+                <retrieve permission="CREATE_ORG_UNIT|UPDATE_ORG_UNIT|DELETE_ORG_UNIT" global_required="true"/>
+                <update permission="UPDATE_ORG_TYPE" global_required="true"/>
+                <delete permission="DELETE_ORG_TYPE" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="bren" controller="open-ils.cstore" oils_obj:fieldmapper="biblio::record_note" oils_persist:tablename="biblio.record_note">
                <fields oils_persist:primary="id" oils_persist:sequence="biblio.record_note_id_seq">
                        <field reporter:label="LitF Name" name="value" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_LIT_FORM" global_required="true"/>
+                <retrieve/>
+                <update permission="UPDATE_LIT_FORM" global_required="true"/>
+                <delete permission="DELETE_LIT_FORM" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="mwp" controller="open-ils.cstore" oils_obj:fieldmapper="money::work_payment" oils_persist:tablename="money.work_payment" reporter:label="Work Payment">
                <fields oils_persist:primary="id" oils_persist:sequence="money.payment_id_seq">
                        <link field="parent" reltype="has_a" key="id" map="" class="pgt"/>
                        <link field="children" reltype="has_many" key="parent" map="" class="pgt"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_PERM" global_required="true"/>
+                <retrieve permission="CREATE_PERM|UPDATE_PERM|DELETE_PERM" global_required="true"/>
+                <update permission="UPDATE_PERM" global_required="true"/>
+                <delete permission="DELETE_PERM" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="asva" controller="open-ils.cstore" oils_obj:fieldmapper="action::survey_answer" oils_persist:tablename="action.survey_answer" reporter:label="Survey Answer">
                <fields oils_persist:primary="id" oils_persist:sequence="action.survey_answer_id_seq">
                        <link field="grp" reltype="has_a" key="id" map="" class="pgt"/>
                        <link field="perm" reltype="has_a" key="id" map="" class="ppl"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ASSIGN_GROUP_PERM" global_required="true"/>
+                <retrieve permission="ASSIGN_GROUP_PERM|UPDATE_GROUP_PERM|REMOVE_GROUP_PERM" global_required="true"/>
+                <update permission="UPDATE_GROUP_PERM" global_required="true"/>
+                <delete permission="REMOVE_GROUP_PERM" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
        <class id="ccb" controller="open-ils.cstore" oils_obj:fieldmapper="container::copy_bucket" oils_persist:tablename="container.copy_bucket">
                <fields oils_persist:primary="id" oils_persist:sequence="container.copy_bucket_id_seq">
                        <link field="usr" reltype="has_a" key="id" map="" class="au"/>
                </links>
        </class>
-       <class id="i18n" controller="open-ils.cstore" oils_obj:fieldmapper="config::i18n_core" oils_persist:tablename="config.i18n_core">
-               <fields oils_persist:primary="id" oils_persist:sequence="config.i18n_core_id_se">
+       <class id="i18n" controller="open-ils.cstore" oils_obj:fieldmapper="config::i18n_core" oils_persist:tablename="config.i18n_core" oils_persist:field_safe="true">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.i18n_core_id_seq">
                        <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 name="string" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="CREATE_TRANSLATION" global_required="true"/>
+                <retrieve permission="CREATE_TRANSLATION|UPDATE_TRANSLATION|DELETE_TRANSLATION" global_required="true"/>
+                <update permission="UPDATE_TRANSLATION" global_required="true"/>
+                <delete permission="DELETE_TRANSLATION" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
 
        <class id="acqct" controller="open-ils.cstore open-ils.reporter-store" oils_obj:fieldmapper="acq::currency_type" oils_persist:tablename="acq.currency_type">
                </links>
        </class>
 
+    <class id="rocit" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::classic_item_list" oils_persist:tablename="reporter.classic_item_list" reporter:core="true" reporter:label="Classic Item List">
+        <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="Title" name="title" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Author" name="author" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Pubdate" name="pubdate" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Copy ID" name="id" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="id"/>
+            <field reporter:label="Price" name="price" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="money"/>
+            <field reporter:label="Barcode" name="barcode" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Callnumber Label" name="call_number_label" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Dewy Tens" name="dewey_block_tens" oils_obj:array_position="10" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Dewy Hundreds" name="dewey_block_hundreds" oils_obj:array_position="11" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Use Count" name="use_count" oils_obj:array_position="12" oils_persist:virtual="false" reporter:datatype="int"/>
+            <field reporter:label="Circ Modifier" name="circ_modifier" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Shelving Location Name" name="shelving_location" oils_obj:array_position="14" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Legacy Stat Cat 1" name="stat_cat_1" oils_obj:array_position="15" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Legacy Stat Cat 2" name="stat_cat_2" oils_obj:array_position="16" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Legacy Stat Cat 1 Value" name="stat_cat_1_value" oils_obj:array_position="17" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Legacy Stat Cat 2 Value" name="stat_cat_2_value" oils_obj:array_position="18" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Edit Date" name="edit_date" oils_obj:array_position="19" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+            <field reporter:label="Create Date" name="create_date" oils_obj:array_position="20" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+            <field reporter:label="Owning Lib Name" name="owning_lib_name" oils_obj:array_position="21" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Circ Lib Name" name="circ_lib_name" oils_obj:array_position="22" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Owning Lib" name="owning_lib" oils_obj:array_position="23" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Circ Lib" name="circ_lib" oils_obj:array_position="24" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Creator" name="creator" oils_obj:array_position="25" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Age Protection" name="age_protect" oils_obj:array_position="26" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="OPAC Visible" name="opac_visible" oils_obj:array_position="27" oils_persist:virtual="false" reporter:datatype="bool"/>
+            <field reporter:label="Reference" name="ref" oils_obj:array_position="28" oils_persist:virtual="false" reporter:datatype="bool"/>
+            <field reporter:label="Deposit Amount" name="deposit_amount" oils_obj:array_position="29" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Deleted" name="deleted" oils_obj:array_position="30" oils_persist:virtual="false" reporter:datatype="bool"/>
+            <field reporter:label="TCN" name="tcn_value" oils_obj:array_position="31" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Status" name="status" oils_obj:array_position="32" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Stop Fines Reason" name="stop_fines" oils_obj:array_position="33" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Due Date" name="due_date" oils_obj:array_position="34" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+            <field reporter:label="Patron Barcode" name="patron_barcode" oils_obj:array_position="35" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Patron Name" name="patron_name" oils_obj:array_position="36" oils_persist:virtual="false" reporter:datatype="text"/>
+        </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"/>
+            <link field="creator" reltype="has_a" key="id" map="" class="au"/>
+            <link field="age_protect" reltype="has_a" key="id" map="" class="crahp"/>
+            <link field="status" reltype="has_a" key="id" map="" class="ccs"/>
+        </links>
+    </class>
 
        <!-- ********************************************************************************************************************* -->
 
index 9e807c0..e1a2c65 100644 (file)
@@ -82,7 +82,7 @@
                                <scripts>
                                        <path>/openils/var/</path>
                                        <item_config>circ/circ_item_config.js</item_config>
-                               <scripts>
+                               </scripts>
 
                        </implementation_config>
        
index 87accd9..f3d8d30 100644 (file)
@@ -2,12 +2,13 @@
 
 <!-- 
 Example opensrf config file for OpenILS
+vim:et:ts=4:sw=4:
 -->
 
-<opensrf version='0.0.2'>
+<opensrf version='0.0.3'>
 
     <default>
-           
+
         <dirs>
             <log>/openils/var/log</log> <!-- unix::server log files -->
             <sock>/openils/var/sock</sock> <!-- unix::server sock files -->
@@ -17,34 +18,36 @@ Example opensrf config file for OpenILS
             <script_lib>/openils/var</script_lib>
         </dirs>
 
-       <!-- global data visibility settings -->
+        <!-- global data visibility settings -->
         <share>
-               <user>
-                       <!-- Set to "true" to require patron opt-in for foreign (non-home_ou) transactions -->
-                       <opt_in>false</opt_in>
-               </user>
-       </share>
+            <user>
+                <!-- Set to "true" to require patron opt-in for foreign (non-home_ou) transactions -->
+                <opt_in>false</opt_in>
+            </user>
+        </share>
 
         <IDL>/openils/conf/fm_IDL.xml</IDL> <!-- top level IDL file -->
 
         <server_type>prefork</server_type> <!-- net::server type -->
 
         <ils_events>/openils/var/data/ils_events.xml</ils_events> <!-- ILS events description file -->
-        
+
         <email_notify>
             <!-- global email notification settings -->
             <template>/openils/var/data/hold_notification_template.example</template>
             <smtp_server>localhost</smtp_server>
 
-            <!-- in most cases, this is overridden by location 
-                specific config settings.  this is just the default -->
+            <!--
+            in most cases, this is overridden by location 
+            specific config settings.  this is just the default
+            -->
             <sender_address>evergreen@localhost</sender_address>
         </email_notify>
 
 
         <reporter>
             <!--
-                Settings for the reporter daemon process 
+            Settings for the reporter daemon process 
             -->
             <setup>
                 <base_uri>https://localhost/reporter/</base_uri>
@@ -93,6 +96,8 @@ Example opensrf config file for OpenILS
                     <host>z3950.loc.gov</host>
                     <port>7090</port>
                     <db>Voyager</db>
+                    <!-- fetch the full record with no holdings. FI is the default -->
+                    <record_format>FI</record_format> 
                     <attrs>
                         <tcn><code>12</code><format>1</format></tcn>
                         <isbn><code>7</code><format>6</format></isbn>
@@ -113,10 +118,10 @@ Example opensrf config file for OpenILS
                     <db>OLUCWorldCat</db>
                     <attrs>
                         <!--
-                            These are directly from the Bib-1 Attribute Set
-                            http://www.loc.gov/z3950/agency/defns/bib1.html
-                            <code> is the "use attribute", <format> is the "structure attribute"
-                            This just puts some friendly names on the data.
+                        These are directly from the Bib-1 Attribute Set
+                        http://www.loc.gov/z3950/agency/defns/bib1.html
+                        <code> is the "use attribute", <format> is the "structure attribute"
+                        This just puts some friendly names on the data.
                         -->
                         <tcn><code>12</code><format>1</format></tcn>
                         <isbn><code>7</code><format>6</format></isbn>
@@ -140,31 +145,39 @@ Example opensrf config file for OpenILS
 
             <!-- load the Amazon added content module -->
             <module>OpenILS::WWW::AddedContent::Amazon</module>
-            <!-- Base URL for Amazon added content fetching.  This URL may
-                need to be shortened when new (read: non-image) content 
-                fetching capabilities are added -->
+            <!--
+            Base URL for Amazon added content fetching.  This URL may
+            need to be shortened when new (read: non-image) content 
+            fetching capabilities are added
+            -->
             <base_url>http://images.amazon.com/images/P/</base_url>
 
-            <!-- Max number of seconds to wait for an added content request to 
-                return data.  Data not returned within the timeout is considered
-                a failure -->
+            <!--
+            Max number of seconds to wait for an added content request to 
+            return data.  Data not returned within the timeout is considered
+            a failure
+            -->
             <timeout>4</timeout>
 
-            <!-- After added content lookups have been disabled due to too many
-                lookup failures, this is the amount of time to wait before
-                we try again -->
+            <!--
+            After added content lookups have been disabled due to too many
+            lookup failures, this is the amount of time to wait before
+            we try again
+            -->
             <retry_timeout>600</retry_timeout>
 
-            <!-- maximum number of consecutive lookup errors a given process can 
-                have before added content lookups are disabled for everyone -->
+            <!--
+            maximum number of consecutive lookup errors a given process can 
+            have before added content lookups are disabled for everyone
+            -->
             <max_errors>4</max_errors>
 
             <!-- If a userid is required to access the added content.. -->
             <userid>MY_USER_ID</userid>
 
             <!--
-                You can add free-form settings here and they will be accessible
-                within the added content module
+            You can add free-form settings here and they will be accessible
+            within the added content module
             -->
 
         </added_content>
@@ -173,7 +186,7 @@ Example opensrf config file for OpenILS
 
         <!-- no apps are enabled globally by default -->
         <activeapps/> 
-        
+
         <cache>
             <!-- memcache servers -->
             <global>
@@ -204,16 +217,20 @@ Example opensrf config file for OpenILS
                 <max_requests>93</max_requests>
 
                 <unix_config>
-                    <!-- maximum number of top level requests coming to 
-                        this child before the child is recycled -->
+                    <!--
+                    maximum number of top level requests coming to 
+                    this child before the child is recycled
+                    -->
                     <max_requests>1000</max_requests>
                     <!-- min children to fork -->
                     <min_children>1</min_children>
                     <!-- max possible children to fork -->
                     <max_children>15</max_children>
 
-                    <!-- C forking implementation does not support 
-                        min/max idle children, but may in the future -->
+                    <!--
+                    C forking implementation does not support 
+                    min/max idle children, but may in the future
+                    -->
 
                     <!-- min idle children -->
                     <min_spare_children>1</min_spare_children>
@@ -256,6 +273,8 @@ Example opensrf config file for OpenILS
                 </unix_config>
                 <app_settings>
                     <marc_html_xsl>oilsMARC21slim2HTML.xsl</marc_html_xsl>
+                    <!-- Default to using staged search -->
+                    <use_staged_search>true</use_staged_search>
                     <!-- zip code database file -->
                     <!--<zips_file>/openils/var/data/zips.txt</zips_file>-->
                 </app_settings>
@@ -500,8 +519,8 @@ Example opensrf config file for OpenILS
                     <script_path>/openils/var/catalog/</script_path>
                     <script_path>/openils/var/web/opac/common/js/</script_path>
                     <scripts>
-                    <biblio_fingerprint>biblio_fingerprint.js</biblio_fingerprint>
-                    <biblio_descriptor>biblio_descriptor.js</biblio_descriptor>
+                        <biblio_fingerprint>biblio_fingerprint.js</biblio_fingerprint>
+                        <biblio_descriptor>biblio_descriptor.js</biblio_descriptor>
                     </scripts>
                 </app_settings>
             </open-ils.ingest>
@@ -658,6 +677,41 @@ Example opensrf config file for OpenILS
                 </app_settings>
             </open-ils.reporter-store>
 
+            <open-ils.permacrud>
+               <keepalive>3</keepalive>
+               <stateless>1</stateless>
+               <language>perl</language>
+               <implementation>OpenILS::Application::PermaCrud</implementation>
+               <max_requests>17</max_requests>
+               <unix_config>
+                  <unix_sock>open-ils.permacrud_unix.sock</unix_sock>
+                  <unix_pid>open-ils.permacrud_unix.pid</unix_pid>
+                  <max_requests>1000</max_requests>
+                  <unix_log>open-ils.permacrud_unix.log</unix_log>
+                  <min_children>5</min_children>
+                  <max_children>15</max_children>
+                  <min_spare_children>3</min_spare_children>
+                  <max_spare_children>5</max_spare_children>
+               </unix_config>
+            </open-ils.permacrud>
+
+            <open-ils.fielder>
+               <keepalive>3</keepalive>
+               <stateless>1</stateless>
+               <language>perl</language>
+               <implementation>OpenILS::Application::Fielder</implementation>
+               <max_requests>17</max_requests>
+               <unix_config>
+                  <unix_sock>open-ils.fielder_unix.sock</unix_sock>
+                  <unix_pid>open-ils.fielder_unix.pid</unix_pid>
+                  <max_requests>1000</max_requests>
+                  <unix_log>open-ils.fielder_unix.log</unix_log>
+                  <min_children>5</min_children>
+                  <max_children>15</max_children>
+                  <min_spare_children>3</min_spare_children>
+                  <max_spare_children>5</max_spare_children>
+               </unix_config>
+            </open-ils.fielder>
 
         </apps>
     </default>
@@ -666,12 +720,12 @@ Example opensrf config file for OpenILS
 
         <localhost> 
             <!-- ^-=- 
-                Should match the fully qualified domain name of the host.
+            Should match the fully qualified domain name of the host.
 
-                On Linux, the output of the following command is authoritative:
-                 $ perl -MNet::Domain -e 'print Net::Domain::hostfqdn();'
+            On Linux, the output of the following command is authoritative:
+            $ perl -MNet::Domain -e 'print Net::Domain::hostfqdn();'
 
-                To use 'localhost' instead, run osrf_ctl.sh with the -l flag
+            To use 'localhost' instead, run osrf_ctl.sh with the -l flag
             -->
 
             <activeapps>
@@ -692,6 +746,8 @@ Example opensrf config file for OpenILS
                 <appname>open-ils.ingest</appname>  
                 <appname>open-ils.reporter</appname>  
                 <appname>open-ils.reporter-store</appname>  
+                <appname>open-ils.permacrud</appname>  
+                <appname>open-ils.fielder</appname>  
             </activeapps>
         </localhost>
     </hosts>
index d5b3530..8d91d99 100644 (file)
@@ -1,4 +1,7 @@
 <?xml version="1.0"?>
+<!-- 
+vim:et:ts=2:sw=2:
+-->
 <config>
 
   <!-- bootstrap config for OpenSRF apps -->
     <!-- The OpenSRF Routers's name on the network -->
     <!-- You should never need to change this -->
     <router_name>router</router_name>
-
     <routers>
-
-      <!-- List of router domains we should register with. 
-        We must at least have our default jabber domain in here -->
       <router>localhost</router>
-
     </routers>
-    <domains>
-
-      <!-- Our jabber domain, currently only one domain is supported -->
-      <domain>localhost</domain>
 
-    </domains>
+    <!-- Our jabber domain -->
+    <domain>localhost</domain>
     <username>client</username>
     <passwd>mypass</passwd>
     <port>5222</port>
     <logfile>/openils/var/log/osrfsys.log</logfile>
 
     <!-- Log to syslog. You can use this same layout for 
-        defining the logging of all services in this file -->
-<!--
+    defining the logging of all services in this file -->
+    <!--
     <logfile>syslog</logfile>
     <syslog>local2</syslog>
     <actlog>local1</actlog>
--->
+    -->
 
     <!-- 0 None, 1 Error, 2 Warning, 3 Info, 4 debug, 5 Internal (Nasty) -->
     <loglevel>3</loglevel>
   <gateway>
 
     <!-- we consider ourselves to be the "originating" client for requests,
-            which means we define the log XID string for log traces -->
+    which means we define the log XID string for log traces -->
     <client>true</client>
 
     <!--  the routers's name on the network -->
     <router_name>router</router_name>
 
     <!-- jabber domains to connect to (domain1, domain2, ...) -->
-    <domains>
-      <domain>localhost</domain>
-    </domains>
+    <domain>localhost</domain>
 
-<!-- These are the services that the gateway will serve. 
-       Any other requests will receive an HTTP_NOT_FOUND (404) 
-       DO NOT put any services here that you don't want the internet to have access to
--->
+    <!-- These are the services that the gateway will serve. 
+    Any other requests will receive an HTTP_NOT_FOUND (404) 
+    DO NOT put any services here that you don't want the internet to have access to
+    -->
     <services>
       <service>opensrf.math</service>
       <service>open-ils.cat</service>
 
   <!-- ======================================================================================== -->
 
-  <router>
+  <routers>
+    <router>
 
-    <!-- do not change -->
-    <component>0</component>
+      <!-- do not change -->
+      <component>0</component>
 
-    <trusted_domains>
+      <trusted_domains>
 
-      <!-- Trusted servers are allowed to register apps with the router -->
-      <server>localhost</server>
+        <!-- Trusted servers are allowed to register apps with the router -->
+        <server>localhost</server>
 
-      <!-- Trusted clients are allowed to send packets through the router -->
-      <client>localhost</client>
+        <!-- Trusted clients are allowed to send packets through the router -->
+        <client>localhost</client>
 
-    </trusted_domains>
+      </trusted_domains>
 
-    <transport>
+      <transport>
 
-      <!-- jabber server are we connecting to -->
-      <server>localhost</server>
-      <port>5222</port>
+        <!-- jabber server are we connecting to -->
+        <server>localhost</server>
+        <port>5222</port>
 
-      <!-- if this is changed, all "router_name" settings 
-                will need to be updated to match this setting -->
-      <username>router</username>
-      <password>mypassword</password>
+        <!-- if this is changed, all "router_name" settings 
+        will need to be updated to match this setting -->
+        <username>router</username>
+        <password>mypassword</password>
 
-      <!-- router's jabber resource -->
-      <!-- do not change this -->
-      <resource>router</resource>
-      <connect_timeout>10</connect_timeout>
-      <max_reconnect_attempts>5</max_reconnect_attempts>
+        <!-- router's jabber resource -->
+        <!-- do not change this -->
+        <resource>router</resource>
+        <connect_timeout>10</connect_timeout>
+        <max_reconnect_attempts>5</max_reconnect_attempts>
 
-    </transport>
-    <logfile>/openils/var/log/router.log</logfile>
-    <loglevel>3</loglevel>
+      </transport>
+      <logfile>/openils/var/log/router.log</logfile>
+      <loglevel>3</loglevel>
+    </router>
 
-  </router>
+  </routers>
 
   <!-- ======================================================================================== -->
 
diff --git a/Open-ILS/examples/opensrf_core.xml.example.multidomain b/Open-ILS/examples/opensrf_core.xml.example.multidomain
new file mode 100644 (file)
index 0000000..5c8050f
--- /dev/null
@@ -0,0 +1,142 @@
+<?xml version='1.0'?>
+<config>
+
+    <!-- Options for <loglevel>: 0 None, 1 Error, 2 Warning, 3 Info, 4 debug -->
+
+       <opensrf>
+
+               <routers>
+            <!-- define the list of routers our services will register with -->
+                       <router>
+                <!-- This is the public router.  On this router, we only register applications
+                     which should be accessible to everyone on the opensrf network -->
+                <name>router</name>
+                <domain>public.localhost</domain>
+                <services>
+                                   <service>opensrf.math</service> 
+                                   <service>open-ils.cat</service> 
+                                   <service>open-ils.supercat</service> 
+                                   <service>open-ils.search</service> 
+                                   <service>open-ils.circ</service> 
+                                   <service>open-ils.actor</service> 
+                                   <service>open-ils.auth</service> 
+                                   <service>open-ils.collections</service>  
+                                   <service>open-ils.reporter</service>  
+                </services>
+            </router>
+
+                       <router>
+                <!-- This is the private router.  All applications must register with 
+                    this router, so no explicit <services> section is required -->
+                <name>router</name>
+                <domain>private.localhost</domain>
+            </router>
+               </routers>
+
+
+        <!-- Our domain should match that of the private router -->
+               <domain>private.localhost</domain>
+               <username>osrf</username>
+               <passwd>osrf</passwd>
+               <port>5222</port>
+
+               <logfile>/openils/var/log/osrfsys.log</logfile>
+        <!--
+               <logfile>syslog</logfile>
+               <syslog>local0</syslog>
+               <actlog>local1</actlog>
+        -->
+               <loglevel>3</loglevel>
+               <settings_config>/openils/conf/opensrf.xml</settings_config>
+       </opensrf>
+
+
+       <!-- The section between <gateway>...</gateway> is a standard OpenSRF C stack config file -->
+       <gateway>
+
+               <client>true</client>
+               <router_name>router</router_name>
+
+        <!-- The gateway connects to the public domain for security -->
+               <domain>public.localhost</domain>
+
+      <!-- this section will be soon deprecated for multi-domain mode... -->
+      <services>
+         <service>opensrf.math</service>
+         <service>opensrf.dbmath</service>
+         <service>open-ils.cat</service>
+         <service>open-ils.search</service>
+         <service>open-ils.circ</service>
+         <service>open-ils.actor</service>
+         <service>open-ils.auth</service>
+         <service>open-ils.collections</service>
+         <service>open-ils.reporter</service>
+      </services>
+
+               <!-- jabber login info -->
+               <username>osrf</username>
+               <passwd>osrf</passwd>
+               <port>5222</port>
+               <loglevel>3</loglevel>
+               <logfile>/openils/var/log/gateway.log</logfile>
+        <!--
+       <logfile>syslog</logfile>
+               <syslog>local6</syslog>
+               <actlog>local1</actlog>
+        -->
+       </gateway>
+
+       <!-- ======================================================================================== -->
+
+    <routers>
+        <router> <!-- public router -->
+            <trusted_domains>
+                <!-- allow private services to register with this router 
+                     and public client to send requests to this router. -->
+                <server>private.localhost</server>
+                <!-- also allow private clients to send to the router so it can receive error messages -->
+                <client>private.localhost</client>
+                <client>public.localhost</client>
+            </trusted_domains>
+            <transport>
+                <server>public.localhost</server>
+                <port>5222</port>
+                <unixpath>/openils/var/sock/unix_sock</unixpath>
+                <username>router</username>
+                <password>osrf</password>
+                <resource>router</resource>
+                <connect_timeout>10</connect_timeout>
+                <max_reconnect_attempts>5</max_reconnect_attempts>
+            </transport>
+            <logfile>syslog</logfile>
+            <syslog>local2</syslog>
+            <loglevel>5</loglevel>
+        </router>
+        <router> <!-- private router -->
+            <trusted_domains>
+                <server>private.localhost</server>
+                <!-- only clients on the private domain can send requests to this router -->
+                <client>private.localhost</client>
+            </trusted_domains>
+            <transport>
+                <server>private.localhost</server>
+                <port>5222</port>
+                <username>router</username>
+                <password>osrf</password>
+                <resource>router</resource>
+                <connect_timeout>10</connect_timeout>
+                <max_reconnect_attempts>5</max_reconnect_attempts>
+            </transport>
+            <logfile>syslog</logfile>
+            <syslog>local2</syslog>
+            <loglevel>4</loglevel>
+        </router>
+    </routers>
+
+       <!-- ======================================================================================== -->
+
+</config>
+
+
+
+
index 8ddcf0a..ded4f01 100644 (file)
@@ -35,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  <xs:complexType>
   <xs:attribute name="link"/>
   <xs:attribute name="field"/>
+  <xs:attribute name="global_requried"/>
  </xs:complexType>
 </xs:element>
 
@@ -46,6 +47,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
   <xs:attribute name="permission" use="required"/>
   <xs:attribute name="context_field"/>
  </xs:complexType>
+ <xs:attribute name="all_perms"/>
+ <xs:attribute name="global_requried"/>
 </xs:element>
 
 <xs:element name="retrieve" nillable="true">
@@ -56,6 +59,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
   <xs:attribute name="permission"/>
   <xs:attribute name="context_field"/>
  </xs:complexType>
+ <xs:attribute name="all_perms"/>
+ <xs:attribute name="global_requried"/>
 </xs:element>
 
 <xs:element name="update" nillable="true">
@@ -66,6 +71,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
   <xs:attribute name="permission" use="required"/>
   <xs:attribute name="context_field"/>
  </xs:complexType>
+ <xs:attribute name="all_perms"/>
+ <xs:attribute name="global_requried"/>
 </xs:element>
 
 <xs:element name="delete" nillable="true">
@@ -76,6 +83,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
   <xs:attribute name="permission" use="required"/>
   <xs:attribute name="context_field"/>
  </xs:complexType>
+ <xs:attribute name="all_perms"/>
+ <xs:attribute name="global_requried"/>
 </xs:element>
 
 <xs:element name="actions">
index ec7082c..130e24e 100644 (file)
@@ -1,7 +1,7 @@
 # vim:noet:ts=4
 
 export LDFLAGS                 += -L . -L$(TMP) -L $(OPENSRF_LIBS)
-export CFLAGS                  += -pipe -g -Wall -O2 -fPIC -I$(LIBXML2_HEADERS) -I$(APACHE2_HEADERS) -I$(APR_HEADERS) \
+export CFLAGS                  += -pipe -g -Wall -O2 -fPIC -I../../include -I$(LIBXML2_HEADERS) -I$(APACHE2_HEADERS) -I$(APR_HEADERS) \
                                -D_LARGEFILE64_SOURCE -I$(LIBXML2_HEADERS)/libxml  -I$(TMP) -I$(OPENSRF_HEADERS)
 
 export INCDIR = "$(INCLUDEDIR)/openils/"
@@ -69,9 +69,13 @@ webcore-install:
        mkdir -p $(ADMINDIR)
        cp -r ../admin/* $(ADMINDIR)
        mkdir -p $(WEBDIR)
+       mkdir -p $(WEBDIR)/js/opensrf/
        mkdir -p $(WEBDIR)/opac/extras/xsl/
        cp -r ../web/* $(WEBDIR)
        cp $(OPENSRF_LIBS)/javascript/* $(WEBDIR)/opac/common/js/
+       # dojo-ified opensrf libs
+       cp $(OPENSRF_LIBS)/javascript/opensrf*js $(WEBDIR)/js/opensrf/
+       cp $(OPENSRF_LIBS)/javascript/DojoSRF.js $(WEBDIR)/js/dojo/
        ln -sf $(WEBDIR)/opac/skin/default/xml/index.xml $(WEBDIR)/opac/skin/default/xml/mresult.xml
        ln -sf $(WEBDIR)/opac/skin/default/xml/index.xml $(WEBDIR)/opac/skin/default/xml/rresult.xml
        ln -sf $(WEBDIR)/opac/skin/default/xml/index.xml $(WEBDIR)/opac/skin/default/xml/rdetail.xml
@@ -105,7 +109,9 @@ autojs-install:
        @echo $@
        cp extras/fieldmapper.pl $(BINDIR)
        cp extras/org_tree_js.pl $(BINDIR)
+       cp extras/org_lasso_js.pl $(BINDIR)
        cp extras/org_tree_html_options.pl $(BINDIR)
+       cp extras/org_tree_proximity.pl $(BINDIR)
        cp extras/autogen.sh $(BINDIR)
        cp support-scripts/offline-blocked-list.pl $(BINDIR) # this should probably be somewhere else
 # -----------------------------------------------------------------------------------
index e7c11b6..8b21951 100644 (file)
@@ -1,21 +1,20 @@
 #include "json_xml.h"
 #include "fieldmapper_lookup.h"
 
-void _rest_xml_output(growing_buffer*, jsonObject*, char*, int, int);
-char* _escape_xml (char*);
+static void _rest_xml_output(growing_buffer*, const jsonObject*, char*, int, int);
+static char* _escape_xml (const char*);
 
 char* json_string_to_xml(char* content) {
        jsonObject * obj;
        growing_buffer * res_xml;
-       char * output;
        int i;
 
        obj = json_parse_string( content );
-       res_xml = buffer_init(1024);
 
        if (!obj)
                return NULL;
        
+       res_xml = buffer_init(1024);
        buffer_add(res_xml, "<response>");
 
        if(obj->type == JSON_ARRAY ) {
@@ -28,15 +27,11 @@ char* json_string_to_xml(char* content) {
 
        buffer_add(res_xml, "</response>");
 
-       output = buffer_data(res_xml);
-       buffer_free(res_xml);
        jsonObjectFree(obj);
-
-       return output;
+       return buffer_release(res_xml);
 }
 
-char* _escape_xml (char* text) {
-       char* out;
+char* _escape_xml (const char* text) {
        growing_buffer* b = buffer_init(256);
        int len = strlen(text);
        int i;
@@ -50,12 +45,11 @@ char* _escape_xml (char* text) {
                else
                        buffer_add_char(b,text[i]);
        }
-       out = buffer_data(b);
-       buffer_free(b);
-       return out;
+       return buffer_release(b);
 }
 
-void _rest_xml_output(growing_buffer* buf, jsonObject* obj, char * obj_class, int arr_index, int notag) {
+static void _rest_xml_output(growing_buffer* buf, const jsonObject* obj,
+               char * obj_class, int arr_index, int notag) {
        char * tag;
        int i;
        
@@ -77,6 +71,7 @@ void _rest_xml_output(growing_buffer* buf, jsonObject* obj, char * obj_class, in
    if(obj->classname) {
        if(obj->type == JSON_NULL) {
                        buffer_fadd(buf,"<%s><Object class_hint=\"%s\"/></%s>", tag, obj->classname, tag);
+                       free(tag);
                        return;
                } else {
                        buffer_fadd(buf,"<%s><Object class_hint=\"%s\">", tag, obj->classname);
index 2752fd0..e59996b 100644 (file)
@@ -3,8 +3,7 @@
 #include <stdio.h>
 
 /* the JSON parser, so we can read the response we're XMLizing */
-#include "objson/object.h"
-#include "objson/json_parser.h"
-#include "utils.h"
+#include <opensrf/osrf_json.h>
+#include <opensrf/utils.h>
 
 char* json_string_to_xml(char*);
diff --git a/Open-ILS/src/apachemods/mod_rest_gateway.c b/Open-ILS/src/apachemods/mod_rest_gateway.c
deleted file mode 100644 (file)
index 8adff62..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-#include "mod_rest_gateway.h"
-#include "http_log.h"
-
-char* ils_rest_gateway_config_file;
-
-static const char* ils_gateway_set_config(cmd_parms *parms, void *config, const char *arg) {
-       ils_gateway_config  *cfg;
-
-       cfg = ap_get_module_config(parms->server->module_config, &ils_rest_gateway_module);
-
-       cfg->configfile = (char*) arg;
-       ils_rest_gateway_config_file = (char*) arg;
-
-       return NULL;
-}
-
-/* tell apache about our commands */
-static const command_rec ils_gateway_cmds[] = {
-       AP_INIT_TAKE1( GATEWAY_CONFIG, ils_gateway_set_config, NULL, RSRC_CONF, "gateway config file"),
-       {NULL}
-};
-
-/* build the config object */
-static void* ils_gateway_create_config( apr_pool_t* p, server_rec* s) {
-       ils_gateway_config* cfg = (ils_gateway_config*) apr_palloc(p, sizeof(ils_gateway_config));
-       cfg->configfile = GATEWAY_DEFAULT_CONFIG;
-       return (void*) cfg;
-}
-
-
-static void mod_ils_gateway_child_init(apr_pool_t *p, server_rec *s) {
-
-       char* cfg = ils_rest_gateway_config_file;
-
-       if( ! osrf_system_bootstrap_client( cfg, CONFIG_CONTEXT) ) {
-               osrfLogError( OSRF_LOG_MARK, "Unable to load gateway config file...");
-               return;
-       }
-       fprintf(stderr, "Bootstrapping %ld\n", (long) getpid() );
-       fflush(stderr);
-}
-
-static int mod_ils_gateway_method_handler (request_rec *r) {
-
-       /* make sure we're needed first thing*/
-       if (strcmp(r->handler, MODULE_NAME )) 
-               return DECLINED;
-
-       osrfLogSetAppname("oils_rest_gw");
-
-       apr_pool_t *p = r->pool;        /* memory pool */
-       char* arg = r->args;                    /* url query string */
-
-       char* service                                   = NULL; /* service to connect to */
-       char* method                                    = NULL; /* method to perform */
-
-       //json* exception                               = NULL; /* returned in error conditions */
-       //jsonObject* exception                         = NULL; /* returned in error conditions */
-       string_array* sarray                    = init_string_array(12); /* method parameters */
-
-       growing_buffer* buffer          = NULL; /* POST data */
-       growing_buffer* tmp_buf         = NULL; /* temp buffer */
-
-       char* key                                               = NULL; /* query item name */
-       char* val                                               = NULL; /* query item value */
-
-        jsonObject* response                    = jsonParseString("{\"status\":0,\"debug\":\"\"}");
-        jsonObject* payload                     = jsonParseString("[]");
-        jsonObjectSetKey(response, "payload", payload );
-
-       /* verify we are connected */
-               if(!osrfSystemGetTransportClient()) {
-               osrfLogError( OSRF_LOG_MARK, "Bootstrap Failed, no transport client");
-               return HTTP_INTERNAL_SERVER_ERROR;
-       }
-
-
-       /* gather the post args and append them to the url query string */
-       if( !strcmp(r->method,"POST") ) {
-
-               ap_setup_client_block(r,REQUEST_CHUNKED_DECHUNK);
-
-               if(! ap_should_client_block(r)) {
-                       osrfLogWarning( OSRF_LOG_MARK, "No Post Body");
-               }
-
-               char body[1025];
-               memset(body, '\0', sizeof(body));
-               buffer = buffer_init(1025);
-
-               while(ap_get_client_block(r, body, 1024)) {
-                       buffer_add( buffer, body );
-                       memset(body, '\0', sizeof(body));
-               }
-
-               if(arg && arg[0]) {
-                       tmp_buf = buffer_init(1024);
-                       buffer_add(tmp_buf,arg);
-                       buffer_add(tmp_buf,buffer->buf);
-                       arg = (char*) apr_pstrdup(p, tmp_buf->buf);
-                       buffer_free(tmp_buf);
-               } else {
-                       arg = (char*) apr_pstrdup(p, buffer->buf);
-               }
-               buffer_free(buffer);
-
-       } 
-
-       ap_log_rerror( APLOG_MARK, APLOG_DEBUG, 0, r, "URL: %s", arg );
-
-
-       if( ! arg || !arg[0] ) { /* we received no request */
-               osrfLogWarning( OSRF_LOG_MARK, "No Args");
-               return OK;
-       }
-
-       r->allowed |= (AP_METHOD_BIT << M_GET);
-       r->allowed |= (AP_METHOD_BIT << M_POST);
-
-       
-       while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
-
-               key = ap_getword(r->pool, (const char**) &val, '=');
-               if(!key || !key[0])
-                       break;
-
-               ap_unescape_url((char*)key);
-               ap_unescape_url((char*)val);
-
-               if(!strcmp(key,"service")) 
-                       service = val;
-
-               if(!strcmp(key,"method"))
-                       method = val;
-
-               if(!strcmp(key,"param"))
-                       string_array_add(sarray, val);
-
-       }
-
-       osrfLogInfo( OSRF_LOG_MARK, "Performing(%ld):  service %s | method %s | \n",
-                       (long) getpid(), service, method );
-
-       int k;
-       for( k = 0; k!= sarray->size; k++ ) {
-               osrfLogInfo( OSRF_LOG_MARK,  "param %s", string_array_get_string(sarray,k));
-       }
-
-       osrf_app_session* session = osrf_app_client_session_init(service);
-
-       osrfLogDebug( OSRF_LOG_MARK, "MOD session service: %s", session->remote_service );
-
-       int req_id = osrfAppSessionMakeRequest( session, NULL, method, 1, sarray );
-       string_array_destroy(sarray);
-
-       osrf_message* omsg = NULL;
-
-       while((omsg = osrfAppSessionRequestRecv( session, req_id, 60 ))) {
-
-                jsonObjectSetKey(response, "status", jsonNewNumberObject(omsg->status_code));
-
-                if( omsg->_result_content ) {
-                        jsonObjectPush( payload, jsonObjectClone(omsg->_result_content));
-
-                } else {
-
-                        char* s = omsg->status_name ? omsg->status_name : "Unknown Error";
-                        char* t = omsg->status_text ? omsg->status_text : "No Error Message";
-                        jsonObjectSetKey(response, "debug", jsonNewObject("\n\n%s:\n%s\n", s, t));
-                        osrfLogError( OSRF_LOG_MARK,  "Gateway received error: %s",
-                                        jsonObjectGetString(jsonObjectGetKeyConst(response, "debug")));
-                        break;
-                }
-
-                osrf_message_free(omsg);
-                omsg = NULL;
-        }
-
-        char* content = jsonObjectToJSON(response);
-       char* xml = json_string_to_xml( content );
-
-       free(content);
-       jsonObjectFree(response);
-
-       
-       /* set content type to text/xml for passing around XML objects */
-       ap_set_content_type(r, "text/xml");
-       ap_rputs(xml,r);
-       free(xml);
-
-       osrf_app_session_request_finish( session, req_id );
-       osrfLogDebug( OSRF_LOG_MARK, "gateway process message successfully");
-
-
-       osrfAppSessionFree(session);
-
-
-       return OK;
-
-}
-
-static void mod_ils_gateway_register_hooks (apr_pool_t *p) {
-       ap_hook_handler(mod_ils_gateway_method_handler, NULL, NULL, APR_HOOK_MIDDLE);
-       ap_hook_child_init(mod_ils_gateway_child_init,NULL,NULL,APR_HOOK_MIDDLE);
-}
-
-
-module AP_MODULE_DECLARE_DATA ils_rest_gateway_module = {
-       STANDARD20_MODULE_STUFF,
-       NULL,
-       NULL,
-       ils_gateway_create_config,
-       NULL,
-       ils_gateway_cmds,
-       mod_ils_gateway_register_hooks,
-};
-
diff --git a/Open-ILS/src/apachemods/mod_rest_gateway.h b/Open-ILS/src/apachemods/mod_rest_gateway.h
deleted file mode 100644 (file)
index 571e3d6..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "httpd.h"
-#include "http_config.h"
-#include "http_core.h"
-#include "http_protocol.h"
-//#include "apr_compat.h"
-#include "apr_strings.h"
-
-/* our stuff */
-#include "opensrf/transport_client.h"
-#include "opensrf/osrf_message.h"
-#include "opensrf/osrf_app_session.h"
-#include "string_array.h"
-#include "md5.h"
-#include "objson/object.h"
-#include "objson/json_parser.h"
-
-#include "json_xml.h"
-#define GATEWAY_CONFIG "ILSRestGatewayConfig"
-#define MODULE_NAME "ils_rest_gateway_module"
-#define CONFIG_CONTEXT "gateway"
-
-#define GATEWAY_DEFAULT_CONFIG "/openils/conf/opensrf_core.xml"
-
-
-/* our config structure */
-typedef struct { 
-       char* configfile;  /* our bootstrap config file */
-} ils_gateway_config;
-
-module AP_MODULE_DECLARE_DATA ils_rest_gateway_module;
-
diff --git a/Open-ILS/src/apachemods/mod_xmlbuilder.c b/Open-ILS/src/apachemods/mod_xmlbuilder.c
deleted file mode 100644 (file)
index 7c316ff..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-#include "mod_xmlbuilder.h"
-
-char* __xmlBuilderDynamicLocale        = NULL;
-request_rec* currentRec = NULL;
-
-
-/* set the base DTD directory */
-static const char* xmlBuilderSetBaseDir(cmd_parms *params, void *cfg, const char *arg) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->baseDir = (char*) arg;
-       return NULL;
-}
-
-static const char* xmlBuilderSetDefaultLocale(
-                                        cmd_parms* params, void* cfg, const char* arg ) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->defaultLocale = (char*) arg;
-       return NULL;
-}
-
-static const char* xmlBuilderSetDefaultDtd(
-                                        cmd_parms* params, void* cfg, const char* arg ) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->defaultDtd = (char*) arg;
-       if( config->defaultDtd ) {
-               if(!strcmp(config->defaultDtd,"NULL"))
-                       config->defaultDtd = NULL;
-       }
-       return NULL;
-}
-
-
-static const char* xmlBuilderSetLocaleParam(
-                                        cmd_parms* params, void* cfg, const char* arg ) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->localeParam = (char*) arg;
-       return NULL;
-}
-
-
-static const char* xmlBuilderSetPostXSL(
-                                        cmd_parms* params, void* cfg, const char* arg ) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->postXSL = xsltParseStylesheetFile((xmlChar*) arg);
-       if( config->postXSL == NULL ) 
-               apacheDebug("Unable to parse postXSL stylesheet: %s.  No postXSL will be performed", arg);      
-       return NULL;
-}
-
-static const char* xmlBuilderSetContentType(
-                                        cmd_parms* params, void* cfg, const char* arg ) {
-       xmlBuilderConfig* config = ap_get_module_config(
-               params->server->module_config, &xmlbuilder_module );
-       config->contentType = (char*) arg;
-       return NULL;
-}
-
-// ACCESS_CONF - OR_ALL ?
-static const command_rec xmlBuilderCommands[] = {
-       AP_INIT_TAKE1( MODXMLB_CONFIG_LOCALE, 
-                       xmlBuilderSetDefaultLocale, NULL, RSRC_CONF, "Default Locale"),
-       AP_INIT_TAKE1( MODXMLB_CONFIG_BASE_DIR, 
-                       xmlBuilderSetBaseDir, NULL, RSRC_CONF, "Base Directory"),
-       AP_INIT_TAKE1( MODXMLB_CONFIG_POST_XSL, 
-                       xmlBuilderSetPostXSL, NULL, RSRC_CONF, "Post XSL"),
-       AP_INIT_TAKE1( MODXMLB_CONFIG_DEFAULT_DTD, 
-                       xmlBuilderSetDefaultDtd, NULL, RSRC_CONF, "Default DTD"),
-       AP_INIT_TAKE1( MODXMLB_CONFIG_LOCALE_PARAM,
-                       xmlBuilderSetLocaleParam, NULL, RSRC_CONF, "Locale URL param name"),
-       AP_INIT_TAKE1( MODXMLB_CONFIG_CONTENT_TYPE,
-                       xmlBuilderSetContentType, NULL, RSRC_CONF, "Content Type"),
-       {NULL}
-};
-
-static void* xmlBuilderCreateConfig( apr_pool_t* p, server_rec* s ) {
-       xmlBuilderConfig* config = 
-               (xmlBuilderConfig*) apr_palloc( p, sizeof(xmlBuilderConfig) );
-       config->baseDir                 = MODXMLB_DEFAULT_BASE_DIR;
-       config->defaultLocale   = MODXMLB_DEFAULT_LOCALE;
-       config->defaultDtd              = NULL;
-       config->postXSL                 = NULL;
-       config->contentType             = NULL;
-       config->localeParam             = MODXMLB_DEFAULT_LOCALE_PARAM;
-       return (void*) config;
-}
-
-
-/* Child Init handler  ----------------------------------------------------------- */
-static void xmlBuilderChildInit( apr_pool_t *p, server_rec *s ) {
-}
-
-static int xmlBuilderHandler( request_rec* r ) {
-
-       if( strcmp(r->handler, MODULE_NAME ) ) return DECLINED;
-       currentRec = r;
-
-       xmlBuilderConfig* config = ap_get_module_config( 
-                       r->server->module_config, &xmlbuilder_module );
-
-       /*
-       xmlBuilderConfig* config = ap_get_module_config( 
-                       r->per_dir_config, &xmlbuilder_module );
-                       */
-
-       if(config == NULL) {
-               ap_log_rerror( APLOG_MARK, APLOG_ERR, 0, currentRec,
-                               "config is nulll...");
-               return HTTP_INTERNAL_SERVER_ERROR; 
-       }
-       
-       r->allowed |= (AP_METHOD_BIT << M_GET);
-       r->allowed |= (AP_METHOD_BIT << M_POST);
-       char* ct = config->contentType;
-
-
-       if(!config->contentType) ct = "text/html; charset=utf-8";
-       /* ---------------------------------- */
-       // Hack to force XUL mime type (until config is fixed)
-       char* f = r->filename;
-       if(f) {
-               int l = strlen(f);
-               if(l > 4) {
-                       if( !strcmp( f + (l - 4), ".xul"))
-                               ct = "application/vnd.mozilla.xul+xml";
-               }
-       }
-       /* ---------------------------------- */
-
-       ap_set_content_type(r, ct);
-
-       //ap_table_set(r->headers_out, "Cache-Control", "max-age=15552000");
-
-       char* dates = apr_pcalloc(r->pool, MAX_STRING_LEN);
-       apr_rfc822_date(dates, apr_time_now() + 604800000000); /* cache for one week */
-       ap_table_set(r->headers_out, "Expires", dates);
-
-       apr_rfc822_date(dates, apr_time_now()); /* cache for one week */
-       ap_table_set(r->headers_out, "Date", dates);
-
-
-       /*
-       char expire_hdr[APR_RFC822_DATE_LEN];
-        apr_rfc822_date(expire_hdr, (apr_time_t)(time(NULL) + 15552000));
-       ap_table_set(r->headers_out, "Expires", expire_hdr);
-        */
-
-       string_array* params = apacheParseParms(r);
-       char* locale = apacheGetFirstParamValue(params, config->localeParam);
-       if(locale) __xmlBuilderDynamicLocale = locale;
-       char* XMLFile = r->filename;
-
-       xmlDocPtr doc = xmlBuilderProcessFile( XMLFile, config );
-       if(!doc) return apacheError( "Unable to parse XML file %s", XMLFile );
-
-       /* apply the post XSL */
-       if(config->postXSL) {
-               xmlDocPtr newdoc;
-               newdoc = xsltApplyStylesheet(config->postXSL, doc, NULL );
-
-               if(newdoc == NULL) {
-                       apacheDebug("Error applying postXSL... skipping.");
-               } else {
-                       xmlFreeDoc(doc);
-                       doc = newdoc;
-               }
-       }
-
-       char* docXML = xmlDocToString( doc, 1 );
-       //apacheDebug("DOC:\n%s\n%s", docXML);
-       ap_rputs(docXML, r);
-       free(docXML);
-       xmlFreeDoc( doc );
-       doc = NULL;
-       //xmlCleanupCharEncodingHandlers();
-       //xmlCleanupParser();
-
-       return OK;
-}
-
-
-/* frees the collected DTD's */
-static void __xmlBuilderFreeDtdHash( char* key, void* item ) {
-       if(!item) return;
-       xmlFreeDtd( item );
-}
-
-
-xmlDocPtr xmlBuilderProcessFile( char* filename, xmlBuilderConfig* config ) {
-       if(!filename) { 
-               apacheError( "No XML file provided" ); return NULL; }
-
-       xmlBuilderContext context;
-       context.config          = config;
-       context.doc                     = xmlNewDoc( BAD_CAST "1.0" );
-       context.dtdHash = osrfNewHash();
-       context.entHash = osrfNewHash();
-       context.nodeList        = osrfNewList();
-       context.xmlError        = 0;
-       context.xmlFile = filename;
-       context.dtdHash->freeItem = &__xmlBuilderFreeDtdHash;
-
-               
-       /*
-       ap_log_rerror( APLOG_MARK, APLOG_DEBUG, 0, currentRec,
-                       "xmlBuilderProcessFile() Options: "
-                       "XMLBuilderDefaultLocale : %s |  XMLBuilderBaseDir : %s | "
-         "XMLBuilderDefaultDTD : %s | XMLBuilderLocaleParam : %s",
-                       config->defaultLocale, config->baseDir, config->defaultDtd, config->localeParam );
-                       */
-
-       /* pre-parse the default dtd if defined */
-       if( config->defaultDtd ) 
-               xmlBuilderAddDtd( config->defaultDtd, &context );
-
-       xmlParserCtxtPtr parserCtx;
-
-       parserCtx = xmlCreatePushParserCtxt(xmlBuilderSaxHandler, &context, "", 0, NULL);
-       xmlCtxtReadFile( parserCtx, filename, NULL, XML_PARSE_RECOVER );
-
-       xmlFreeParserCtxt( parserCtx );
-       osrfListFree(context.nodeList);
-       osrfHashFree(context.entHash);
-       osrfHashFree(context.dtdHash);
-       return context.doc;
-}
-
-
-void xmlBuilderStartElement( void* context, const xmlChar *name, const xmlChar **atts ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) context;
-
-       xmlNodePtr node = NULL;
-
-       /* process xincludes as a sub-doc */
-       if( !strcmp( name, "xi:include" ) ) { 
-
-               char* href = strdup(xmlSaxAttr( atts, "href" ));
-               if(href) {
-
-                       /* find the relative path for the xinclude */
-                       if(href[0] != '/') {
-                               int len = strlen(ctx->xmlFile) + strlen(href) + 1;
-                               char buf[len];
-                                memset( buf, '\0', sizeof(len) );
-                               strcpy( buf, ctx->xmlFile );
-                               int i;
-                               for( i = strlen(buf); i != 0; i-- ) {
-                                       if( buf[i] == '/' ) break;
-                                       buf[i] = '\0';
-                               }
-                               strcat( buf, href );
-                               free(href);
-                               href = strdup(buf);
-                       }
-
-
-                       xmlDocPtr subDoc = xmlBuilderProcessFile( href, ctx->config );
-                       node = xmlDocGetRootElement( subDoc );
-               }
-
-               if(!node) {
-                       apacheError("Unable to parse xinclude: %s", href );
-                       free(href);
-                       return;
-               }
-               free(href);
-
-       } else {
-               node = xmlNewNode(NULL, name);
-               xmlBuilderAddAtts( ctx, node, atts );
-       }
-
-
-       xmlNodePtr parent = osrfListGetIndex( 
-                       ctx->nodeList, ctx->nodeList->size - 1 );
-
-       if( parent ) xmlAddChild( parent, node );
-       else xmlDocSetRootElement(ctx->doc, node);
-       
-       osrfListPush( ctx->nodeList, node );
-}
-
-
-void xmlBuilderAddAtts( xmlBuilderContext* ctx, xmlNodePtr node, const xmlChar** atts ) {
-       if(!(ctx && node && atts)) return;
-       int i;
-
-       for(i = 0; (atts[i] != NULL); i++) {
-
-               if(atts[i+1]) {
-
-                       const xmlChar* name = atts[i];
-                       const xmlChar* prop = atts[i+1];
-                       int nl = strlen(prop);
-                       char* _prop = NULL;
-
-                       if( prop[0] == '&' && prop[nl-1] == ';' ) { /* replace the entity if we are one */
-                               char buf[nl+1];
-                                memset( buf, '\0', sizeof(buf) );
-                               strncat(buf, prop + 1, nl - 2);
-                               xmlEntityPtr ent = osrfHashGet( ctx->entHash, buf );
-                               if(ent && ent->content) _prop = ent->content;
-                       } else { _prop = (char*) prop; }
-
-                       xmlSetProp( node, name, _prop );
-                       i++;
-               }
-       }
-}
-
-void xmlBuilderEndElement( void* context, const xmlChar* name ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) context;
-       osrfListPop( ctx->nodeList );
-}
-
-
-void xmlBuilderHandleCharacter(void* context, const xmlChar *ch, int len) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) context;
-       xmlNodePtr node = osrfListGetIndex( 
-                       ctx->nodeList, ctx->nodeList->size - 1 );
-
-       if(node) {
-               xmlNodePtr txt = xmlNewTextLen(ch, len);
-               xmlAddChild( node, txt );
-       }
-
-}
-
-
-void xmlBuilderParseError( void* context, const char* msg, ... ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) context;
-       VA_LIST_TO_STRING(msg);
-       apacheDebug( "Parser Error Occurred: %s", VA_BUF);
-       ctx->xmlError = 1;
-}
-
-
-xmlEntityPtr xmlBuilderGetEntity( void* context, const xmlChar* name ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) context;
-       xmlEntityPtr ent = osrfHashGet( ctx->entHash, name );
-       return ent;
-}
-
-
-void xmlBuilderExtSubset( void* blob, 
-               const xmlChar* name, const xmlChar* extId, const xmlChar* sysId ) {
-
-       xmlBuilderContext* context = (xmlBuilderContext*) blob;
-       if( context->config->defaultDtd ) {
-               apacheDebug("Ignoring DTD [%s] because default DTD is set...", sysId);
-               return; 
-       }
-
-       xmlBuilderAddDtd( sysId, context );
-}
-
-void xmlBuilderComment( void* blob, const xmlChar* data ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) blob;
-       xmlNodePtr comment = xmlNewComment( data );
-       xmlNodePtr parent = osrfListGetIndex( 
-                       ctx->nodeList, ctx->nodeList->size - 1 );
-       if( parent ) xmlAddChild( parent, comment );
-}
-
-
-
-void xmlBuilderProcInstruction( 
-                       void* blob, const xmlChar* name, const xmlChar* data ) {
-       xmlBuilderContext* ctx = (xmlBuilderContext*) blob;
-       //xmlNodePtr node = xmlNewDocPI( ctx->doc, name, data );
-       xmlNodePtr pi = xmlNewDocPI( ctx->doc, name, data );
-       xmlAddChild( (xmlNodePtr) ctx->doc, pi );
-}
-
-
-
-void xmlBuilderAddDtd( const char* sysId, xmlBuilderContext* context ) {
-
-       if(!sysId) return;
-       if( osrfHashGet( context->dtdHash, sysId ) ) return; /* already parsed this hash */
-
-       //apacheDebug("Adding new DTD file to the entity hash: %s", sysId);
-
-       /* use the dynamic locale if defined... default locale instead */
-       char* locale;
-       if(__xmlBuilderDynamicLocale) locale = __xmlBuilderDynamicLocale;
-       else locale = context->config->defaultLocale;
-
-       /* determine the path to the DTD file and load it */
-       int len = strlen(context->config->baseDir) + strlen(locale) + strlen(sysId) + 4;
-       char buf[len];
-       snprintf( buf, sizeof(buf), "%s/%s/%s", context->config->baseDir, locale, sysId );
-
-       xmlDtdPtr dtd = xmlParseDTD(NULL, buf);
-       if(!dtd) return;
-
-       /* cycle through entities and push them into the entity hash */
-       xmlNodePtr node = dtd->children;
-       while( node ) {
-               if( node->type == XML_ENTITY_DECL ) { /* shove the entities into the hash */
-                       xmlEntityPtr ent = (xmlEntityPtr) node;
-                       osrfHashSet( context->entHash, ent, (char*) ent->name );
-               }
-               node = node->next;
-       }
-
-       /* cache the DTD so we can free it later */
-       osrfHashSet( context->dtdHash, dtd, sysId );
-}
-
-
-/* ------------------------------------------------------------------------ */
-
-/* register callbacks */
-static void xmlBuilderRegisterHooks (apr_pool_t *p) {
-       ap_hook_handler(xmlBuilderHandler, NULL, NULL, APR_HOOK_MIDDLE);
-       ap_hook_child_init(xmlBuilderChildInit,NULL,NULL,APR_HOOK_MIDDLE);
-}
-
-
-/* finally, flesh the module */
-module AP_MODULE_DECLARE_DATA xmlbuilder_module = {
-       STANDARD20_MODULE_STUFF,
-       NULL,
-       NULL,
-       xmlBuilderCreateConfig,
-       NULL,
-       xmlBuilderCommands,
-       xmlBuilderRegisterHooks,
-};
-
-
-
-
-
index 0ac65fc..0197356 100644 (file)
@@ -1,4 +1,4 @@
-LDLIBS += -lobjson -lopensrf #-lfieldmapper 
+LDLIBS +=  -lopensrf #-lfieldmapper 
 LDFLAGS += -Wl,-rpath=$(LIBDIR) -L$(DBI_LIBS)
 CFLAGS += -DOSRF_LOG_PARAMS -I../../include
 
index 07e71ad..59ff65d 100644 (file)
@@ -1,7 +1,7 @@
 #include "opensrf/osrf_app_session.h"
 #include "opensrf/osrf_application.h"
 #include "opensrf/osrf_settings.h"
-#include "objson/object.h"
+#include "opensrf/osrf_json.h"
 #include "opensrf/log.h"
 #include "openils/oils_utils.h"
 #include "openils/oils_constants.h"
@@ -172,6 +172,7 @@ static int oilsAuthVerifyPassword( const osrfMethodContext* ctx,
        char* seed = osrfCacheGetString( "%s%s", OILS_AUTH_CACHE_PRFX, uname ); /**/
 
        if(!seed) {
+               free(realPassword);
                return osrfAppRequestRespondException( ctx->session,
                        ctx->request, "No authentication seed found. "
                        "open-ils.auth.authenticate.init must be called first");
@@ -209,20 +210,22 @@ static double oilsAuthGetTimeout( const jsonObject* userObj, const char* type, d
 
        if(!_oilsAuthOPACTimeout) { /* Load the default timeouts */
 
-               _oilsAuthOPACTimeout =
-                       jsonObjectGetNumber( 
-                               osrf_settings_host_value_object( 
-                                       "/apps/open-ils.auth/app_settings/default_timeout/opac"));
+               jsonObject* value_obj;
+
+               value_obj = osrf_settings_host_value_object(
+                       "/apps/open-ils.auth/app_settings/default_timeout/opac" );
+               _oilsAuthOPACTimeout = jsonObjectGetNumber(value_obj);
+               jsonObjectFree(value_obj);
 
-               _oilsAuthStaffTimeout =
-                       jsonObjectGetNumber( 
-                               osrf_settings_host_value_object( 
-                                       "/apps/open-ils.auth/app_settings/default_timeout/staff" ));
+               value_obj = osrf_settings_host_value_object(
+                       "/apps/open-ils.auth/app_settings/default_timeout/staff" );
+               _oilsAuthStaffTimeout = jsonObjectGetNumber(value_obj);
+               jsonObjectFree(value_obj);
 
-               _oilsAuthOverrideTimeout =
-                       jsonObjectGetNumber( 
-                               osrf_settings_host_value_object( 
-                                       "/apps/open-ils.auth/app_settings/default_timeout/temp" ));
+               value_obj = osrf_settings_host_value_object(
+                               "/apps/open-ils.auth/app_settings/default_timeout/temp" );
+               _oilsAuthOverrideTimeout = jsonObjectGetNumber(value_obj);
+               jsonObjectFree(value_obj);
 
 
                osrfLogInfo(OSRF_LOG_MARK, "Set default auth timetouts: opac => %d : staff => %d : temp => %d",
index bc619f5..ce5dbdc 100644 (file)
@@ -2,10 +2,11 @@
 #include "opensrf/osrf_settings.h"
 #include "opensrf/osrf_message.h"
 #include "opensrf/utils.h"
-#include "objson/object.h"
+#include "opensrf/osrf_json.h"
 #include "opensrf/log.h"
 #include "openils/oils_idl.h"
 #include <dbi/dbi.h>
+#include <objson/object.h>
 
 #include <time.h>
 #include <stdlib.h>
@@ -70,7 +71,7 @@ static char* getSourceDefinition( osrfHash* );
 
 static dbi_conn writehandle; /* our MASTER db connection */
 static dbi_conn dbhandle; /* our CURRENT db connection */
-osrfHash readHandles;
+//static osrfHash * readHandles;
 static jsonObject* jsonNULL = NULL; // 
 static int max_flesh_depth = 100;
 
@@ -450,7 +451,7 @@ int beginTransaction ( osrfMethodContext* ctx ) {
                
                if (!ctx->session->userData) {
                        ctx->session->userData = osrfNewHash();
-                       ((osrfHash*)ctx->session->userData)->freeItem = &sessionDataFree;
+                       osrfHashSetCallback((osrfHash*)ctx->session->userData, &sessionDataFree);
                }
 
                osrfHashSet( (osrfHash*)ctx->session->userData, strdup( ctx->session->session_id ), "xact_id" );
@@ -623,20 +624,26 @@ int dispatchCRUDMethod ( osrfMethodContext* ctx ) {
        
        int err = 0;
 
+       const char* methodtype = osrfHashGet(meta, "methodtype");
        jsonObject * obj = NULL;
-       if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "create"))
-               obj = doCreate(ctx, &err);
 
-       if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "retrieve"))
+       if (!strcmp(methodtype, "create")) {
+               obj = doCreate(ctx, &err);
+               osrfAppRespondComplete( ctx, obj );
+       }
+       else if (!strcmp(methodtype, "retrieve")) {
                obj = doRetrieve(ctx, &err);
-
-       if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "update"))
+               osrfAppRespondComplete( ctx, obj );
+       }
+       else if (!strcmp(methodtype, "update")) {
                obj = doUpdate(ctx, &err);
-
-       if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "delete"))
+               osrfAppRespondComplete( ctx, obj );
+       }
+       else if (!strcmp(methodtype, "delete")) {
                obj = doDelete(ctx, &err);
-
-       if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "search")) {
+               osrfAppRespondComplete( ctx, obj );
+       }
+       else if (!strcmp(methodtype, "search")) {
 
                obj = doFieldmapperSearch(ctx, class_obj, ctx->params, &err);
                if(err) return err;
@@ -649,17 +656,17 @@ int dispatchCRUDMethod ( osrfMethodContext* ctx ) {
                jsonObjectIteratorFree(itr);
                osrfAppRespondComplete( ctx, NULL );
 
-       } else if (!strcmp( (char*)osrfHashGet(meta, "methodtype"), "id_list")) {
+       } else if (!strcmp(methodtype, "id_list")) {
 
                jsonObject* _p = jsonObjectClone( ctx->params );
                if (jsonObjectGetIndex( _p, 1 )) {
                        jsonObjectRemoveKey( jsonObjectGetIndex( _p, 1 ), "flesh" );
                        jsonObjectRemoveKey( jsonObjectGetIndex( _p, 1 ), "flesh_columns" );
                } else {
-                       jsonObjectSetIndex( _p, 1, jsonParseString("{}") );
+                       jsonObjectSetIndex( _p, 1, jsonNewObjectType(JSON_HASH) );
                }
 
-               growing_buffer* sel_list = buffer_init(16);
+               growing_buffer* sel_list = buffer_init(64);
                buffer_fadd(sel_list, "{ \"%s\":[\"%s\"] }", osrfHashGet( class_obj, "classname" ), osrfHashGet( class_obj, "primarykey" ));
                char* _s = buffer_release(sel_list);
 
@@ -941,8 +948,8 @@ static jsonObject* doCreate(osrfMethodContext* ctx, int* err ) {
                }
                else {
 
-                       jsonObject* fake_params = jsonParseString("[]");
-                       jsonObjectPush(fake_params, jsonParseString("{}"));
+                       jsonObject* fake_params = jsonNewObjectType(JSON_ARRAY);
+                       jsonObjectPush(fake_params, jsonNewObjectType(JSON_HASH));
 
                        jsonObjectSetKey(
                                jsonObjectGetIndex(fake_params, 0),
@@ -991,8 +998,8 @@ static jsonObject* doRetrieve(osrfMethodContext* ctx, int* err ) {
                id
        );
 
-       jsonObject* fake_params = jsonParseString("[]");
-       jsonObjectPush(fake_params, jsonParseString("{}"));
+       jsonObject* fake_params = jsonNewObjectType(JSON_ARRAY);
+       jsonObjectPush(fake_params, jsonNewObjectType(JSON_HASH));
 
        jsonObjectSetKey(
                jsonObjectGetIndex(fake_params, 0),
@@ -1177,7 +1184,9 @@ static char* searchFieldTransform (const char* class, osrfHash* field, const jso
 
                        char* val = jsonObjectToSimpleString(func_item);
 
-                           if ( dbi_conn_quote_string(dbhandle, &val) ) {
+                           if ( !val ) {
+                           buffer_add( sql_buf, ",NULL" );
+                           } else if ( dbi_conn_quote_string(dbhandle, &val) ) {
                            buffer_fadd( sql_buf, ",%s", val );
                        } else {
                                osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, val);
@@ -1417,7 +1426,7 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
        if (join_hash->type == JSON_STRING) {
                // create a wrapper around a copy of the original
                char* _tmp = jsonObjectToSimpleString( join_hash );
-               freeable_hash = jsonParseString("{}");
+               freeable_hash = jsonNewObjectType(JSON_HASH);
                jsonObjectSetKey(freeable_hash, _tmp, NULL);
                free(_tmp);
                working_hash = freeable_hash;
@@ -1454,6 +1463,7 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                );
                                buffer_free(join_buf);
                                free(field);
+                               jsonObjectIteratorFree(search_itr);
                                return NULL;
                        }
                        fkey = strdup( fkey );
@@ -1471,6 +1481,7 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                );
                                buffer_free(join_buf);
                                free(fkey);
+                               jsonObjectIteratorFree(search_itr);
                                return NULL;
                        }
                        field = strdup( field );
@@ -1517,6 +1528,7 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                        class
                                );
                                buffer_free(join_buf);
+                               jsonObjectIteratorFree(search_itr);
                                return NULL;
                        }
 
@@ -1657,7 +1669,8 @@ static char* searchWHERE ( const jsonObject* search_hash, osrfHash* meta, int op
                     );
                     buffer_free(sql_buf);
                     free(table);
-                    return NULL;
+                                       jsonObjectIteratorFree(search_itr);
+                                       return NULL;
                 }
 
                 char* subpred = searchPredicate( class, field, node->item );
@@ -1753,13 +1766,13 @@ static char* SELECT (
        // if the select list is empty, or the core class field list is '*',
        // build the default select list ...
        if (!selhash) {
-               selhash = defaultselhash = jsonParseString( "{}" );
-               jsonObjectSetKey( selhash, core_class, jsonParseString( "[]" ) );
+               selhash = defaultselhash = jsonNewObjectType(JSON_HASH);
+               jsonObjectSetKey( selhash, core_class, jsonNewObjectType(JSON_ARRAY) );
        } else if ( (tmp_const = jsonObjectGetKeyConst( selhash, core_class )) && tmp_const->type == JSON_STRING ) {
                char* _x = jsonObjectToSimpleString( tmp_const );
                if (!strncmp( "*", _x, 1 )) {
                        jsonObjectRemoveKey( selhash, core_class );
-                       jsonObjectSetKey( selhash, core_class, jsonParseString( "[]" ) );
+                       jsonObjectSetKey( selhash, core_class, jsonNewObjectType(JSON_ARRAY) );
                }
                free(_x);
        }
@@ -1855,7 +1868,7 @@ static char* SELECT (
                            char* pkey = osrfHashGet(idlClass, "primarykey");
                            char* tname = osrfHashGet(idlClass, "tablename");
 
-                        buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, __column, pkey, cname, pkey, locale, __column);
+                        buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, cname, __column, pkey, cname, pkey, locale, __column);
                     } else {
                                        buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, __column, __column);
                     }
@@ -1899,7 +1912,7 @@ static char* SELECT (
                                char* pkey = osrfHashGet(idlClass, "primarykey");
                                char* tname = osrfHashGet(idlClass, "tablename");
 
-                            buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, fname, pkey, cname, pkey, locale, __alias);
+                            buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, cname, fname, pkey, cname, pkey, locale, __alias);
                         } else {
                                                buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, fname, __alias);
                         }
@@ -2124,6 +2137,7 @@ static char* SELECT (
                        buffer_free(order_buf);
                        buffer_free(sql_buf);
                        if (defaultselhash) jsonObjectFree(defaultselhash);
+                       jsonObjectIteratorFree(class_itr);
                        return NULL;
                }
 
@@ -2208,12 +2222,12 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
        growing_buffer* select_buf = buffer_init(128);
 
        if ( !(selhash = jsonObjectGetKey( order_hash, "select" )) ) {
-               defaultselhash = jsonParseString( "{}" );
+               defaultselhash = jsonNewObjectType(JSON_HASH);
                selhash = defaultselhash;
        }
        
        if ( !jsonObjectGetKeyConst(selhash,core_class) ) {
-               jsonObjectSetKey( selhash, core_class, jsonParseString( "[]" ) );
+               jsonObjectSetKey( selhash, core_class, jsonNewObjectType(JSON_ARRAY) );
                jsonObject* flist = jsonObjectGetKey( selhash, core_class );
                
                int i = 0;
@@ -2271,7 +2285,7 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
                        char* pkey = osrfHashGet(idlClass, "primarykey");
                        char* tname = osrfHashGet(idlClass, "tablename");
 
-                    buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, fname, pkey, cname, pkey, locale, fname);
+                    buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, cname, fname, pkey, cname, pkey, locale, fname);
                 } else {
                                buffer_fadd(select_buf, " \"%s\".%s", cname, fname);
                 }
@@ -2314,6 +2328,7 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
                                "Severe query error -- see error log for more details"
                        );
                buffer_free(sql_buf);
+               if(defaultselhash) jsonObjectFree(defaultselhash);
                return NULL;
        } else {
                buffer_add(sql_buf, pred);
@@ -2556,7 +2571,7 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
        osrfLogDebug(OSRF_LOG_MARK, "%s SQL =  %s", MODULENAME, sql);
        dbi_result result = dbi_conn_query(dbhandle, sql);
 
-       jsonObject* res_list = jsonParseString("[]");
+       jsonObject* res_list = jsonNewObjectType(JSON_ARRAY);
        if(result) {
                osrfLogDebug(OSRF_LOG_MARK, "Query returned with no errors");
                osrfHash* dedup = osrfNewHash();
@@ -2668,7 +2683,7 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                                                osrfStringArray* link_map = osrfHashGet( kid_link, "map" );
 
                                                if (link_map->size > 0) {
-                                                       jsonObject* _kid_key = jsonParseString("[]");
+                                                       jsonObject* _kid_key = jsonNewObjectType(JSON_ARRAY);
                                                        jsonObjectPush(
                                                                _kid_key,
                                                                jsonNewObject( osrfStringArrayGetString( link_map, 0 ) )
@@ -2690,9 +2705,9 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                                                        osrfHashGet(kid_link, "reltype")
                                                );
 
-                                               jsonObject* fake_params = jsonParseString("[]");
-                                               jsonObjectPush(fake_params, jsonParseString("{}")); // search hash
-                                               jsonObjectPush(fake_params, jsonParseString("{}")); // order/flesh hash
+                                               jsonObject* fake_params = jsonNewObjectType(JSON_ARRAY);
+                                               jsonObjectPush(fake_params, jsonNewObjectType(JSON_HASH)); // search hash
+                                               jsonObjectPush(fake_params, jsonNewObjectType(JSON_HASH)); // order/flesh hash
 
                                                osrfLogDebug(OSRF_LOG_MARK, "Creating dummy params object...");
 
@@ -2750,6 +2765,7 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                                                        osrfStringArrayFree(link_fields);
                                                        jsonObjectIteratorFree(itr);
                                                        jsonObjectFree(res_list);
+                                                       jsonObjectFree(flesh_blob);
                                                        return jsonNULL;
                                                }
 
@@ -2758,7 +2774,7 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                                                jsonObject* X = NULL;
                                                if ( link_map->size > 0 && kids->size > 0 ) {
                                                        X = kids;
-                                                       kids = jsonParseString("[]");
+                                                       kids = jsonNewObjectType(JSON_ARRAY);
 
                                                        jsonObjectNode* _k_node;
                                                        jsonObjectIterator* _k = jsonNewObjectIterator( X );
@@ -2787,6 +2803,7 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                                                                        )
                                                                );
                                                        }
+                                                       jsonObjectIteratorFree(_k);
                                                }
 
                                                if (!(strcmp( osrfHashGet(kid_link, "reltype"), "has_a" )) || !(strcmp( osrfHashGet(kid_link, "reltype"), "might_have" ))) {
@@ -3158,7 +3175,7 @@ static jsonObject* oilsMakeFieldmapperFromResult( dbi_result result, osrfHash* m
                                                        jsonNewNumberObject(dbi_result_get_longlong(result, columnName)));
                                        else 
                                                jsonObjectSetIndex( object, fmIndex, 
-                                                       jsonNewNumberObject(dbi_result_get_long(result, columnName)));
+                                                       jsonNewNumberObject(dbi_result_get_int(result, columnName)));
 
                                        break;
 
@@ -3182,18 +3199,19 @@ static jsonObject* oilsMakeFieldmapperFromResult( dbi_result result, osrfHash* m
 
                                        memset(dt_string, '\0', sizeof(dt_string));
                                        memset(&gmdt, '\0', sizeof(gmdt));
-                                       memset(&_tmp_dt, '\0', sizeof(_tmp_dt));
 
                                        _tmp_dt = dbi_result_get_datetime(result, columnName);
 
-                                       localtime_r( &_tmp_dt, &gmdt );
 
                                        if (!(attr & DBI_DATETIME_DATE)) {
-                                               strftime(dt_string, 255, "%T", &gmdt);
+                                               gmtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%T", &gmdt);
                                        } else if (!(attr & DBI_DATETIME_TIME)) {
-                                               strftime(dt_string, 255, "%F", &gmdt);
+                                               localtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%F", &gmdt);
                                        } else {
-                                               strftime(dt_string, 255, "%FT%T%z", &gmdt);
+                                               localtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%FT%T%z", &gmdt);
                                        }
 
                                        jsonObjectSetIndex( object, fmIndex, jsonNewObject(dt_string) );
@@ -3247,7 +3265,7 @@ static jsonObject* oilsMakeJSONFromResult( dbi_result result ) {
                                        if( attr & DBI_INTEGER_SIZE8 ) 
                                                jsonObjectSetKey( object, columnName, jsonNewNumberObject(dbi_result_get_longlong(result, columnName)) );
                                        else 
-                                               jsonObjectSetKey( object, columnName, jsonNewNumberObject(dbi_result_get_long(result, columnName)) );
+                                               jsonObjectSetKey( object, columnName, jsonNewNumberObject(dbi_result_get_int(result, columnName)) );
                                        break;
 
                                case DBI_TYPE_DECIMAL :
@@ -3262,18 +3280,19 @@ static jsonObject* oilsMakeJSONFromResult( dbi_result result ) {
 
                                        memset(dt_string, '\0', sizeof(dt_string));
                                        memset(&gmdt, '\0', sizeof(gmdt));
-                                       memset(&_tmp_dt, '\0', sizeof(_tmp_dt));
 
                                        _tmp_dt = dbi_result_get_datetime(result, columnName);
 
-                                       localtime_r( &_tmp_dt, &gmdt );
 
                                        if (!(attr & DBI_DATETIME_DATE)) {
-                                               strftime(dt_string, 255, "%T", &gmdt);
+                                               gmtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%T", &gmdt);
                                        } else if (!(attr & DBI_DATETIME_TIME)) {
-                                               strftime(dt_string, 255, "%F", &gmdt);
+                                               localtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%F", &gmdt);
                                        } else {
-                                               strftime(dt_string, 255, "%FT%T%z", &gmdt);
+                                               localtime_r( &_tmp_dt, &gmdt );
+                                               strftime(dt_string, sizeof(dt_string), "%FT%T%z", &gmdt);
                                        }
 
                                        jsonObjectSetKey( object, columnName, jsonNewObject(dt_string) );
index bc9b737..fe9894b 100644 (file)
@@ -71,7 +71,8 @@ void oilsEventFree( oilsEvent* event ) {
        free(event->perm);
        free(event->file);
        if(event->json) jsonObjectFree(event->json);
-       if(event->payload) jsonObjectFree(event->payload);
+    /* event->json will contain a pointer to event->payload */
+    else jsonObjectFree(event->payload); 
        free(event);
 }
 
diff --git a/Open-ILS/src/c-apps/oils_fetch.c b/Open-ILS/src/c-apps/oils_fetch.c
deleted file mode 100644 (file)
index 4babd25..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-#include "opensrf/osrf_app_session.h"
-#include "opensrf/osrf_application.h"
-#include "opensrf/osrf_settings.h"
-#include "objson/object.h"
-#include "opensrf/log.h"
-#include "openils/oils_utils.h"
-#include "openils/oils_constants.h"
-#include "openils/oils_event.h"
-#include <dbi/dbi.h>
-#include <openils/fieldmapper_lookup.h>
-
-#define OILS_AUTH_CACHE_PRFX "oils_fetch_"
-
-#define MODULENAME "open-ils.fetch"
-dbi_conn dbhandle; /* our db connection */
-
-/* handy NULL json object to have around */
-static jsonObject* oilsFetchNULL = NULL;
-
-int osrfAppChildInit();
-
-/* turns a singal db result row into a jsonObject */
-jsonObject* oilsFetchMakeJSON( dbi_result result, char* hint );
-
-osrfHash* fmClassMap = NULL;
-
-
-int osrfAppInitialize() {
-       osrfLogInfo(OSRF_LOG_MARK, "Initializing Fetch Server...");
-
-       oilsFetchNULL = jsonNewObject(NULL);
-       fmClassMap = osrfNewHash();
-
-       int i;
-       char* hint;
-       char* apiname;
-
-       osrfList* keys = fm_classes();
-       if(!keys) return 0;
-
-       /* cycle through all of the classes and register a 
-        * retrieve method for each */
-       for( i = 0; i < keys->size; i++ ) {
-
-               hint = OSRF_LIST_GET_INDEX(keys, i);    
-               i++;
-               apiname = OSRF_LIST_GET_INDEX(keys, i); 
-               if(!(hint && apiname)) break;
-
-               osrfHashSet( fmClassMap, hint, apiname );
-
-               char method[256];
-               snprintf(method, sizeof(method), "open-ils.fetch.%s.retrieve", apiname);
-
-               osrfAppRegisterMethod( MODULENAME, 
-                               method, "oilsFetchDoRetrieve", "", 1, 0 );
-       }
-
-       return 0;
-}
-
-
-/**
- * Connects to the database 
- */
-int osrfAppChildInit() {
-
-       dbi_initialize(NULL);
-
-       char* driver = osrf_settings_host_value("/apps/%s/app_settings/databases/driver", MODULENAME);
-       char* user       = osrf_settings_host_value("/apps/%s/app_settings/databases/database/user", MODULENAME);
-       char* host       = osrf_settings_host_value("/apps/%s/app_settings/databases/database/host", MODULENAME);
-       char* port       = osrf_settings_host_value("/apps/%s/app_settings/databases/database/port", MODULENAME);
-       char* db                 = osrf_settings_host_value("/apps/%s/app_settings/databases/database/db", MODULENAME);
-       char* pw                 = osrf_settings_host_value("/apps/%s/app_settings/databases/database/pw", MODULENAME);
-
-       dbhandle = dbi_conn_new(driver);
-
-       if(!dbhandle) {
-               osrfLogError(OSRF_LOG_MARK, "Error creating database driver %s", driver);
-               return -1;
-       }
-
-       osrfLogInfo(OSRF_LOG_MARK, "oils_fetch connecting to database.  host=%s, "
-               "port=%s, user=%s, pw=%s, db=%s", host, port, user, pw, db );
-
-       if(host) dbi_conn_set_option(dbhandle, "host", host );
-       if(port) dbi_conn_set_option_numeric( dbhandle, "port", atoi(port) );
-       if(user) dbi_conn_set_option(dbhandle, "username", user);
-       if(pw) dbi_conn_set_option(dbhandle, "password", pw );
-       if(db) dbi_conn_set_option(dbhandle, "dbname", db );
-
-       free(user);
-       free(host);
-       free(port);
-       free(db);
-       free(pw);
-
-       if (dbi_conn_connect(dbhandle) < 0) {
-               const char* err;
-               dbi_conn_error(dbhandle, &err);
-               osrfLogError( OSRF_LOG_MARK, "Error connecting to database: %s", err);
-               return -1;
-       }
-
-       osrfLogInfo(OSRF_LOG_MARK, "%s successfully connected to the database", MODULENAME);
-
-       return 0;
-}
-
-
-
-int oilsFetchDoRetrieve( osrfMethodContext* ctx ) {
-
-       OSRF_METHOD_VERIFY_CONTEXT(ctx); 
-
-       char* id                = jsonObjectToSimpleString(jsonObjectGetIndex(ctx->params, 0));
-       char* meth      = strdup(ctx->method->name);
-       char* strtk;
-
-       strtok_r(meth, ".", &strtk); /* open-ils */
-       strtok_r(NULL, ".", &strtk); /* fetch */
-       char* schema    = strtok_r(NULL, ".", &strtk); 
-       char* object    = strtok_r(NULL, ".", &strtk);
-
-       osrfLogDebug(OSRF_LOG_MARK, "%s retrieving %s.%s "
-                       "object with id %s", MODULENAME, schema, object, id );
-
-       /* construct the SQL */
-       char sql[256];
-       snprintf( sql, sizeof(sql), "select * from %s.%s where id = %s;", schema, object, id );
-
-       /* find the object hint from the api name */
-       char hintbuf[256];
-       snprintf(hintbuf, sizeof(hintbuf), "%s.%s", schema, object );
-       char* hint = osrfHashGet( fmClassMap, hintbuf );
-
-       osrfLogDebug(OSRF_LOG_MARK, "%s SQL =  %s", MODULENAME, sql);
-
-       dbi_result result = dbi_conn_queryf(dbhandle, sql);
-
-       if(result) {
-
-               /* there should be one row at the most  */
-               dbi_result_next_row(result); 
-
-               /* JSONify the result */
-               jsonObject* obj = oilsFetchMakeJSON( result, hint );
-
-               /* clean up the query */
-               dbi_result_free(result); 
-
-               osrfAppRespondComplete( ctx, obj ); 
-               jsonObjectFree(obj);
-
-       } else {
-
-               osrfLogDebug(OSRF_LOG_MARK, "%s returned no results for query %s", MODULENAME, sql);
-               osrfAppRespondComplete( ctx, oilsFetchNULL );
-       }
-
-       free(id);
-       free(meth);
-       return 0;
-}
-
-
-jsonObject* oilsFetchMakeJSON( dbi_result result, char* hint ) {
-       if(!(result && hint)) return NULL;
-
-       jsonObject* object = jsonParseString("[]");
-       jsonObjectSetClass(object, hint);
-
-       int attr;  
-       int fmIndex; 
-       int columnIndex = 1; 
-       unsigned short type;
-       const char* columnName; 
-
-       /* cycle through the column list */
-       while( (columnName = dbi_result_get_field_name(result, columnIndex++)) ) {
-
-               /* determine the field type and storage attributes */
-               type = dbi_result_get_field_type(result, columnName);
-               attr = dbi_result_get_field_attribs(result, columnName);
-
-               /* fetch the fieldmapper index */
-               if( (fmIndex = fm_ntop(hint, (char*) columnName)) < 0 ) continue;
-
-               switch( type ) {
-
-                       case DBI_TYPE_INTEGER :
-
-                               if( attr & DBI_INTEGER_SIZE8 ) 
-                                       jsonObjectSetIndex( object, fmIndex, 
-                                               jsonNewNumberObject(dbi_result_get_longlong(result, columnName)));
-                               else 
-                                       jsonObjectSetIndex( object, fmIndex, 
-                                               jsonNewNumberObject(dbi_result_get_long(result, columnName)));
-
-                               break;
-
-                       case DBI_TYPE_DECIMAL :
-                               jsonObjectSetIndex( object, fmIndex, 
-                                               jsonNewNumberObject(dbi_result_get_double(result, columnName)));
-                               break;
-
-                       case DBI_TYPE_STRING :
-                               jsonObjectSetIndex( object, fmIndex, 
-                                       jsonNewObject(dbi_result_get_string(result, columnName)));
-                               break;
-
-                       case DBI_TYPE_DATETIME :
-                               jsonObjectSetIndex( object, fmIndex, 
-                                       jsonNewNumberObject(dbi_result_get_datetime(result, columnName)));
-                               break;
-
-                       case DBI_TYPE_BINARY :
-                               osrfLogError( OSRF_LOG_MARK, 
-                                       "Can't do binary at column %s : index %d", columnName, columnIndex - 1);
-               }
-       }
-
-       return object;
-}
-
-
-
index 8b8184d..bf6c9af 100644 (file)
@@ -346,7 +346,7 @@ char * oilsIDL_pton (const char* classname, int pos) {
 
        while ( (f = osrfHashIteratorNext( itr )) ) {
                if ( atoi(osrfHashGet(f, "array_position")) == pos ) {
-                       ret = strdup(itr->current);
+                       ret = strdup(osrfHashIteratorKey(itr));
                        break;
                }
        }
index 71b949a..502d26a 100755 (executable)
@@ -298,7 +298,7 @@ if (my $action = $cgi->param('action')) {
 
                        print Tr( "<td colspan='2'><input type='submit' name='action' value='Update'/></td>" );
                        print   "</table><span style='color:red;'>*</span>".
-                               "You must hide every OU you want hidden, not just an anscestor!</form>";
+                               "You must hide every OU you want hidden, not just an ancestor!</form>";
 
                        #-------------------------------------------------------------------------
                        # Hours of operation form
@@ -349,7 +349,7 @@ if (my $action = $cgi->param('action')) {
                        # Address edit form
                        #-------------------------------------------------------------------------
 
-                       print "<hr/><h2>Adresses for ".$node->name."</h2>";
+                       print "<hr/><h2>Addresses for ".$node->name."</h2>";
                        print   "<table cellspacing='20'><tr>";
                        my %addrs = (   ill_address     => 'ILL Address',
                                        holds_address   => 'Consortial Holds Address',
index bfc3b48..245ced7 100644 (file)
@@ -3,12 +3,14 @@
 #
 # Makefile to install prerequisites for OpenSRF and Evergreen
 #
-# Currently supports Debian (etch) and Gentoo.  Installs Perl prereqs, 
+# Currently supports Debian (etch), Ubuntu (gutsy) and Gentoo.  Installs Perl prereqs, 
 # libjs with Perl wrapper, libdbi, libdbi-drivers, and libyaz
 #
 # usage:
 #      make -f Makefile.install debian
 #      - or -
+#      make -f Makefile.install ubuntu
+#      - or -
 #      make -f Makefile.install gentoo
 #
 # Notes:
@@ -38,9 +40,9 @@ JS_INSTALL_PREFIX=/usr/
 
 # The libdbi sources can be fetched from sourceforge.net.  They are stored on
 # the open-ils.org site now for ease of direct linking
-LIBDBI=libdbi-0.8.2
-LIBDBI_DRIVERS=libdbi-drivers-0.8.2-1
-LIBDBI_HOST=http://open-ils.org/~erickson/evergreen
+LIBDBI=libdbi-0.8.3
+LIBDBI_DRIVERS=libdbi-drivers-0.8.3
+LIBDBI_HOST=http://open-ils.org/~denials/evergreen
 
 YAZ=yaz-2.1.56
 YAZ_HOST=http://ftp.indexdata.dk/pub/yaz
@@ -51,8 +53,8 @@ DEBS =  \
        syslog-ng\
        psmisc\
        ntpdate\
+       less\
     memcached\
-    postgresql-client\
     libxml2-dev\
     libmodule-build-perl\
     libexpat1-dev\
@@ -96,8 +98,27 @@ DEBS =  \
        libtext-csv-perl\
        libspreadsheet-writeexcel-perl\
        libtie-ixhash-perl\
-       python-setuptools 
-
+       python-dev\
+       python-setuptools\
+       libfreezethaw-perl\
+       libbusiness-creditcard-perl\
+       libbusiness-onlinepayment-perl\
+       libbusiness-onlinepayment-authorizenet-perl
+
+
+PGSQL_DEBIAN = \
+       postgresql-8.1\
+       postgresql-client-8.1\
+       postgresql-contrib-8.1\
+       postgresql-plperl-8.1\
+       postgresql-server-dev-8.1
+
+PGSQL_UBUNTU = \
+       postgresql-8.2\
+       postgresql-client-8.2\
+       postgresql-contrib-8.2\
+       postgresql-plperl-8.2\
+       postgresql-server-dev-8.2
 
 GENTOOS = \
     vim\
@@ -132,9 +153,10 @@ GENTOOS = \
     dev-perl/libwww-perl\
     dev-perl/Template-Toolkit\
     dev-perl/Error\
-       dev-perl/Text-CSV_XS\
-       dev-perl/Spreadsheet-WriteExcel\
-       dev-perl/Tie-IxHash
+    dev-perl/Text-CSV_XS\
+    dev-perl/Spreadsheet-WriteExcel\
+    dev-perl/Tie-IxHash\
+       dev-perl/FreezeThaw
 
 GENTOO_RC = \
     ejabberd\
@@ -146,7 +168,7 @@ GENTOO_PERL = \
     Class::DBI::AbstractSearch\
     MARC::Record \
     Net::Z3950::ZOOM \
-       Text::CSV
+    Text::CSV
 
 DEB_APACHE_MODS = \
     expires\
@@ -163,7 +185,10 @@ CPAN_MODULES = \
     TMTM/Class-DBI-0.96.tar.gz \
     RHANDOM/Net-Server-0.90.tar.gz \
     MARC::Charset MARC::File::XML\
-       Net::Z3950::ZOOM
+    JSON::XS\
+    SRU \
+    Net::Z3950::ZOOM \
+       Business::CreditCard::Object
 
 
 # ----------------------------------------------------------------------------
@@ -175,10 +200,12 @@ all:
 # these should be the same for any distro
 install: install_yaz install_cpan install_js_sm install_libdbi 
 
-debian: install_debs install debian_sys_config
+debian: install_pgsql_debian install_debs install debian_sys_config
 
 gentoo: install_gentoos install_gentoo_rc install_gentoo_perl install
 
+ubuntu: install_pgsql_ubuntu install_debs install debian_sys_config
+
 
 # - COMMON TARGETS ---------------------------------------------------------
 
@@ -242,7 +269,11 @@ debian_sys_config:
 install_debs:
        apt-get install $(DEBS)
 
+install_pgsql_debian:
+       apt-get install $(PGSQL_DEBIAN)
 
+install_pgsql_ubuntu:
+       apt-get install $(PGSQL_UBUNTU)
 
 # ------------------------------------------------------------------
 # - GENTOO ---------------------------------------------------------
@@ -259,4 +290,3 @@ install_gentoo_perl:
 # ------------------------------------------------------------------
     
 
-
index 8804b2b..cb266b4 100755 (executable)
@@ -1,6 +1,49 @@
 #!/bin/bash
+# -----------------------------------------------------------------------
+# Copyright (C) 2005-2008  Georgia Public Library Service
+# Bill Erickson <billserickson@gmail.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.
+# -----------------------------------------------------------------------
+
 # vim:noet:ts=4
 
+# ---------------------------------------------------------------------------
+# Make sure we're running as the correct user
+# ---------------------------------------------------------------------------
+[ $(whoami) != 'opensrf' ] && echo 'Must run as user "opensrf"' && exit;
+
+function usage {
+       echo "";
+       echo "usage: $0 [-u] -c <c_config>";
+       echo "";
+       echo "Mandatory parameters:";
+       echo -e "  -c\t\tfull path to C configuration file (opensrf_core.xml)";
+       echo "";
+       echo "Optional parameters:";
+       echo -e "  -u\t\tupdate proximity of library sites in organization tree";
+       echo -e "    \t\t(this is expensive for a large organization tree)";
+       echo "";
+       echo "Examples:";
+       echo "";
+       echo "  Update organization tree:";
+       echo "    $0 -c /openils/conf/opensrf_core.xml";
+       echo "    $0 /openils/conf/opensrf_core.xml";
+       echo "";
+       echo "  Update organization tree and refresh proximity:";
+       echo "    $0 -u -c /openils/conf/opensrf_core.xml";
+       echo "";
+       exit;
+}
+
 (
 
 BASEDIR=${0%/*}
@@ -13,13 +56,26 @@ cd "$BASEDIR"
 
 CONFIG="$1";
 
-[ -z "$CONFIG" ] && echo "usage: $0 <bootstrap_config>" && exit;
+# ---------------------------------------------------------------------------
+# Load the command line options and set the global vars
+# ---------------------------------------------------------------------------
+while getopts  "c:u h" flag; do
+       case $flag in   
+               "c")            CONFIG="$OPTARG";;
+               "u")            PROXIMITY="REFRESH";;
+               "h")            usage;;
+       esac;
+done
+
+[ -z "$CONFIG" ] && usage;
 
 JSDIR="/openils/var/web/opac/common/js/";
+FMDOJODIR="/openils/var/web/js/dojo/fieldmapper/";
 SLIMPACDIR="/openils/var/web/opac/extras/slimpac/";
 
 echo "Updating fieldmapper";
 perl fieldmapper.pl "$CONFIG"  > "$JSDIR/fmall.js";
+cp "$JSDIR/fmall.js" "$FMDOJODIR/"
 
 echo "Updating web_fieldmapper";
 perl fieldmapper.pl "$CONFIG" "web_core"       > "$JSDIR/fmcore.js";
@@ -29,7 +85,19 @@ perl org_tree_js.pl "$CONFIG" > "$JSDIR/OrgTree.js";
 
 echo "Updating OrgTree HTML";
 perl org_tree_html_options.pl "$CONFIG" "$SLIMPACDIR/lib_list.inc";
+cp "$JSDIR/OrgTree.js" "$FMDOJODIR/"
+
+echo "Updating Search Groups";
+perl org_lasso_js.pl "$CONFIG" > "$JSDIR/OrgLasso.js";
+cp "$JSDIR/OrgLasso.js" "$FMDOJODIR/"
+
+if [ "$PROXIMITY" ]
+then
+       echo "Refreshing proximity of org units";
+       perl org_tree_proximity.pl "$CONFIG";
+fi
 
+echo "";
 echo "Done";
 
 )
index a2b315d..68845df 100644 (file)
        </event>
 
 
+       <event code='7018' textcode='COPY_MARKED_LOST'>
+               <desc xml:lang="en-US">The requested item is already marked as lost</desc>
+       </event>
+
+
+
        <!-- ================================================================ -->
 
 
index b6aa328..691ce9f 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 if [ "_$4" == "_" ]; then
        echo "Usage:"
        echo "  $0 {Open-ILS-driver} {db-host} {db-port} {db-name} {db-user} {db-password} [db-version]"
index 7f8323d..b6c658b 100755 (executable)
@@ -22,8 +22,8 @@ use DBI;
 
 #MARC::Charset->ignore_errors(1);
 
-my ($id_field, $recid, $user, $config, $idlfile, $marctype, $keyfile, $dontuse_file, $enc, $force_enc, @files, @trash_fields, $quiet) =
-       ('', 0, 1, '/openils/conf/opensrf_core.xml', '/openils/conf/fm_IDL.xml', 'USMARC');
+my ($id_field, $id_subfield, $recid, $user, $config, $idlfile, $marctype, $keyfile, $dontuse_file, $enc, $force_enc, @files, @trash_fields, $quiet) =
+       ('', 'a', 0, 1, '/openils/conf/opensrf_core.xml', '/openils/conf/fm_IDL.xml', 'USMARC');
 
 my ($db_driver,$db_host,$db_name,$db_user,$db_pw) =
        ('Pg','localhost','evergreen','postgres','postgres');
@@ -32,6 +32,7 @@ GetOptions(
        'marctype=s'    => \$marctype,
        'startid=i'     => \$recid,
        'idfield=s'     => \$id_field,
+       'idsubfield=s'  => \$id_subfield,
        'user=s'        => \$user,
        'encoding=s'    => \$enc,
        'hard_encoding' => \$force_enc,
@@ -143,11 +144,12 @@ while ( try { $rec = $batch->next } otherwise { $rec = -1 } ) {
                        if ($field->is_control_field) {
                                $id = $field->data;
                        } else {
-                               $id = $field->subfield('a');
+                               $id = $field->subfield($id_subfield);
                        }
 
                        $id =~ s/\D+//gso;
                }
+               $id = '' if (exists $dontuse_id{$id});
        }
 
        if (!$id) {
@@ -157,7 +159,7 @@ while ( try { $rec = $batch->next } otherwise { $rec = -1 } ) {
        if ($keyfile) {
                if (my $tcn = $keymap{$id}) {
                        $rec->delete_field( $_ ) for ($rec->field($id_field));
-                       $rec->append_fields( MARC::Field->new( $id_field, '', '', 'a', $tcn ) );
+                       $rec->append_fields( MARC::Field->new( $id_field, '', '', $id_subfield, $tcn ) );
                } else {
                        $count++;
                        next;
@@ -165,9 +167,9 @@ while ( try { $rec = $batch->next } otherwise { $rec = -1 } ) {
        }
 
        my $tcn;
-       ($rec, $tcn) = preprocess($rec);
+       ($rec, $tcn) = preprocess($rec, $id);
 
-    $tcn->add_subfields(c => $id);
+       $tcn->add_subfields(c => $id);
 
        $rec->delete_field( $_ ) for ($rec->field($id_field));
        $rec->append_fields( $tcn );
@@ -211,13 +213,16 @@ while ( try { $rec = $batch->next } otherwise { $rec = -1 } ) {
 
 sub preprocess {
        my $rec = shift;
+       my $id = shift;
 
-       my ($id, $source, $value) = ('','','');
+       my ($source, $value) = ('','');
+
+       $id = '' if (exists $dontuse_id{$id});
 
        if (!$id) {
                my $f = $rec->field('001');
                $id = $f->data if ($f);
-        $id = '' if (exists $dontuse_id{$id});
+               $id = '' if (exists $dontuse_id{$id});
        }
 
        if (!$id || exists $dontuse_id{$source.$id}) {
@@ -261,7 +266,7 @@ sub preprocess {
        }
 
        if ($id && exists $dontuse_id{$id}) {
-               warn "\n!!! ID $id is already in use\n";
+               warn "\n!!! TCN $id is already in use.  Using the record ID ($recid) as a system-generated TCN.\n";
                $id = '';
        }
 
index bacbf56..53effc2 100644 (file)
@@ -22,9 +22,10 @@ int main( int argc, char* argv[] ) {
        char* config            = NULL;
        char* context           = NULL;
        char* idl_filename      = NULL;
+    char* hostname      = NULL;
        char* request;
 
-       while( (c = getopt( argc, argv, "f:u:p:s:c:i:" )) != -1 ) {
+       while( (c = getopt( argc, argv, "f:u:p:s:c:i:h:" )) != -1 ) {
                switch(c) {
                        case '?': return -1;
                        case 'f': config                = strdup(optarg); break;
@@ -33,19 +34,10 @@ int main( int argc, char* argv[] ) {
                        case 'p': password      = strdup(optarg); break;
                        case 's': script                = strdup(optarg); break;
                        case 'i': idl_filename          = strdup(optarg); break;
+            case 'h': hostname  = strdup(optarg); break;
                }
        }
 
-       if (!idl_filename) {
-               fprintf(stderr, "IDL file not provided. Exiting...\n");
-               return -1;
-       }
-
-       if (!oilsInitIDL( idl_filename )) {
-               fprintf(stderr, "IDL file could not be loaded. Exiting...\n");
-               return -1;
-       }
-
        if(!(config && context)) {
                fprintf(stderr, "Config or config context not provided. Exiting...\n");
                return -1;
@@ -56,6 +48,19 @@ int main( int argc, char* argv[] ) {
                return 1;
        }
 
+    if(!idl_filename) {
+        if(!hostname) {
+                   fprintf(stderr, "We need an IDL file name or a settings server hostname...\n");
+                   return 1;
+        }
+        osrf_settings_retrieve(hostname);
+    }
+
+    if (!oilsInitIDL( idl_filename )) {
+        fprintf(stderr, "IDL file could not be loaded. Exiting...\n");
+        return -1;
+    }
+
        printf("Connected to OpenSRF network...\n");
 
        if( username && password &&
@@ -76,6 +81,7 @@ int main( int argc, char* argv[] ) {
        free(script);
        free(authtoken);
        free(idl_filename);
+       osrf_settings_free_host_config(NULL);
        return 1;
 }
 
diff --git a/Open-ILS/src/extras/org_lasso_js.pl b/Open-ILS/src/extras/org_lasso_js.pl
new file mode 100644 (file)
index 0000000..e99d124
--- /dev/null
@@ -0,0 +1,34 @@
+#!/usr/bin/perl
+use strict; use warnings;
+
+# ------------------------------------------------------------
+# turns the actor.org_lasso table into a js file
+# ------------------------------------------------------------
+
+use OpenSRF::System;
+use OpenILS::Utils::Fieldmapper;
+use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::JSON;
+
+die "usage: perl org_tree_js.pl <bootstrap_config>" unless $ARGV[0];
+OpenSRF::System->bootstrap_client(config_file => $ARGV[0]);
+
+Fieldmapper->import(IDL => OpenSRF::Utils::SettingsClient->new->config_value("IDL"));
+
+# must be loaded after the IDL is parsed
+require OpenILS::Utils::CStoreEditor;
+
+# fetch the org_unit's and org_unit_type's
+my $e = OpenILS::Utils::CStoreEditor->new;
+my $lassos = $e->request(
+    'open-ils.cstore.direct.actor.org_lasso.search.atomic',
+    {id => {"!=" => undef}},
+    {order_by => {lasso => 'name'}}
+);
+
+print
+    "var _lasso = [\n  new lasso(" .
+    join( "),\n  new lasso(", map { OpenSRF::Utils::JSON->perl2JSON( bless($_, 'ARRAY') ) } @$lassos ) .
+    ")\n]; /* Org Search Groups (Lassos) */ \n";
+
+
index fab85fa..a867650 100644 (file)
@@ -24,8 +24,12 @@ $cache->delete_cache('orgtree');
 
 # fetch the org_unit's and org_unit_type's
 my $e = OpenILS::Utils::CStoreEditor->new;
-my $tree = $e->retrieve_all_actor_org_unit;
 my $types = $e->retrieve_all_actor_org_unit_type;
+my $tree = $e->request(
+    'open-ils.cstore.direct.actor.org_unit.search.atomic',
+    {id => {"!=" => undef}},
+    {order_by => {aou => 'name'}}
+);
 
 
 sub val {
diff --git a/Open-ILS/src/extras/org_tree_proximity.pl b/Open-ILS/src/extras/org_tree_proximity.pl
new file mode 100644 (file)
index 0000000..97a435f
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+# -----------------------------------------------------------------------
+# Copyright (C) 2008  Laurentian University
+# Dan Scott <dscott@laurentian.ca>
+# 
+# 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.
+# -----------------------------------------------------------------------
+
+# calculate the proximity of organizations in the organization tree
+
+# vim:noet:ts=4:sw=4
+
+use OpenSRF::AppSession;
+use OpenSRF::System;
+use OpenILS::Utils::Fieldmapper;
+use OpenSRF::Utils::SettingsClient;
+
+die "usage: perl org_tree_proximity.pl <bootstrap_config>" unless $ARGV[0];
+OpenSRF::System->bootstrap_client(config_file => $ARGV[0]);
+
+Fieldmapper->import(IDL => OpenSRF::Utils::SettingsClient->new->config_value("IDL"));
+
+my $ses = OpenSRF::AppSession->create("open-ils.storage");
+my $result = $ses->request("open-ils.storage.actor.org_unit.refresh_proximity");
+
+if ($result) {
+       print "Successfully updated the organization proximity";
+} else {
+       print "Failed to update the organiziation proximity";
+}
+
+$ses->disconnect();
index 5cad8b4..621e453 100644 (file)
@@ -43,6 +43,7 @@ var currentLocation   = environment.location;
 var holdRequestLib     = environment.requestLib;
 var holdPickupLib       = environment.pickupLib; /* hold pickup lib */
 var requestor = environment.requestor || patron;
+var newHold = environment.newHold;
 
 
 
@@ -204,7 +205,12 @@ function hasCommonAncestor( org1, org2, depth ) {
        return false;
 }
 
-
+/* returns a dictionary of circmod : count for checked out items */
+function checkoutsByCircModifier(userid) {
+    var key = scratchKey();
+    __OILS_FUNC_userCircsByCircmod(scratchPad(key), userid);
+    return getScratch(key);
+}
 
 /* useful for testing */
 function die(msg) {
index 142c052..942aace 100644 (file)
@@ -18,14 +18,20 @@ if( !isTrue(copy.circulate) )
 
 var config = findGroupConfig(patronProfile);
 
+
 if( config ) {
 
     /* see if they have too many items out */
-    var limit = config.maxHolds;
-    var count = userHoldCount(patron.id);
-    if( limit >= 0 && count >= limit ) {
-        log_info("patron has " + count + " open holds");
-        result.events.push('MAX_HOLDS');
+    if(newHold) {
+        log_info("This is a new hold, checking maxHolds...");
+        var limit = config.maxHolds;
+        var count = userHoldCount(patron.id);
+        if( limit >= 0 && count >= limit ) {
+            log_info("patron has " + count + " open holds");
+            result.events.push('MAX_HOLDS');
+        }
+    } else {
+        log_info("Ignoring maxHolds on existing hold...");
     }
 }
 
index eda27d6..a38ad7e 100644 (file)
@@ -78,39 +78,42 @@ sub set_user_settings {
 }
 
 
-
 __PACKAGE__->register_method(
        method  => "set_ou_settings",
        api_name        => "open-ils.actor.org_unit.settings.update",
 );
 sub set_ou_settings {
-       my( $self, $client, $user_session, $ouid, $settings ) = @_;
-       
-       my( $staff, $evt ) = $apputils->checkses( $user_session );
-       return $evt if $evt;
-       $evt = $apputils->check_perms( $staff->id, $ouid, 'UPDATE_ORG_SETTING' );
-       return $evt if $evt;
+       my( $self, $client, $auth, $org_id, $settings ) = @_;
 
-       my @params;
-       for my $set (keys %$settings) {
-
-               my $json = OpenSRF::Utils::JSON->perl2JSON($$settings{$set});
-               $logger->activity("updating org_unit.setting: $ouid : $set : $json");
+    my $e = new_editor(authtoken => $auth, xact => 1);
+    return $e->die_event unless $e->checkauth;
+    return $e->die_event unless $e->allowed('UPDATE_ORG_SETTING', $org_id);
 
-               push( @params, 
-                       { org_unit => $ouid, name => $set }, 
-                       { value => $json } );
-       }
+       for my $name (keys %$settings) {
+        my $val = $$settings{$name};
+        my $set = $e->search_actor_org_unit_setting({org_unit => $org_id, name => $name})->[0];
 
-       my $ses = $U->start_db_session();
-       my $stat = $ses->request(
-               'open-ils.storage.direct.actor.org_unit_setting.merge', @params )->gather(1);
-       $U->commit_db_session($ses);
+        if(defined $val) {
+            $val = OpenSRF::Utils::JSON->perl2JSON($val);
+            if($set) {
+                $set->value($val);
+                $e->update_actor_org_unit_setting($set) or return $e->die_event;
+            } else {
+                $set = Fieldmapper::actor::org_unit_setting->new;
+                $set->org_unit($org_id);
+                $set->name($name);
+                $set->value($val);
+                $e->create_actor_org_unit_setting($set) or return $e->die_event;
+            }
+        } elsif($set) {
+            $e->delete_actor_org_unit_setting($set) or return $e->die_event;
+        }
+    }
 
-       return $stat;
+    $e->commit;
+    return 1;
 }
 
-
 my $fetch_user_settings;
 my $fetch_ou_settings;
 
@@ -119,21 +122,21 @@ __PACKAGE__->register_method(
        api_name        => "open-ils.actor.patron.settings.retrieve",
 );
 sub user_settings {
-       my( $self, $client, $user_session, $uid, $setting ) = @_;
-       
-       my( $staff, $user, $evt ) = 
-               $apputils->checkses_requestor( $user_session, $uid, 'VIEW_USER' );
-       return $evt if $evt;
+       my( $self, $client, $auth, $user_id, $setting ) = @_;
 
-       $logger->debug("User " . $staff->id . " fetching user $uid\n");
-       my $s = $apputils->simplereq(
-               'open-ils.cstore',
-               'open-ils.cstore.direct.actor.user_setting.search.atomic', { usr => $uid } );
+    my $e = new_editor(authtoken => $auth);
+    return $e->event unless $e->checkauth;
+
+    my $patron = $e->retrieve_actor_user($user_id) or return $e->event;
+    if($e->requestor->id != $user_id) {
+        return $e->event unless $e->allowed('VIEW_USER', $patron->home_ou);
+    }
 
+    my $s = $e->search_actor_user_setting({usr => $user_id});
        my $settings =  { map { ( $_->name => OpenSRF::Utils::JSON->JSON2perl($_->value) ) } @$s };
 
-   return $$settings{$setting} if $setting;
-   return $settings;
+    return $$settings{$setting} if $setting;
+    return $settings;
 }
 
 
@@ -852,7 +855,7 @@ sub set_user_perms {
                        $map->clear_id;
                }
 
-               next if (!$all || !grep { $_->perm eq $map->perm and $_->grantable == 1 and $_->depth <= $map->depth } @$perms);
+               next if (!$all || !grep { $_->perm eq $map->perm and $U->is_true($_->grantable) and $_->depth <= $map->depth } @$perms);
 
                #warn( "Updating permissions with method $method and session $ses and map $map" );
                $logger->info( "Updating permissions with method $method and map $map" );
@@ -3041,9 +3044,5 @@ sub create_user_opt_in_at_org {
 }
 
 
-
-
-
-
 1;
 
index 5bf5c92..e7601df 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Actor::ClosedDates;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use OpenSRF::EX qw(:try);
 use OpenILS::Utils::Editor q/:funcs/;
index b93004a..74ef512 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Actor::Container;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use OpenILS::Application::AppUtils;
 use OpenILS::Perm;
index b2ec498..2ca5965 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Actor::UserGroups;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use OpenILS::Application::AppUtils;
 use OpenILS::Utils::CStoreEditor q/:funcs/;
index 326c1c3..d3eeb1f 100644 (file)
@@ -769,8 +769,7 @@ __PACKAGE__->register_method(
        signature       => q/
                Merges a group of records
                @param auth The login session key
-               @param master The id of the record all other r
-                       ecords should be merged into
+               @param master The id of the record all other records should be merged into
                @param records Array of records to be merged into the master record
                @return 1 on success, Event on error.
        /
@@ -783,8 +782,44 @@ sub merge {
        my $editor = new_editor( requestor => $reqr, xact => 1 );
        my $v = OpenILS::Application::Cat::Merge::merge_records($editor, $master, $records);
        return $v if $v;
-       $editor->finish;
-       return 1;
+       $editor->commit;
+    # tell the client the merge is complete, then merge the holds
+    $conn->respond_complete(1);
+    merge_holds($master, $records);
+       return undef;
+}
+
+sub merge_holds {
+    my($master, $records) = @_;
+    return unless $master and @$records;
+    return if @$records == 1 and $master == $$records[0];
+
+    my $e = new_editor(xact=>1);
+    my $holds = $e->search_action_hold_request(
+        {   cancel_time => undef, 
+            fulfillment_time => undef,
+            hold_type => 'T',
+            target => $records
+        },
+        {idlist=>1}
+    );
+
+    for my $hold_id (@$holds) {
+
+        my $hold = $e->retrieve_action_hold_request($hold_id);
+
+        $logger->info("Changing hold ".$hold->id.
+            " target from ".$hold->target." to $master in record merge");
+
+        $hold->target($master);
+        unless($e->update_action_hold_request($hold)) {
+            my $evt = $e->event;
+            $logger->error("Error updating hold ". $evt->textcode .":". $evt->desc .":". $evt->stacktrace); 
+        }
+    }
+
+    $e->commit;
+    return undef;
 }
 
 
@@ -870,7 +905,7 @@ sub fleshed_volume_update {
                }
 
                # now update any attached copies
-               if( @$copies and !$vol->isdeleted ) {
+               if( $copies and @$copies and !$vol->isdeleted ) {
                        $_->call_number($vol->id) for @$copies;
                        $evt = update_fleshed_copies( $editor, $override, $vol, $copies, $delete_stats );
                        return $evt if $evt;
index 77e596c..0c54a50 100644 (file)
@@ -1,6 +1,6 @@
 use strict; use warnings;
 package OpenILS::Application::Cat::Merge;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use OpenSRF::Application;
 use OpenILS::Application::AppUtils;
 use OpenILS::Application::Cat::Utils;
@@ -114,16 +114,15 @@ sub merge_records {
                        $vol->edit_date('now');
                        $vol->record( $master );
                        $editor->update_asset_call_number($vol)
-                               or return $editor->event;
+                               or return $editor->die_event;
                }
        }
 
        # cycle through and delete the non-master records
        for my $rec (@recs) {
 
-               my ($record, $evt) = 
-                       $editor->retrieve_biblio_record_entry($rec);
-               return $evt if $evt;
+               my $record = $editor->retrieve_biblio_record_entry($rec)
+            or return $editor->die_event;
 
                $logger->debug("merge: seeing if record $rec needs to be deleted or un-deleted");
 
@@ -135,7 +134,7 @@ sub merge_records {
                                $record->editor($reqr->id);
                                $record->edit_date('now');
                                $editor->update_biblio_record_entry($record, {checkperm => 1})
-                                       or return $editor->event;
+                                       or return $editor->die_event;
                        }
 
                } else {
@@ -144,7 +143,7 @@ sub merge_records {
                        $record->editor($reqr->id);
                        $record->edit_date('now');
                        $editor->update_biblio_record_entry($record, {checkperm => 1})
-                               or return $editor->event;
+                               or return $editor->die_event;
                }
        }
 
@@ -207,7 +206,7 @@ sub merge_volumes {
                        $copy->call_number($bigcn);
                        $copy->editor($editor->requestor->id);
                        $copy->edit_date('now');
-                       $editor->update_asset_copy($copy) or return (undef, $editor->event);
+                       $editor->update_asset_copy($copy) or return (undef, $editor->die_event);
                }
        }
 
@@ -217,8 +216,9 @@ sub merge_volumes {
                $_->deleted('t');
                $_->editor($editor->requestor->id);
                $_->edit_date('now');
-               return (undef,$editor->event) unless $editor->allowed('UPDATE_VOLUME', $_->owning_lib);
-               $editor->update_asset_call_number($_) or return (undef, $editor->event);
+               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);
        }
 
        my ($mvol) = grep { $_->id == $bigcn } @$volumes;
@@ -226,6 +226,32 @@ sub merge_volumes {
        return ($mvol);
 }
 
+sub merge_volume_holds {
+    my($e, $master_id, $vol_id) = @_;
+
+    my $holds = $e->search_action_hold_request(
+        {   cancel_time => undef, 
+            fulfillment_time => undef,
+            hold_type => 'V',
+            target => $vol_id
+        }
+    );
+
+    for my $hold (@$holds) {
+
+        $logger->info("Changing hold ".$hold->id.
+            " target from ".$hold->target." to $master_id in volume merge");
+
+        $hold->target($master_id);
+        unless($e->update_action_hold_request($hold)) {
+            my $evt = $e->event;
+            $logger->error("Error updating hold ". $evt->textcode .":". $evt->desc .":". $evt->stacktrace); 
+        }
+    }
+
+    return undef;
+}
+
 
 1;
 
index 3bf9ff1..2076337 100644 (file)
@@ -257,6 +257,9 @@ sub new_set_circ_lost {
 
     $e->allowed('SET_CIRC_LOST', $circ->circ_lib) or return $e->die_event;
 
+    return OpenILS::Event->new('COPY_MARKED_LOST')
+           if $copy->status == OILS_COPY_STATUS_LOST;
+
     # ---------------------------------------------------------------------
     # fetch the related org settings
     my $default_price = $U->ou_ancestor_setting_value(
@@ -273,12 +276,10 @@ sub new_set_circ_lost {
 
     # ---------------------------------------------------------------------
     # move the copy into LOST status
-       unless( $copy->status == OILS_COPY_STATUS_LOST ) {
-               $copy->status(OILS_COPY_STATUS_LOST);
-        $copy->editor($e->requestor->id);
-        $copy->edit_date('now');
-        $e->update_asset_copy($copy) or return $e->die_event;
-       }
+    $copy->status(OILS_COPY_STATUS_LOST);
+    $copy->editor($e->requestor->id);
+    $copy->edit_date('now');
+    $e->update_asset_copy($copy) or return $e->die_event;
 
     # ---------------------------------------------------------------------
     # determine the appropriate item price to charge and create the billing
@@ -336,6 +337,8 @@ sub reopen_xact {
                 or return $e->die_event;
         } 
     }
+
+    return undef;
 }
 
 
@@ -888,7 +891,7 @@ sub copy_details_barcode {
     my $e = new_editor();
     my $cid = $e->search_asset_copy({barcode=>$barcode, deleted=>'f'}, {idlist=>1})->[0];
     return $e->event unless $cid;
-       return $self->copy_details( $conn, $auth, $cid );
+       return copy_details( $self, $conn, $auth, $cid );
 }
 
 
index f6383fb..d1109b4 100644 (file)
@@ -1,6 +1,6 @@
 package OpenILS::Application::Circ::Circulate;
 use strict; use warnings;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use OpenSRF::EX qw(:try);
 use OpenSRF::Utils::SettingsClient;
 use OpenSRF::Utils::Logger qw(:logger);
index f5c5dd2..2952d2b 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Circ::CopyLocations;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use Data::Dumper;
 $Data::Dumper::Indent = 0;
index c78cfba..7cb3283 100644 (file)
@@ -15,7 +15,7 @@
 
 
 package OpenILS::Application::Circ::HoldNotify;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 use OpenSRF::EX qw(:try);
 use vars q/$AUTOLOAD/;
index 608d993..97bf16f 100644 (file)
@@ -15,7 +15,7 @@
 
 
 package OpenILS::Application::Circ::Holds;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 use OpenILS::Application::AppUtils;
 use Data::Dumper;
@@ -113,16 +113,16 @@ sub create_hold {
                push( @events, OpenILS::Event->new('HOLD_EXISTS')) if @$existing;
 
                if( $t eq OILS_HOLD_TYPE_METARECORD ) 
-                       { $pevt = $e->event unless $e->checkperm($rid, $porg, 'MR_HOLDS'); }
+                       { $pevt = $e->event unless $e->allowed('MR_HOLDS', $porg); }
 
                if( $t eq OILS_HOLD_TYPE_TITLE ) 
-                       { $pevt = $e->event unless $e->checkperm($rid, $porg, 'TITLE_HOLDS');  }
+                       { $pevt = $e->event unless $e->allowed('TITLE_HOLDS', $porg);  }
 
                if( $t eq OILS_HOLD_TYPE_VOLUME ) 
-                       { $pevt = $e->event unless $e->checkperm($rid, $porg, 'VOLUME_HOLDS'); }
+                       { $pevt = $e->event unless $e->allowed('VOLUME_HOLDS', $porg); }
 
                if( $t eq OILS_HOLD_TYPE_COPY ) 
-                       { $pevt = $e->event unless $e->checkperm($rid, $porg, 'COPY_HOLDS'); }
+                       { $pevt = $e->event unless $e->allowed('COPY_HOLDS', $porg); }
 
                return $pevt if $pevt;
 
@@ -140,7 +140,7 @@ sub create_hold {
 
                $hold->requestor($e->requestor->id); 
                $hold->request_lib($e->requestor->ws_ou);
-               $hold->selection_ou($recipient->home_ou) unless $hold->selection_ou;
+               $hold->selection_ou($hold->pickup_lib) unless $hold->selection_ou;
                $hold = $e->create_action_hold_request($hold) or return $e->event;
        }
 
@@ -149,7 +149,7 @@ sub create_hold {
        $conn->respond_complete(1);
 
     for(@holds) {
-        next if $_->frozen;
+        next if $U->is_true($_->frozen);
            $U->storagereq(
                    'open-ils.storage.action.hold_request.copy_targeter', 
                    undef, $_->id );
@@ -359,7 +359,7 @@ sub user_hold_count {
    my $patron = $e->retrieve_actor_user($userid)
       or return $e->event;
    return $e->event unless $e->allowed('VIEW_HOLD', $patron->home_ou);
-   return $self->__user_hold_count($e, $userid);
+   return __user_hold_count($self, $e, $userid);
 }
 
 sub __user_hold_count {
@@ -483,7 +483,7 @@ sub cancel_hold {
        $e->update_action_hold_request($hold)
                or return $e->event;
 
-       $self->delete_hold_copy_maps($e, $hold->id);
+       delete_hold_copy_maps($self, $e, $hold->id);
 
        $e->commit;
        return 1;
@@ -518,6 +518,12 @@ sub update_hold {
     my $e = new_editor(authtoken=>$auth, xact=>1);
     return $e->die_event unless $e->checkauth;
 
+    my $orig_hold = $e->retrieve_action_hold_request($hold->id)
+        or return $e->die_event;
+
+    # don't allow the user to be changed
+    return OpenILS::Event->new('BAD_PARAMS') if $hold->usr != $orig_hold->usr;
+
     if($hold->usr ne $e->requestor->id) {
         # if the hold is for a different user, make sure the 
         # requestor has the appropriate permissions
@@ -526,12 +532,8 @@ sub update_hold {
         return $e->die_event unless $e->allowed('UPDATE_HOLD', $usr->home_ou);
     }
 
-    my $evt = $self->update_hold_if_frozen($e, $hold);
-    return $evt if $evt;
-
-    $e->update_action_hold_request($hold)
-        or return $e->die_event;
-
+    update_hold_if_frozen($self, $e, $hold, $orig_hold);
+    $e->update_action_hold_request($hold) or return $e->die_event;
     $e->commit;
     return $hold->id;
 }
@@ -539,17 +541,22 @@ sub update_hold {
 
 # if the hold is frozen, this method ensures that the hold is not "targeted", 
 # that is, it clears the current_copy and prev_check_time to essentiallly 
-# reset the hold
+# reset the hold.  If it is being activated, it runs the targeter in the background
 sub update_hold_if_frozen {
-    my($self, $e, $hold) = @_;
-    return undef if $hold->capture_time;
-    if($hold->frozen and ($hold->current_copy or $hold->prev_check_time)) {
-        $logger->info("clearing current_copy and check_time for frozen hold");
+    my($self, $e, $hold, $orig_hold) = @_;
+    return if $hold->capture_time;
+
+    if($U->is_true($hold->frozen)) {
+        $logger->info("clearing current_copy and check_time for frozen hold ".$hold->id);
         $hold->clear_current_copy;
         $hold->clear_prev_check_time;
-        $e->update_action_hold_request($hold) or return $e->die_event;
+
+    } else {
+        if($U->is_true($orig_hold->frozen)) {
+            $logger->info("Running targeter on activated hold ".$hold->id);
+               $U->storagereq( 'open-ils.storage.action.hold_request.copy_targeter', undef, $hold->id );
+        }
     }
-    return undef;
 }
 
 
@@ -774,7 +781,7 @@ sub reset_hold {
        return $evt if $evt;
        ($reqr, $evt) = $U->checksesperm($auth, 'UPDATE_HOLD'); # XXX stronger permission
        return $evt if $evt;
-       $evt = $self->_reset_hold($reqr, $hold);
+       $evt = _reset_hold($self, $reqr, $hold);
        return $evt if $evt;
        return 1;
 }
@@ -967,7 +974,6 @@ sub fetch_captured_holds {
        }
 }
 
-
 __PACKAGE__->register_method(
        method  => "check_title_hold",
        api_name        => "open-ils.circ.title_hold.is_possible",
@@ -989,10 +995,11 @@ sub check_title_hold {
        my $titleid             = $params{titleid} ||"";
        my $volid               = $params{volume_id};
        my $copyid              = $params{copy_id};
-       my $mrid                        = $params{mrid} ||"";
+       my $mrid                = $params{mrid} ||"";
        my $depth               = $params{depth} || 0;
        my $pickup_lib  = $params{pickup_lib};
        my $hold_type   = $params{hold_type} || 'T';
+    my $selection_ou = $params{selection_ou} || $pickup_lib;
 
        my $e = new_editor(authtoken=>$authtoken);
        return $e->event unless $e->checkauth;
@@ -1006,12 +1013,60 @@ sub check_title_hold {
 
        return OpenILS::Event->new('PATRON_BARRED') if $U->is_true($patron->barred);
 
-       my $rangelib    = $params{range_lib} || $patron->home_ou;
-
        my $request_lib = $e->retrieve_actor_org_unit($e->requestor->ws_ou)
                or return $e->event;
 
-       $logger->info("checking hold possibility with type $hold_type");
+    my $soft_boundary = $U->ou_ancestor_setting_value($selection_ou, OILS_SETTING_HOLD_SOFT_BOUNDARY);
+    my $hard_boundary = $U->ou_ancestor_setting_value($selection_ou, OILS_SETTING_HOLD_HARD_BOUNDARY);
+
+    if(defined $soft_boundary and $$params{depth} < $soft_boundary) {
+        # work up the tree and as soon as we find a potential copy, use that depth
+        # also, make sure we don't go past the hard boundary if it exists
+
+        # our min boundary is the greater of user-specified boundary or hard boundary
+        my $min_depth = (defined $hard_boundary and $hard_boundary > $$params{depth}) ?  
+            $hard_boundary : $$params{depth};
+
+        my $depth = $soft_boundary;
+        while($depth >= $min_depth) {
+            $logger->info("performing hold possibility check with soft boundary $depth");
+            return {success => 1, depth => $depth}
+                if do_possibility_checks($e, $patron, $request_lib, $depth, %params);
+            $depth--;
+        }
+        return {success => 0};
+
+    } elsif(defined $hard_boundary and $$params{depth} < $hard_boundary) {
+        # there is no soft boundary, enforce the hard boundary if it exists
+        $logger->info("performing hold possibility check with hard boundary $hard_boundary");
+        if(do_possibility_checks($e, $patron, $request_lib, $hard_boundary, %params)) {
+            return {success => 1, depth => $hard_boundary}
+        } else {
+            return {success => 0};
+        }
+
+    } else {
+        # no boundaries defined, fall back to user specifed boundary or no boundary
+        $logger->info("performing hold possibility check with no boundary");
+        if(do_possibility_checks($e, $patron, $request_lib, $params{depth}, %params)) {
+            return {success => 1, depth => $hard_boundary};
+        } else {
+            return {success => 0};
+        }
+    }
+}
+
+sub do_possibility_checks {
+    my($e, $patron, $request_lib, $depth, %params) = @_;
+
+       my $titleid             = $params{titleid} ||"";
+       my $volid               = $params{volume_id};
+       my $copyid              = $params{copy_id};
+       my $mrid                = $params{mrid} ||"";
+       my $pickup_lib  = $params{pickup_lib};
+       my $hold_type   = $params{hold_type} || 'T';
+    my $selection_ou = $params{selection_ou} || $pickup_lib;
+
 
        my $copy;
        my $volume;
@@ -1035,12 +1090,12 @@ sub check_title_hold {
                        or return $e->event;
 
                return _check_volume_hold_is_possible(
-                       $volume, $title, $rangelib, $depth, $request_lib, $patron, $e->requestor, $pickup_lib);
+                       $volume, $title, $depth, $request_lib, $patron, $e->requestor, $pickup_lib, $selection_ou);
 
        } elsif( $hold_type eq OILS_HOLD_TYPE_TITLE ) {
 
                return _check_title_hold_is_possible(
-                       $titleid, $rangelib, $depth, $request_lib, $patron, $e->requestor, $pickup_lib);
+                       $titleid, $depth, $request_lib, $patron, $e->requestor, $pickup_lib, $selection_ou);
 
        } elsif( $hold_type eq OILS_HOLD_TYPE_METARECORD ) {
 
@@ -1048,49 +1103,12 @@ sub check_title_hold {
                my @recs = map { $_->source } @$maps;
                for my $rec (@recs) {
                        return 1 if (_check_title_hold_is_possible(
-                               $rec, $rangelib, $depth, $request_lib, $patron, $e->requestor, $pickup_lib));
+                               $rec, $depth, $request_lib, $patron, $e->requestor, $pickup_lib, $selection_ou));
                }
                return 0;       
        }
 }
 
-
-
-sub ___check_title_hold_is_possible {
-       my( $titleid, $rangelib, $depth, $request_lib, $patron, $requestor, $pickup_lib ) = @_;
-
-       my $limit       = 10;
-       my $offset      = 0;
-       my $title;
-
-       $logger->debug("Fetching ranged title tree for title $titleid, org $rangelib, depth $depth");
-
-       while( $title = $U->storagereq(
-                               'open-ils.storage.biblio.record_entry.ranged_tree', 
-                               $titleid, $rangelib, $depth, $limit, $offset ) ) {
-
-               last unless 
-                       ref($title) and 
-                       ref($title->call_numbers) and 
-                       @{$title->call_numbers};
-
-               for my $cn (@{$title->call_numbers}) {
-       
-                       $logger->debug("Checking callnumber ".$cn->id." for hold fulfillment possibility");
-       
-                       for my $copy (@{$cn->copies}) {
-                               $logger->debug("Checking copy ".$copy->id." for hold fulfillment possibility");
-                               return 1 if verify_copy_for_hold( 
-                                       $patron, $requestor, $title, $copy, $pickup_lib, $request_lib );
-                               $logger->debug("Copy ".$copy->id." for hold fulfillment possibility failed...");
-                       }
-               }
-
-               $offset += $limit;
-       }
-       return 0;
-}
-
 my %prox_cache;
 
 sub _check_metarecord_hold_is_possible {
@@ -1200,10 +1218,35 @@ sub _check_metarecord_hold_is_possible {
    return 0;
 }
 
+sub create_ranged_org_filter {
+    my($e, $selection_ou, $depth) = @_;
+
+    # find the orgs from which this hold may be fulfilled, 
+    # based on the selection_ou and depth
+
+    my $top_org = $e->search_actor_org_unit([
+        {parent_ou => undef}, 
+        {flesh=>1, flesh_fields=>{aou=>['ou_type']}}])->[0];
+    my %org_filter;
+
+    return () if $depth == $top_org->ou_type->depth;
+
+    my $org_list = $U->storagereq('open-ils.storage.actor.org_unit.descendants.atomic', $selection_ou, $depth);
+    %org_filter = (circ_lib => []);
+    push(@{$org_filter{circ_lib}}, $_->id) for @$org_list;
+
+    $logger->info("hold org filter at depth $depth and selection_ou ".
+        "$selection_ou created list of @{$org_filter{circ_lib}}");
+
+    return %org_filter;
+}
+
+
 sub _check_title_hold_is_possible {
-       my( $titleid, $rangelib, $depth, $request_lib, $patron, $requestor, $pickup_lib ) = @_;
+       my( $titleid, $depth, $request_lib, $patron, $requestor, $pickup_lib, $selection_ou ) = @_;
    
-   my $e = new_editor();
+    my $e = new_editor();
+    my %org_filter = create_ranged_org_filter($e, $selection_ou, $depth);
 
     # this monster will grab the id and circ_lib of all of the "holdable" copies for the given record
     my $copies = $e->json_query(
@@ -1227,7 +1270,7 @@ sub _check_title_hold_is_possible {
                 }
             }, 
             where => {
-                '+acp' => { circulate => 't', deleted => 'f', holdable => 't' }
+                '+acp' => { circulate => 't', deleted => 'f', holdable => 't', %org_filter }
             }
         }
     );
@@ -1313,8 +1356,9 @@ sub _check_title_hold_is_possible {
 
 
 sub _check_volume_hold_is_possible {
-       my( $vol, $title, $rangelib, $depth, $request_lib, $patron, $requestor, $pickup_lib ) = @_;
-       my $copies = new_editor->search_asset_copy({call_number => $vol->id});
+       my( $vol, $title, $depth, $request_lib, $patron, $requestor, $pickup_lib, $selection_ou ) = @_;
+    my %org_filter = create_ranged_org_filter(new_editor(), $selection_ou, $depth);
+       my $copies = new_editor->search_asset_copy({call_number => $vol->id, %org_filter});
        $logger->info("checking possibility of volume hold for volume ".$vol->id);
        for my $copy ( @$copies ) {
                return 1 if verify_copy_for_hold( 
@@ -1335,7 +1379,8 @@ sub verify_copy_for_hold {
                        title                           => $title, 
                        title_descriptor        => $title->fixed_fields, # this is fleshed into the title object
                        pickup_lib                      => $pickup_lib,
-                       request_lib                     => $request_lib 
+                       request_lib                     => $request_lib,
+            new_hold            => 1
                } 
        );
        return 0;
@@ -1366,7 +1411,7 @@ sub find_nearest_permitted_hold {
        for my $h (@$old_holds) { return ($h) if $h->hold_type eq 'R'; }
 
 
-    my $hold_stall_interval = $U->ou_ancestor_setting_value($user->ws_ou, 'circ.hold_stalling.soft');
+    my $hold_stall_interval = $U->ou_ancestor_setting_value($user->ws_ou, OILS_SETTING_HOLD_SOFT_STALL);
 
        $logger->info("circulator: searching for best hold at org ".$user->ws_ou.
         " and copy $bc with a hold stalling interval of ". ($hold_stall_interval || "(none)"));
index a0525b2..c8a1129 100644 (file)
@@ -15,7 +15,7 @@
 
 
 package OpenILS::Application::Circ::Money;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 use OpenILS::Application::AppUtils;
 my $apputils = "OpenILS::Application::AppUtils";
@@ -86,7 +86,7 @@ sub make_payments {
 
                $total_paid += $amount;
 
-               $trans = $self->fetch_mbts($client, $login, $transid);
+               $trans = fetch_mbts($self, $client, $login, $transid);
                return $trans if $U->event_code($trans);
 
                $logger->info("payment: processing transaction [$transid] with balance_owed = ". 
@@ -316,6 +316,11 @@ sub create_grocery_bill {
        
        $apputils->commit_db_session($session);
 
+    my $e = new_editor(xact=>1);
+    $evt = _check_open_xact($e, $transid);
+    return $evt if $evt;
+    $e->commit;
+
        return $transid;
 }
 
index ea3b8f0..4c1226b 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Circ::NonCat;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use OpenSRF::EX qw(:try);
 use Data::Dumper;
@@ -58,39 +58,6 @@ __PACKAGE__->register_method(
                event on failure
        /);
 
-sub __create_noncat_type {
-       my( $self, $client, $authtoken, $name, $orgId, $interval, $inhouse ) = @_;
-       my( $staff, $evt ) = $U->checkses($authtoken);
-       return $evt if $evt;
-
-       # grab all of "my" non-cat types and see if one with 
-       # the requested name already exists
-       my $types = $self->retrieve_noncat_types_all($client, $orgId);
-       for(@$types) {
-               if( $_->name eq $name ) {
-                       return OpenILS::Event->new('NON_CAT_TYPE_EXISTS', payload => $name);
-               }
-       }
-
-       $evt = $U->check_perms( $staff->id, $orgId, 'CREATE_NON_CAT_TYPE' );
-       return $evt if $evt;
-
-       my $type = Fieldmapper::config::non_cataloged_type->new;
-       $type->name($name);
-       $type->owning_lib($orgId);
-       $type->circ_duration($interval);
-       $type->in_house( ($inhouse) ? 't' : 'f' );
-
-       my $id = $U->simplereq(
-               'open-ils.storage',
-               'open-ils.storage.direct.config.non_cataloged_type.create', $type );
-
-       return $U->DB_UPDATE_FAILED($type) unless $id;
-       $type->id($id);
-       return $type;
-}
-
-
 sub create_noncat_type {
        my( $self, $client, $authtoken, $name, $orgId, $interval, $inhouse ) = @_;
 
@@ -100,7 +67,7 @@ sub create_noncat_type {
 
        # grab all of "my" non-cat types and see if one with 
        # the requested name already exists
-       my $types = $self->retrieve_noncat_types_all($client, $orgId);
+       my $types = retrieve_noncat_types_all($self, $client, $orgId);
        for(@$types) {
                if( $_->name eq $name ) {
                        $e->rollback;
index 41ab511..af8ead5 100644 (file)
@@ -390,6 +390,45 @@ sub insert_user_funcs {
                        return $val;
                }
        );
+
+       $runner->insert(__OILS_FUNC_userCircsByCircmod  => 
+               sub {
+                       my( $write_key, $userid ) = @_;
+            use OpenSRF::Utils::JSON;
+
+            # this bug ugly thing generates a count of checkouts by circ_modifier
+             my $query = {
+                "select" => {
+                    "acp" => ["circ_modifier"],
+                    "circ"=>[{
+                        "aggregate"=> OpenSRF::Utils::JSON->true,
+                        "transform"=>"count",
+                        "alias"=>"count",
+                        "column"=>"id"
+                    }],
+                },
+                "from"=>{"acp"=>{"circ"=>{"field"=>"target_copy","fkey"=>"id"}}},
+                "where"=>{
+                    "+circ"=>{
+                        "checkin_time"=>undef,
+                        "usr"=>$userid,
+                        "-or"=>[
+                            {"stop_fines"=>["LOST","LONGOVERDUE","CLAIMSRETURNED"]},
+                            {"stop_fines"=>undef}
+                        ]
+                    }
+                }
+            };
+
+            my $mods = $e->json_query($query);
+            my $breakdown = {};
+            $breakdown->{$_->{circ_modifier}} = $_->{count} for @$mods;
+            $logger->info("script_runner: Loaded checkouts by circ_modifier breakdown:". 
+                OpenSRF::Utils::JSON->perl2JSON($breakdown));
+                       $runner->insert($write_key, $breakdown, 1) if (keys %$breakdown);
+               }
+       );
+
 }
 
 
index 8155c61..57e20dd 100644 (file)
@@ -14,7 +14,7 @@
 # ---------------------------------------------------------------
 
 package OpenILS::Application::Circ::StatCat;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 use OpenSRF::Utils::Logger qw($logger);
index 096c7ca..643d5e6 100644 (file)
@@ -14,7 +14,7 @@
 # ---------------------------------------------------------------
 
 package OpenILS::Application::Circ::Survey;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 use OpenSRF::EX qw/:try/;
 use OpenILS::Application::AppUtils;
@@ -55,7 +55,7 @@ sub add_survey {
        if($err) { throw OpenSRF::EX::ERROR ($err); }
 
        # re-retrieve the survey from the db and return it
-       return $self->get_fleshed_survey( $client, $survey->id() );
+       return get_fleshed_survey($self, $client, $survey->id() );
 }
 
 
@@ -161,7 +161,7 @@ sub get_required_surveys {
 
        my @fleshed;
        for my $survey (@$surveys) {
-               push(@fleshed, $self->get_fleshed_survey($client, $survey));
+               push(@fleshed, get_fleshed_survey($self, $client, $survey));
        }
        return \@fleshed;
 
@@ -210,7 +210,7 @@ sub get_all_surveys {
 
        my @fleshed;
        for my $survey (@$surveys) {
-               push(@fleshed, $self->get_fleshed_survey($client, $survey));
+               push(@fleshed, get_fleshed_survey($self, $client, $survey));
        }
        return \@fleshed;
 }
@@ -368,7 +368,7 @@ sub get_random_survey {
        warn "Random survey index for process $$ is $random\n";
        my $surv = $surveys->[$random];
 
-       return $self->get_fleshed_survey($client, $surv);
+       return get_fleshed_survey($self, $client, $surv);
 
 }
 
@@ -390,7 +390,7 @@ sub get_random_survey_global {
        warn "Random survey index for process $$ is $random\n";
        my $surv = $surveys->[$random];
 
-       return $self->get_fleshed_survey($client, $surv);
+       return get_fleshed_survey($self, $client, $surv);
 
 }
 
index ff3ad4e..dd6fea7 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Circ::Transit;
-use base 'OpenSRF::Application';
+use base 'OpenILS::Application';
 use strict; use warnings;
 use OpenSRF::EX qw(:try);
 use Data::Dumper;
@@ -44,7 +44,7 @@ sub copy_transit_receive {
        ($copy, $evt) = $U->fetch_copy_by_barcode($params{barcode}) unless $copy;
        return $evt if $evt;
        my $session = $U->start_db_session();
-       $evt = $self->transit_receive( $copy, $requestor, $session );
+       $evt = transit_receive( $self, $copy, $requestor, $session );
        $U->commit_db_session($session) if $U->event_equals($evt,'SUCCESS');
        return $evt;
 }
index e1cd9b4..e558c0f 100644 (file)
@@ -129,7 +129,7 @@ sub process_users_of_interest_results {
     my($self, $conn, $e, $req, $starttime, @params) = @_;
 
    my $total;
-   while( my $resp = $req->recv(timeout => 600) ) {
+   while( my $resp = $req->recv(timeout => 7200) ) {
 
         return $req->failed if $req->failed;
         my $hash = $resp->content;
@@ -304,7 +304,7 @@ sub users_with_activity {
     $conn->status( new OpenSRF::DomainObject::oilsContinueStatus );
 
     my $total;
-    while( my $resp = $req->recv(timeout => 600) ) {
+    while( my $resp = $req->recv(timeout => 7200) ) {
 
         unless($total) {
             $total = time - $start;
diff --git a/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm b/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm
new file mode 100644 (file)
index 0000000..0289f95
--- /dev/null
@@ -0,0 +1,304 @@
+# --------------------------------------------------------------------
+# Copyright (C) 2008 Niles Ingalls 
+# Niles Ingalls <nilesi@zionsville.lib.in.us>
+# Bill Erickson <erickson@esilibrary.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.
+# --------------------------------------------------------------------
+package OpenILS::Application::CreditCard;
+use base qw/OpenSRF::Application/;
+use strict; use warnings;
+
+use DateTime;
+use DateTime::Format::ISO8601;
+use OpenILS::Application::AppUtils;
+use OpenSRF::Utils qw/:datetime/;
+use OpenILS::Event;
+use OpenSRF::EX qw(:try);
+use OpenSRF::Utils::Logger qw(:logger);
+use OpenILS::Utils::Fieldmapper;
+use OpenILS::Utils::CStoreEditor q/:funcs/;
+use OpenILS::Const qw/:const/;
+use OpenSRF::Utils::SettingsClient;
+use Business::CreditCard;
+use Business::CreditCard::Object;
+use Business::OnlinePayment;
+
+
+__PACKAGE__->register_method(
+    method    => 'process_payment',
+    api_name  => 'open-ils.credit.process',
+    signature => {
+        desc   => 'Creates a new provider',
+        params => [
+            { desc => 'Authentication token', type => 'string' },
+            { desc => q/Hash of arguments.  Options include:
+                XXX add docs as API stablilizes...
+                /, type => 'hash' }
+        ],
+        return => { desc => 'Hash of status information', type=>'hash' }
+    }
+);
+
+sub process_payment {
+    my $self     = shift;
+    my $client   = shift;
+    my $argshash = shift;
+
+    my $e = new_editor();
+    my $patron = $e->retrieve_actor_user(
+        [
+            $argshash->{patron_id},
+            {
+                flesh        => 1,
+                flesh_fields => { au => ["mailing_address"] }
+            }
+        ]
+    ) or return $e->event;
+
+    return OpenILS::Event->new('BAD_PARAMS')
+      unless $argshash->{login}
+          and $argshash->{password}
+          and $argshash->{action};
+
+    if ( $argshash->{processor} eq 'PayPal' ) {    
+        #  XXX not ready for prime time
+        return handle_paypal($e, $argshash, $patron);
+
+    } elsif ( $argshash->{processor} eq 'AuthorizeNet' ) {
+        return handle_authorizenet($e, $argshash, $patron);
+    }
+}
+
+sub handle_paypal {
+    my($e, $argshash, $patron) = @_;
+
+    require Business::PayPal::API;
+    require Business::OnlinePayment::PayPal;
+    my $card = Business::CreditCard::Object->new( $argshash->{cc} );
+
+    $logger->debug("applying paypal payment");
+
+    if ( !$card->is_valid ) {
+        return {
+            statusText       => "should return address:(patron_id):",
+            processor        => $argshash->{processor},
+            testmode         => $argshash->{testmode},
+            card             => $card->number(),
+            expiration       => $argshash->{expiration},
+            name             => $patron->first_given_name,
+            patron_id        => $patron->id,
+            patron_patron_id => $patron->mailing_address,
+            statusCode       => 500
+        };
+    }
+
+    my $type = $card->type();
+
+    if ( substr( $type, -5, 5 ) =~ / card/ ) {
+        $type = substr( $type, 0, -5 );
+    }
+
+    my $transaction = Business::OnlinePayment->new(
+        $argshash->{processor},
+        "Username"  => $argshash->{PayPal_Username},
+        "Password"  => $argshash->{PayPal_Password},
+        "Signature" => $argshash->{PayPal_Signature}
+    );
+
+    $transaction->content(
+        action      => $argshash->{action},
+        amount      => $argshash->{amount},
+        type        => "$type",
+        card_number => $card->number(),
+        expiration  => $argshash->{expiration},
+        cvv2        => $argshash->{cvv2},
+        name => $patron->first_given_name . ' ' . $patron->family_name,
+        address => $patron->mailing_address->street1,
+        city    => $patron->mailing_address->city,
+        state   => $patron->mailing_address->state,
+        zip     => $patron->mailing_address->post_code
+    );
+
+    $transaction->test_transaction(1); # XXX
+    $transaction->submit;
+
+    if ( $transaction->is_success ) {
+        return {
+            statusText => "Card approved: ".$transaction->authorization,
+            statusCode    => 200,
+            approvalCode  => $transaction->authorization,
+            CorrelationID => $transaction->correlationid
+        };
+
+    } else {
+        return {
+            statusText => "Card declined: " . $transaction->error_message,
+            statusCode => 500
+
+        };
+    }
+}
+
+sub handle_authorizenet {
+    my($e, $argshash, $patron) = @_;
+
+    require Business::OnlinePayment::AuthorizeNet;
+    my $card = Business::CreditCard::Object->new( $argshash->{cc} );
+
+    $logger->debug("applying authorize.net payment");
+
+    if ( ! $card->is_valid ) {
+        $logger->warn("authorize.net card number is invalid");
+
+        return {
+            statusText       => "should return address:(patron_id):",
+            processor        => $argshash->{processor},
+            testmode         => $argshash->{testmode},
+            card             => $card->number(),
+            expiration       => $argshash->{expiration},
+            name             => $patron->first_given_name,
+            patron_id        => $patron->id,
+            patron_patron_id => $patron->mailing_address,
+            statusCode       => 500
+        };
+    }
+
+    my $type = $card->type();
+
+    if ( substr( $type, -5, 5 ) =~ / card/ ) {
+        $type = substr( $type, 0, -5 );
+    }
+
+    my $transaction = new Business::OnlinePayment( 
+        $argshash->{processor}, 'test_transaction' => $argshash->{testmode});
+
+    $transaction->content(
+        type        => "$type", #'American Express', 'VISA', 'MasterCard'
+        login       => $argshash->{login},
+        password    => $argshash->{password},
+        action      => $argshash->{action},
+        description => $argshash->{description},
+        amount      => $argshash->{amount},
+        card_number => $card->number(),
+        expiration  => $argshash->{expiration},
+        cvv2        => $argshash->{cvv2},
+        first_name  => $patron->first_given_name,
+        last_name   => $patron->family_name,
+        address     => $patron->mailing_address->street1,
+        city        => $patron->mailing_address->city,
+        state       => $patron->mailing_address->state,
+        zip         => $patron->mailing_address->post_code,
+        customer_id => $patron->id
+    );
+
+    $transaction->submit();
+
+    if ( $transaction->is_success() ) {
+        $logger->info("authorize.net payment succeeded");
+        return {
+            statusText => "Card approved: "
+              . $transaction->authorization,
+            statusCode      => 200,
+            approvalCode    => $transaction->authorization,
+            server_response => $transaction->server_response
+
+        };
+
+    } else {
+        $logger->info("authorize.net card declined");
+        return {
+            statusText => "Card decliined: " . $transaction->error_message,
+            statusCode      => 500,
+            approvalCode    => $transaction->error_message,
+            server_response => $transaction->server_response
+        };
+    }
+}
+
+
+__PACKAGE__->register_method(
+    method    => 'retrieve_payable_balance',
+    api_name  => 'open-ils.credit.payable_balance.retrieve',
+    signature => {
+        desc   => '',
+        params => [
+            { desc => 'Authentication token',      type => 'string' },
+            { desc => 'Authentication token', type => 'string' },
+            { desc => 'User id', type => 'number' }
+        ],
+        return => { desc => 'The ID of the new provider' }
+    }
+);
+
+sub retrieve_payable_balance {
+    my ( $self, $conn, $auth, $user_id ) = @_;
+    my $e = new_editor( authtoken => $auth );
+    return $e->event unless $e->checkauth;
+
+    if ( $e->requestor->id != $user_id ) {
+        # XXX check perm
+    }
+
+    my $circ_orgs = $e->json_query({
+        "select" => { "circ" => ["circ_lib"] },
+        from     => "circ",
+        "where"  => { "usr" => $user_id, xact_finish => undef },
+        distinct => 1
+    });
+
+    my $groc_orgs = $e->json_query({
+        "select" => { "mg" => ["billing_location"] },
+        from     => "mg",
+        "where"  => { "usr" => $user_id, xact_finish => undef },
+        distinct => 1
+    });
+
+    my %hash;
+    my @orgs;
+    for my $org ( @$circ_orgs, @$groc_orgs ) {
+        my $o = $org->{billing_location};
+        $o = $org->{circ_lib} unless $o;
+        next if $hash{$org};
+        $hash{$o} =
+          OpenILS::Application::AppUtils->simplereq( 'open-ils.actor',
+            'open-ils.actor.ou_setting.ancestor_default',
+            $o, 'credit.allow' );
+    }
+
+    my @credit_orgs = map { $hash{$_} ? ($_) : () } keys %hash;
+
+    my $xact_summaries =
+      OpenILS::Application::AppUtils->simplereq( 'open-ils.actor',
+        'open-ils.actor.user.transactions.have_charge',
+        $auth, $user_id );
+
+    my $sum = 0.0;
+
+    for my $xact (@$xact_summaries) {
+
+        # make two lists and grab them in batch XXX
+        if ( $xact->xact_type eq 'circulation' ) {
+            my $circ =
+              $e->search_action_circulation( { id => $xact->id } )->[0];
+            next unless grep { $_ == $circ->circ_lib } @credit_orgs;
+        }
+        else {
+            my $bill = $e->search_money_grocery( { id => $xact } )->[0];
+            next unless grep { $_ == $bill->billing_location } @credit_orgs;
+        }
+        $sum += $xact->ballance_owed();
+    }
+
+    return $sum;
+}
+
+1;
diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Fielder.pm b/Open-ILS/src/perlmods/OpenILS/Application/Fielder.pm
new file mode 100644 (file)
index 0000000..c541345
--- /dev/null
@@ -0,0 +1,120 @@
+# vim:et:ts=4:sw=4:
+
+package OpenILS::Application::Fielder;
+use OpenILS::Application;
+use base qw/OpenILS::Application/;
+
+use Unicode::Normalize;
+use OpenSRF::EX qw/:try/;
+
+use OpenSRF::AppSession;
+use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::Logger qw/:level/;
+
+use OpenILS::Utils::Fieldmapper;
+use OpenSRF::Utils::JSON;
+
+use OpenILS::Utils::CStoreEditor qw/:funcs/;
+
+use XML::LibXML;
+use XML::LibXML::XPathContext;
+use XML::LibXSLT;
+
+our %namespace_map = (
+    oils_persist=> {ns => 'http://open-ils.org/spec/opensrf/IDL/persistence/v1'},
+    oils_obj    => {ns => 'http://open-ils.org/spec/opensrf/IDL/objects/v1'},
+    idl         => {ns => 'http://opensrf.org/spec/IDL/base/v1'},
+    reporter    => {ns => 'http://open-ils.org/spec/opensrf/IDL/reporter/v1'},
+    perm        => {ns => 'http://open-ils.org/spec/opensrf/IDL/permacrud/v1'},
+);
+
+
+my $log = 'OpenSRF::Utils::Logger';
+
+my $parser = XML::LibXML->new();
+my $xslt = XML::LibXSLT->new();
+
+my $xpc = XML::LibXML::XPathContext->new();
+$xpc->registerNs($_, $namespace_map{$_}{ns}) for ( keys %namespace_map );
+
+my $idl;
+
+sub initialize {
+
+    my $conf = OpenSRF::Utils::SettingsClient->new;
+    my $idl_file = $conf->config_value( 'IDL' );
+
+    $idl = $parser->parse_file( $idl_file );
+
+    $log->debug( 'IDL XML file loaded' );
+
+    generate_methods();
+
+}
+sub child_init {}
+
+sub fielder_fetch {
+    my $self = shift;
+    my $client = shift;
+    my $obj = shift;
+
+    my $query = $obj->{query};
+    my $fields = $obj->{fields};
+
+    my $obj_class = $self->{class_hint};
+    my $fm_class = $self->{class_name};
+
+    if (!$fields) {
+        $fields = [ $fm_class->real_fields ];
+    }
+
+    $log->debug( 'Field list: '. OpenSRF::Utils::JSON->perl2JSON( $fields ) );
+    $log->debug( 'Query: '. OpenSRF::Utils::JSON->perl2JSON( $query ) );
+
+    return undef unless $fields;
+    return undef unless $query;
+
+    $fields = [$fields] if (!ref($fields));
+
+
+    $log->debug( 'Query Class: '. $obj_class );
+
+    my $res = new_editor()->json_query({
+        select  => { $obj_class => $fields },
+        from    => $obj_class,
+        where   => $query
+    });
+
+    for my $value (@$res) {
+        $client->respond($value);
+    }
+
+    return undef;
+
+}
+
+sub generate_methods {
+    try {
+        for my $class_node ( $xpc->findnodes( '//idl:class[@oils_persist:field_safe="true"]', $idl->documentElement ) ) {
+            my $hint = $class_node->getAttribute('id');
+            my $fm = $class_node->getAttributeNS('http://open-ils.org/spec/opensrf/IDL/objects/v1','fieldmapper');
+            $log->debug("Fielder class_node $hint");
+        
+            __PACKAGE__->register_method(
+                method          => 'fielder_fetch',
+                api_name        => 'open-ils.fielder.' . $hint,
+                class_hint      => $hint,
+                class_name      => "Fieldmapper::$fm",
+                stream          => 1,
+                argc            => 1
+            );
+        }
+    } catch Error with {
+        my $e = shift;
+        $log->error("error generating Fielder methods: $e");
+    };
+}
+
+
+1;
+
diff --git a/Open-ILS/src/perlmods/OpenILS/Application/PermaCrud.pm b/Open-ILS/src/perlmods/OpenILS/Application/PermaCrud.pm
new file mode 100644 (file)
index 0000000..5011d9e
--- /dev/null
@@ -0,0 +1,272 @@
+# vim:et:ts=4:sw=4:
+
+package OpenILS::Application::PermaCrud;
+use OpenILS::Application;
+use base qw/OpenILS::Application/;
+
+use Unicode::Normalize;
+use OpenSRF::EX qw/:try/;
+
+use OpenSRF::AppSession;
+use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::Logger qw/:level/;
+
+use OpenILS::Utils::Fieldmapper;
+use OpenSRF::Utils::JSON;
+
+use OpenILS::Utils::CStoreEditor qw/:funcs/;
+
+use XML::LibXML;
+use XML::LibXML::XPathContext;
+use XML::LibXSLT;
+
+our %namespace_map = (
+    oils_persist=> {ns => 'http://open-ils.org/spec/opensrf/IDL/persistence/v1'},
+    oils_obj    => {ns => 'http://open-ils.org/spec/opensrf/IDL/objects/v1'},
+    idl         => {ns => 'http://opensrf.org/spec/IDL/base/v1'},
+    reporter    => {ns => 'http://open-ils.org/spec/opensrf/IDL/reporter/v1'},
+    perm        => {ns => 'http://open-ils.org/spec/opensrf/IDL/permacrud/v1'},
+);
+
+
+my $log = 'OpenSRF::Utils::Logger';
+
+my $parser = XML::LibXML->new();
+my $xslt = XML::LibXSLT->new();
+
+my $xpc = XML::LibXML::XPathContext->new();
+$xpc->registerNs($_, $namespace_map{$_}{ns}) for ( keys %namespace_map );
+
+my $idl;
+
+sub initialize {
+
+    my $conf = OpenSRF::Utils::SettingsClient->new;
+    my $idl_file = $conf->config_value( 'IDL' );
+
+    $idl = $parser->parse_file( $idl_file );
+
+    $log->debug( 'IDL XML file loaded' );
+
+    generate_methods();
+
+}
+sub child_init {}
+
+sub CRUD_action_object_permcheck {
+    my $self = shift;
+    my $client = shift;
+    my $auth = shift;
+    my $obj = shift;
+
+    my $e = shift || new_editor(authtoken => $auth, xact => 1);
+    return $e->event unless $e->checkauth;
+
+    if (ref($obj) && $obj->json_hint ne $self->{class_hint}) {
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Class missmatch: $self->{class_hint} method called with " . $obj->json_hint,
+        );
+    }
+
+    my $class_node;
+    try {
+        ($class_node) = $xpc->findnodes( "//idl:class[\@id='$self->{class_hint}']", $idl->documentElement );
+    } catch Error with {
+        my $error = shift;
+        $log->error("Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]");
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]"
+        );
+    };
+
+    if (!$class_node) {
+        $log->error("Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]");
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]"
+        );
+    }
+
+    my $action_node;
+    try {
+        ($action_node) = $xpc->findnodes( "perm:permacrud/perm:actions/perm:$self->{action}", $class_node );
+    } catch Error with {
+        my $error = shift;
+        $log->error("Error finding action node: $error [perm:permacrud/perm:actions/perm:$self->{action}]");
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Error finding action node: $error [perm:permacrud/perm:actions/perm:$self->{action}]"
+        );
+    };
+
+    if (!$action_node) {
+        $log->error("Error finding action node: $error [perm:permacrud/perm:actions/perm:$self->{action}]");
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Error finding action node: $error [perm:permacrud/perm:actions/perm:$self->{action}]"
+        );
+    }
+
+    my $all_perms = $action_node->getAttribute( 'all_perms' );
+
+    my $fm_class = $xpc->findvalue( '@oils_obj:fieldmapper', $class_node );
+    if (!ref($obj)) {
+        my $retrieve_method = 'retrieve_' . $fm_class;
+        $retrieve_method =~ s/::/_/go;
+        $obj = $e->$retrieve_method( $obj );
+    }
+
+    (my $o_type = $fm_class) =~ s/::/./go;
+
+    my $perm_field_value = $action_node->getAttribute('permission');
+
+    if ($perm_field_value) {
+        my @perms = split '\|', $perm_field_value;
+
+        my @context_ous;
+        if ($action_node->getAttribute('global_required')) {
+            push @context_ous, $e->search_actor_org_unit( { parent_ou => undef } )->[0]->id;
+
+        } else {
+            my $context_field_value = $action_node->getAttribute('context_field');
+
+            if ($context_field_value) {
+                push @context_ous, $obj->$_ for ( split '\|', $context_field_value );
+            } else {  
+                for my $context_node ( $xpc->findnodes( "perm:context", $action_node ) ) {
+                    my $context_field = $context_node->getAttribute('field');
+                    my $link_field = $context_node->getAttribute('link');
+
+                    if ($link_field) {
+
+                        my ($link_node) = $xpc->findnodes( "idl:links/idl:link[\@field='$link_field']", $class_node );
+                        my $link_class_hint = $link_node->getAttribute('class');
+                        my $remote_field = $link_node->getAttribute('key');
+
+                        my ($remote_class_node) = $xpc->findnodes( "//idl:class[\@id='$link_class_hint']", $idl->documentElement );
+                        my $search_method = 'search_' . $xpc->findvalue( '@oils_obj:fieldmapper', $remote_class_node );
+                        $search_method =~ s/::/_/go;
+
+                        for my $remote_object ( @{$e->$search_method( { $remote_field => $obj->$link_field } )} ) {
+                            push @context_ous, $remote_object->$context_field;
+                        }
+                    } else {
+                        push @context_ous, $obj->$_ for ( split '\|', $context_field );
+                    }
+                }
+            }
+        }
+
+        my $pok = 0;
+        for my $perm (@perms) {
+            if (@context_ous) {
+                for my $c_ou (@context_ous) {
+                    if ($e->allowed($perm => $c_ou => $obj)) {
+                        $pok++;
+                        last;
+                    }
+                }
+            } else {
+                $pok++ if ($e->allowed($perm => undef => $obj));
+            }
+        }
+
+        if ((lc($all_perms) eq 'true' && @perms != $pok) or !$pok) {
+            throw OpenSRF::DomainObject::oilsException->new(
+                statusCode => 403,
+                status => "Perm failure -- action: $self->{action}, object type: $self->{json_hint}",
+            );
+        }
+    }
+
+    return $obj if ($self->{action} eq 'retrieve');
+
+    my $val = $e->session->request("open-ils.cstore.direct.$o_type.$self->{action}" => $obj )->gather(1);
+    $e->commit;
+
+    return $val;
+}
+
+sub search_permacrud {
+    my $self = shift;
+    my $client = shift;
+    my $auth = shift;
+    my @args = @_;
+
+    if (@args > 1) {
+        delete $args[1]{flesh};
+        delete $args[1]{flesh_fields};
+    }
+
+    my $e = new_editor(authtoken => $auth, xact => 1);
+    return $e->event unless $e->checkauth;
+    my $class_node;
+    try {
+        ($class_node) = $xpc->findnodes( "//idl:class[\@id='$self->{class_hint}']", $idl->documentElement );
+    } catch Error with {
+        my $error = shift;
+        $log->error("Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]");
+        throw OpenSRF::DomainObject::oilsException->new(
+            statusCode => 500,
+            status => "Error finding class node: $error [//idl:class[\@id='$self->{class_hint}']]"
+        );
+    };
+
+    my $search_method = 'search_' . $xpc->findvalue( '@oils_obj:fieldmapper', $class_node );
+    $search_method =~ s/::/_/go;
+
+    $log->debug("Calling CStoreEditor search method: $search_method");
+
+    my $obj_list = $e->$search_method( \@args );
+
+    my $retriever = $self->method_lookup( $self->{retriever} );
+    for my $o ( @$obj_list ) {
+        try {
+            ($o) = $retriever->run( $auth, $o, $e );
+            $client->respond( $o ) if ($o);
+        };
+    }
+
+    return undef;
+}
+
+sub generate_methods {
+    try {
+        for my $class_node ( $xpc->findnodes( '//idl:class[perm:permacrud]', $idl->documentElement ) ) {
+            my $hint = $class_node->getAttribute('id');
+            $log->debug("permacrud class_node $hint");
+        
+            for my $action_node ( $xpc->findnodes( "perm:permacrud/perm:actions/perm:*", $class_node ) ) {
+                (my $method = $action_node->localname) =~ s/^.+:(.+)$/$1/o;
+                $log->internal("permacrud method = $method");
+        
+                __PACKAGE__->register_method(
+                    method          => 'CRUD_action_object_permcheck',
+                    api_name        => 'open-ils.permacrud.' . $method . '.' . $hint,
+                    class_hint      => $hint,
+                    action          => $method,
+                );
+        
+                if ($method eq 'retrieve') {
+                    __PACKAGE__->register_method(
+                        method          => 'search_permacrud',
+                        api_name        => 'open-ils.permacrud.search.' . $hint,
+                        class_hint      => $hint,
+                        retriever       => 'open-ils.permacrud.retrieve.' . $hint,
+                        stream          => 1
+                    );
+                }
+            }
+        }
+    } catch Error with {
+        my $e = shift;
+        $log->error("error generating permacrud methods: $e");
+    };
+}
+
+
+1;
+
index 1e27f87..0538dea 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Search::AddedContent;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 sub initialize { return 1; }
index 94b5fe7..fa5eac4 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Search::Authority;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 use OpenILS::Utils::Fieldmapper;
index 61baf74..d28f5cc 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Search::Biblio;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 
@@ -273,7 +273,7 @@ sub fleshed_by_barcode {
        my $copyid = $e->search_asset_copy(
                {barcode => $barcode, deleted => 'f'}, {idlist=>1})->[0]
                or return $e->event;
-       return $self->fleshed_copy_retrieve2($conn, $copyid);
+       return fleshed_copy_retrieve2( $self, $conn, $copyid);
 }
 
 
@@ -431,7 +431,7 @@ __PACKAGE__->register_method(
                 subclasses, specified with a "|". For example, "title|proper:gone with the wind" 
                 For more, see config.metabib_field
 
-        @param nocache @see open-ils.search.biblio.multiclass
+        @param docache @see open-ils.search.biblio.multiclass
     #
 );
 __PACKAGE__->register_method(
@@ -451,8 +451,8 @@ sub multiclass_query {
     my($self, $conn, $arghash, $query, $docache) = @_;
 
     $logger->debug("initial search query => $query");
+    my $orig_query = $query;
 
-    $query = decode_utf8($query);
     $query =~ s/\+/ /go;
     $query =~ s/'//go;
     $query =~ s/^\s+//go;
@@ -496,6 +496,10 @@ sub multiclass_query {
             $arghash->{language} = [] unless $arghash->{language};
             push(@{$arghash->{language}}, $value);
 
+        } elsif($type =~ /^sort/o) {
+            # sort and sort_dir modifiers
+            $arghash->{$type} = $value;
+
         } else {
             # append the search term to the term under construction
             $search->{$type} =  {} unless $search->{$type};
@@ -516,12 +520,21 @@ sub multiclass_query {
     # capture the original limit because the search method alters the limit internally
     my $ol = $arghash->{limit};
 
+       my $sclient = OpenSRF::Utils::SettingsClient->new;
+
     (my $method = $self->api_name) =~ s/\.query//o;
+
+    $method =~ s/multiclass/multiclass.staged/
+        if $sclient->config_value(apps => 'open-ils.search',
+            app_settings => 'use_staged_search') =~ /true/i;
+
+
        $method = $self->method_lookup($method);
     my ($data) = $method->run($arghash, $docache);
 
     $arghash->{limit} = $ol if $ol;
     $data->{compiled_search} = $arghash;
+    $data->{query} = $orig_query;
 
     $logger->info("compiled search is " . OpenSRF::Utils::JSON->perl2JSON($arghash));
 
@@ -532,7 +545,8 @@ __PACKAGE__->register_method(
        method          => 'cat_search_z_style_wrapper',
        api_name        => 'open-ils.search.biblio.zstyle',
        stream          => 1,
-);
+       signature       => q/@see open-ils.search.biblio.multiclass/);
+
 sub cat_search_z_style_wrapper {
        my $self = shift;
        my $client = shift;
@@ -561,7 +575,7 @@ sub cat_search_z_style_wrapper {
        $$searchhash{searches}{keyword}{term} .= join ' ', $$searchhash{searches}{keyword}{term}, $$args{search}{pubdate} if $$args{search}{pubdate};
        $$searchhash{searches}{keyword}{term} .= join ' ', $$searchhash{searches}{keyword}{term}, $$args{search}{item_type} if $$args{search}{item_type};
 
-    my ($list) = $self->method_lookup('open-ils.search.biblio.multiclass.staff')->run( $searchhash );
+       my $list = the_quest_for_knowledge( $self, $client, $searchhash );
 
        if ($list->{count} > 0) {
                $result->{count} = $list->{count};
@@ -714,6 +728,147 @@ sub the_quest_for_knowledge {
 }
 
 
+__PACKAGE__->register_method(
+       method          => 'staged_search',
+       api_name        => 'open-ils.search.biblio.multiclass.staged');
+__PACKAGE__->register_method(
+       method          => 'staged_search',
+       api_name        => 'open-ils.search.biblio.multiclass.staged.staff',
+       signature       => q/@see open-ils.search.biblio.multiclass.staged/);
+__PACKAGE__->register_method(
+       method          => 'staged_search',
+       api_name        => 'open-ils.search.metabib.multiclass.staged',
+       signature       => q/@see open-ils.search.biblio.multiclass.staged/);
+__PACKAGE__->register_method(
+       method          => 'staged_search',
+       api_name        => 'open-ils.search.metabib.multiclass.staged.staff',
+       signature       => q/@see open-ils.search.biblio.multiclass.staged/);
+
+my $PAGE_SIZE = 1000;
+my $SEARCH_PAGES = 25;
+sub staged_search {
+       my($self, $conn, $search_hash, $docache) = @_;
+
+    my $method = ($self->api_name =~ /metabib/) ?
+        'open-ils.storage.metabib.multiclass.staged.search_fts':
+        'open-ils.storage.biblio.multiclass.staged.search_fts';
+
+    $method .= '.staff' if $self->api_name =~ /staff$/;
+    $method .= '.atomic';
+
+    my $user_offset = $search_hash->{offset} || 0; # user-specified offset
+    my $user_limit = $search_hash->{limit} || 10;
+
+    # we're grabbing results on a per-superpage basis, which means the 
+    # limit and offset should coincide with superpage boundaries
+    $search_hash->{offset} = 0;
+    $search_hash->{limit} = $PAGE_SIZE;
+    $search_hash->{check_limit} = $PAGE_SIZE; # force a well-known check_limit
+
+    # pull any existing results from the cache
+    my $key = search_cache_key($method, $search_hash);
+    my $cache_data = $cache->get_cache($key) || {};
+
+    # keep retrieving results until we find enough to 
+    # fulfill the user-specified limit and offset
+    my $all_results = [];
+    my $page; # current superpage
+    my $est_hit_count;
+
+    for($page = 0; $page < $SEARCH_PAGES; $page++) {
+
+        my $data = $cache_data->{$page};
+        my $results;
+        my $summary;
+
+        $logger->debug("staged search: analyzing superpage $page");
+
+        if($data) {
+            # this window of results is already cached
+            $logger->debug("staged search: found cached results");
+            $summary = $data->{summary};
+            $results = $data->{results};
+
+        } else {
+            # retrieve the window of results from the database
+            $logger->debug("staged search: fetching results from the database");
+            $search_hash->{skip_check} = $page * $PAGE_SIZE;
+            my $start = time;
+            $results = $U->storagereq($method, %$search_hash);
+            $logger->info("staged search: DB call took ".(time - $start)." seconds");
+            $summary = shift(@$results);
+
+            # Create backwards-compatible result structures
+            if($self->api_name =~ /biblio/) {
+                $results = [map {[$_->{id}]} @$results];
+            } else {
+                $results = [map {[$_->{id}, $_->{rel}, $_->{record}]} @$results];
+            }
+
+            $results = [grep {defined $_->[0]} @$results];
+            cache_staged_search_page($key, $page, $summary, $results) if $docache;
+        }
+
+        # add the new set of results to the set under construction
+        push(@$all_results, @$results);
+
+        my $current_count = scalar(@$all_results);
+
+        $est_hit_count = $summary->{estimated_hit_count} || $summary->{visible}
+            if $page == 0;
+
+        $logger->debug("staged search: located $current_count, with estimated hits=".
+            $summary->{estimated_hit_count}." : visible=".$summary->{visible}.", checked=".$summary->{checked});
+
+        # we've found all the possible hits
+        last if $current_count == $summary->{visible}
+            and not defined $summary->{estimated_hit_count};
+
+        # we've found enough results to satisfy the requested limit/offset
+        last if $current_count >= ($user_limit + $user_offset);
+
+        # we've scanned all possible hits
+        last if $summary->{checked} < $PAGE_SIZE;
+    }
+
+    my @results = grep {defined $_} @$all_results[$user_offset..($user_offset + $user_limit - 1)];
+
+    return {
+        count => $est_hit_count,
+        ids => \@results
+    };
+}
+
+# creates a unique token to represent the query in the cache
+sub search_cache_key {
+    my $method = shift;
+    my $search_hash = shift;
+       my @sorted;
+    for my $key (sort keys %$search_hash) {
+           push(@sorted, ($key => $$search_hash{$key})) 
+            unless $key eq 'limit' or 
+                $key eq 'offset' or 
+                $key eq 'skip_check';
+    }
+       my $s = OpenSRF::Utils::JSON->perl2JSON(\@sorted);
+       return $pfx . md5_hex($method . $s);
+}
+
+sub cache_staged_search_page {
+    # puts this set of results into the cache
+    my($key, $page, $summary, $results) = @_;
+    my $data = $cache->get_cache($key);
+    $data ||= {};
+    $data->{$page} = {
+        summary => $summary,
+        results => $results
+    };
+
+    $logger->info("staged search: cached with key=$key, superpage=$page, estimated=".
+        $summary->{estimated_hit_count}.", visible=".$summary->{visible});
+
+    $cache->put_cache($key, $data);
+}
 
 sub search_cache {
 
@@ -735,7 +890,6 @@ sub search_cache {
 
        return undef unless $offset < $count;
 
-
        my @result;
        for( my $i = $offset; $i <= $end; $i++ ) {
                last unless my $d = $$data[$i];
@@ -803,8 +957,8 @@ sub biblio_mrid_to_modsbatch {
        my ($mr, $evt) = _grab_metarecord($mrid);
        return $evt unless $mr;
 
-       my $mvr = $self->biblio_mrid_check_mvr($client, $mr);
-       $mvr = $self->biblio_mrid_make_modsbatch( $client, $mr ) unless $mvr;
+       my $mvr = biblio_mrid_check_mvr($self, $client, $mr);
+       $mvr = biblio_mrid_make_modsbatch( $self, $client, $mr ) unless $mvr;
 
        return $mvr unless ref($args);  
 
@@ -1389,6 +1543,9 @@ __PACKAGE__->register_method (
        api_name => 'open-ils.search.biblio.item_type_map.retrieve.all');
 __PACKAGE__->register_method (
        method => 'bib_extras',
+       api_name => 'open-ils.search.biblio.bib_level_map.retrieve.all');
+__PACKAGE__->register_method (
+       method => 'bib_extras',
        api_name => 'open-ils.search.biblio.audience_map.retrieve.all');
 
 sub bib_extras {
@@ -1405,6 +1562,9 @@ sub bib_extras {
        return $e->retrieve_all_config_item_type_map()
                if( $self->api_name =~ /item_type_map/ );
 
+       return $e->retrieve_all_config_bib_level_map()
+               if( $self->api_name =~ /bib_level_map/ );
+
        return $e->retrieve_all_config_audience_map()
                if( $self->api_name =~ /audience_map/ );
 
index 0f2beb4..fd901f7 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Search::CNBrowse;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 use OpenSRF::EX qw(:try);
index 520ed6a..9d84c18 100755 (executable)
@@ -1,6 +1,6 @@
 package OpenILS::Application::Search::Z3950;
 use strict; use warnings;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 
 use OpenILS::Utils::ZClient;
 use MARC::Record;
@@ -15,10 +15,9 @@ use OpenILS::Utils::ModsParser;
 use OpenSRF::Utils::SettingsClient;
 use OpenILS::Application::AppUtils;
 use OpenSRF::Utils::Logger qw/$logger/;
-use OpenILS::Utils::CStoreEditor q/:funcs/;
+use OpenILS::Utils::Editor q/:funcs/;
 
 my $output     = "USMARC"; 
-my $U = 'OpenILS::Application::AppUtils';
 
 my $sclient;
 my %services;
@@ -85,35 +84,7 @@ sub query_services {
        my $e = new_editor(authtoken=>$auth);
        return $e->event unless $e->checkauth;
        return $e->event unless $e->allowed('REMOTE_Z3950_QUERY');
-
-    my $sources = $e->search_config_z3950_source(
-        [ { name => { '!=' => undef } },
-        { flesh => 1, flesh_fields => { czs => ['attrs'] } }] 
-    );
-
-       my %hash = ();
-       for my $s ( @$sources ) {
-               $hash{ $s->name } = {
-                       name => $s->name,
-                       label => $s->label,
-                       host => $s->host,
-                       port => $s->port,
-                       db => $s->db,
-                       auth => $s->auth,
-               };
-
-               for my $a ( @{ $s->attrs } ) {
-                       $hash{ $a->source }{attrs}{ $a->name } = {
-                               name => $a->name,
-                               label => $a->label,
-                               code => $a->code,
-                               format => $a->format,
-                               source => $a->source,
-                       };
-               }
-       }
-       
-       return \%hash;
+       return $sclient->config_value('z3950', 'services');
 }
 
 
@@ -149,9 +120,7 @@ sub do_class_search {
 
        my @connections;
        my @results;
-       my @services;
        for (my $i = 0; $i < @{$$args{service}}; $i++) {
-                       
                my %tmp_args = %$args;
                $tmp_args{service} = $$args{service}[$i];
                $tmp_args{username} = $$args{username}[$i];
@@ -159,46 +128,30 @@ sub do_class_search {
 
                $logger->debug("z3950: service: $tmp_args{service}, async: $tmp_args{async}");
 
-               if ($tmp_args{service} eq 'native-evergreen-catalog') {
-                       my $method = $self->method_lookup('open-ils.search.biblio.zstyle');
-                       $conn->respond(
-                               $self->method_lookup(
-                                       'open-ils.search.biblio.zstyle'
-                               )->run($auth, \%tmp_args)
-                       );
-               } else {
+               $tmp_args{query} = compile_query('and', $tmp_args{service}, $tmp_args{search});
 
-                   $tmp_args{query} = compile_query('and', $tmp_args{service}, $tmp_args{search});
+               my $res = do_service_search( $self, $conn, $auth, \%tmp_args );
 
-                   my $res = $self->do_service_search( $conn, $auth, \%tmp_args );
+               push @results, $res->{result};
+               push @connections, $res->{connection};
 
-            if ($U->event_code($res)) {
-                $conn->respond($res) if $U->event_code($res);
-            } else {
-
-                push @services, $tmp_args{service};
-                   push @results, $res->{result};
-                       push @connections, $res->{connection};
-            }
-        }
+               $logger->debug("z3950: Result object: $results[$i], Connection object: $connections[$i]");
        }
 
        $logger->debug("z3950: Connections created");
 
-    return undef unless (@connections);
+       my @records;
        while ((my $index = OpenILS::Utils::ZClient::event( \@connections )) != 0) {
                my $ev = $connections[$index - 1]->last_event();
                $logger->debug("z3950: Received event $ev");
                if ($ev == OpenILS::Utils::ZClient::EVENT_END()) {
-                       my $munged = process_results( $results[$index - 1], $$args{limit}, $$args{offset} );
-                       $$munged{service} = $services[$index - 1];
+                       my $munged = process_results( $results[$index - 1], $$args{limit}, $$args{offset}, $$args{service}[$index -1] );
+                       $$munged{service} = $$args{service}[$index - 1];
                        $conn->respond($munged);
                }
        }
 
        $logger->debug("z3950: Search Complete");
-
-    return undef;
 }
 
 
@@ -214,11 +167,11 @@ sub do_service_search {
        
        my $info = $services{$$args{service}};
 
-       $$args{host}    = $$info{host},
-       $$args{port}    = $$info{port},
-       $$args{db}              = $$info{db},
+       $$args{host}    = $$info{host};
+       $$args{port}    = $$info{port};
+       $$args{db}              = $$info{db};
 
-       return $self->do_search( $conn, $auth, $args );
+       return do_search( $self, $conn, $auth, $args );
 }
 
 
@@ -285,7 +238,7 @@ sub do_search {
 
        return {result => $results, connection => $connection} if ($async);
 
-       my $munged = process_results($results, $limit, $offset);
+       my $munged = process_results($results, $limit, $offset, $$args{service});
        $munged->{query} = $query;
 
        return $munged;
@@ -300,8 +253,11 @@ sub process_results {
        my $results     = shift;
        my $limit       = shift || 10;
        my $offset      = shift || 0;
+    my $service = shift;
 
-       $results->option(elementSetName => "FI"); # full records with no holdings
+    my $rformat = $services{$service}->{record_format} || 'FI';
+       $results->option(elementSetName => $rformat);
+    $logger->info("z3950: using record format '$rformat'");
 
        my @records;
        my $res = {};
index f4f2c8e..ff13362 100644 (file)
@@ -1,5 +1,5 @@
 package OpenILS::Application::Search::Zips;
-use base qw/OpenSRF::Application/;
+use base qw/OpenILS::Application/;
 use strict; use warnings;
 
 use OpenSRF::EX qw(:try);
index c20edf2..6dd03c0 100644 (file)
@@ -4,6 +4,71 @@ my $log = 'OpenSRF::Utils::Logger';
 #-------------------------------------------------------------------------------
 package OpenILS::Application::Storage::FTS;
 use OpenSRF::Utils::Logger qw/:level/;
+use Parse::RecDescent;
+use Unicode::Normalize;
+
+my $_default_grammar_parser = new Parse::RecDescent ( <<'GRAMMAR' );
+
+<autotree>
+
+search_expression: or_expr(s) | and_expr(s) | expr(s)
+or_expr: lexpr '||' rexpr
+and_expr: lexpr '&&' rexpr
+lexpr: expr
+rexpr: expr
+expr: phrase(s) | group(s) | word(s)
+joiner: '||' | '&&'
+phrase: '"' token(s) '"'
+group : '(' search_expression ')'
+word: numeric_range | negative_token | token
+negative_token: '-' .../\D+/ token
+token: /[-\w]+/
+numeric_range: /\d+-\d*/
+
+GRAMMAR
+
+sub naco_normalize {
+
+    my $txt = lc(shift);
+    my $sf = shift;
+
+    $txt = NFD($txt);
+    $txt =~ s/\pM+//go; # Remove diacritics
+
+    $txt =~ s/\xE6/AE/go;   # Convert ae digraph
+    $txt =~ s/\x{153}/OE/go;# Convert oe digraph
+    $txt =~ s/\xFE/TH/go;   # Convert Icelandic thorn
+
+    $txt =~ tr/\x{2070}\x{2071}\x{2072}\x{2073}\x{2074}\x{2075}\x{2076}\x{2077}\x{2078}\x{2079}\x{207A}\x{207B}/0123456789+-/;# Convert superscript numbers
+    $txt =~ tr/\x{2080}\x{2081}\x{2082}\x{2083}\x{2084}\x{2085}\x{2086}\x{2087}\x{2088}\x{2089}\x{208A}\x{208B}/0123456889+-/;# Convert subscript numbers
+
+    $txt =~ tr/\x{0251}\x{03B1}\x{03B2}\x{0262}\x{03B3}/AABGG/;     # Convert Latin and Greek
+    $txt =~ tr/\x{2113}\xF0\!\"\(\)\-\{\}\<\>\;\:\.\?\xA1\xBF\/\\\@\*\%\=\xB1\+\xAE\xA9\x{2117}\$\xA3\x{FFE1}\xB0\^\_\~\`/LD /; # Convert Misc
+    $txt =~ tr/\'\[\]\|//d;                         # Remove Misc
+
+    if ($sf && $sf =~ /^a/o) {
+        my $commapos = index($txt,',');
+        if ($commapos > -1) {
+            if ($commapos != length($txt) - 1) {
+                my @list = split /,/, $txt;
+                my $first = shift @list;
+                $txt = $first . ',' . join(' ', @list);
+            } else {
+                $txt =~ s/,/ /go;
+            }
+        }
+    } else {
+        $txt =~ s/,/ /go;
+    }
+
+    $txt =~ s/\s+/ /go; # Compress multiple spaces
+    $txt =~ s/^\s+//o;  # Remove leading space
+    $txt =~ s/\s+$//o;  # Remove trailing space
+
+    return $txt;
+}
+
+#' stupid vim syntax highlighting ...
 
 sub compile {
 
@@ -32,6 +97,7 @@ sub compile {
 sub decompose {
        my $self = shift;
        my $term = shift;
+       my $parser = shift || $_default_grammar_parser;
 
        $term =~ s/:/ /go;
        $term =~ s/\s+--\s+/ /go;
@@ -44,6 +110,7 @@ sub decompose {
 
        $log->debug("Stripped search term string is [$term]",DEBUG);
 
+       my $parsetree = $parser->search_expression( $term );
        my @words = $term =~ /\b((?<!!)\w+)\b/go;
        my @nots = $term =~ /\b(?<=!)(\w+)\b/go;
 
@@ -62,6 +129,7 @@ sub decompose {
        $self->{ fts_op } = 'ILIKE';
        $self->{ fts_col } = $self->{ text_col } = 'value';
        $self->{ raw } = $term;
+       $self->{ parsetree } = $parsetree;
        $self->{ words } = \@words;
        $self->{ nots } = \@nots;
        $self->{ phrases } = \@parts;
@@ -89,6 +157,11 @@ sub raw {
        return $self->{raw};
 }
 
+sub parse_tree {
+       my $self = shift;
+       return $self->{parsetree};
+}
+
 sub fts_col {
        my $self = shift;
        return $self->{fts_col};
@@ -215,3 +288,4 @@ package Class::DBI;
 }
 
 1;
+
index 65e0eeb..cb6b06a 100644 (file)
@@ -818,7 +818,7 @@ sub new_hold_copy_targeter {
                        $log->info("Processing hold ".$hold->id."...\n");
 
                        #first, re-fetch the hold, to make sure it's not captured already
-            $hold->remove_from_object_index();
+                       $hold->remove_from_object_index();
                        $hold = action::hold_request->retrieve( $hold->id );
                        die "OK\n" if (!$hold or $hold->capture_time);
 
@@ -838,7 +838,11 @@ sub new_hold_copy_targeter {
                                                {$_->record}
                                                metabib::record_descriptor
                                                        ->search(
-                                                               record => [ map { $_->id } metabib::metarecord->retrieve($hold->target)->source_records ],
+                                                               record => [
+                                                                       map {
+                                                                               isTrue($_->deleted) ?  () : ($_->id)
+                                                                       } metabib::metarecord->retrieve($hold->target)->source_records
+                                                               ],
                                                                ( $types   ? (item_type => [split '', $types])   : () ),
                                                                ( $formats ? (item_form => [split '', $formats]) : () ),
                                                                ( $lang    ? (item_lang => $lang)                : () ),
@@ -947,11 +951,7 @@ sub new_hold_copy_targeter {
        
                        if (!scalar(@good_copies)) {
                                $log->info("\tNo (non-current) copies eligible to fill the hold.");
-                               if (
-                                 $old_best &&
-                                 grep { $old_best eq $_ } @$all_copies &&
-                                 !action::hold_request->search_where({ current_copy => $old_best->id, capture_time => undef, cancel_time => undef })
-                               ) {
+                               if ( $old_best && grep { ''.$old_best->id eq ''.$_->id } @$all_copies ) {
                                        # the old copy is still available
                                        $log->debug("\tPushing current_copy back onto the targeting list");
                                        push @good_copies, $old_best;
index b73dcad..cb5a66c 100644 (file)
@@ -23,7 +23,12 @@ sub record_copy_count {
        my $out_table = actor::org_unit_type->table;
 
        my $descendants = "actor.org_unit_descendants(u.id)";
-       my $ancestors = "actor.org_unit_ancestors(?)";
+       my $ancestors = "actor.org_unit_ancestors(?) u JOIN $out_table t ON (u.ou_type = t.id)";
+
+    if ($args{org_unit} < 0) {
+        $args{org_unit} *= -1;
+           $ancestors = "(select org_unit as id from actor.org_lasso_map where lasso = ?) u CROSS JOIN (SELECT -1 AS depth) t";
+    }
 
        my $visible = 'AND a.opac_visible = TRUE AND st.holdable = TRUE AND loc.opac_visible = TRUE AND cp.opac_visible = TRUE';
        if ($self->api_name =~ /staff/o) {
@@ -79,8 +84,7 @@ sub record_copy_count {
                                         AND src.transcendant IS TRUE
                                 )
                         ) AS transcendant
-                 FROM  $ancestors u
-                       JOIN $out_table t ON (u.ou_type = t.id)
+                 FROM  $ancestors
                  GROUP BY 1,2
        SQL
 
index 2b54ac4..21bff43 100644 (file)
@@ -6,6 +6,7 @@ use OpenILS::Application::Storage::FTS;
 use OpenILS::Utils::Fieldmapper;
 use OpenSRF::Utils::Logger qw/:level/;
 use OpenSRF::Utils::Cache;
+use OpenSRF::Utils::JSON;
 use Data::Dumper;
 use Digest::MD5 qw/md5_hex/;
 
@@ -22,12 +23,13 @@ sub ordered_records_from_metarecord {
        my $org = shift || 1;
        my $depth = shift;
 
-       my (@types,@forms);
+       my (@types,@forms,@blvl);
 
        if ($formats) {
-               my ($t, $f) = split '-', $formats;
+               my ($t, $f, $b) = split '-', $formats;
                @types = split '', $t;
                @forms = split '', $f;
+               @blvl = split '', $b;
        }
 
        my $descendants =
@@ -139,6 +141,10 @@ sub ordered_records_from_metarecord {
                $sql .= '                               AND rd.item_form IN ('.join(',',map{'?'}@forms).')';
        }
 
+       if (@blvl) {
+               $sql .= '                               AND rd.bib_level IN ('.join(',',map{'?'}@blvl).')';
+       }
+
 
 
        $sql .= <<"     SQL";
@@ -176,7 +182,7 @@ sub ordered_records_from_metarecord {
                quality DESC
        SQL
 
-       my $ids = metabib::metarecord_source_map->db_Main->selectcol_arrayref($sql, {}, "$mr", @types, @forms);
+       my $ids = metabib::metarecord_source_map->db_Main->selectcol_arrayref($sql, {}, "$mr", @types, @forms, @blvl);
        return $ids if ($self->api_name =~ /atomic$/o);
 
        $client->respond( $_ ) for ( @$ids );
@@ -264,19 +270,27 @@ sub metarecord_copy_count {
        my $cl_table = asset::copy_location->table;
        my $cs_table = config::copy_status->table;
        my $out_table = actor::org_unit_type->table;
+
        my $descendants = "actor.org_unit_descendants(u.id)";
-       my $ancestors = "actor.org_unit_ancestors(?)";
+       my $ancestors = "actor.org_unit_ancestors(?) u JOIN $out_table t ON (u.ou_type = t.id)";
+
+    if ($args{org_unit} < 0) {
+        $args{org_unit} *= -1;
+        $ancestors = "(select org_unit as id from actor.org_lasso_map where lasso = ?) u CROSS JOIN (SELECT -1 AS depth) t";
+    }
 
        my $copies_visible = 'AND a.opac_visible IS TRUE AND cp.opac_visible IS TRUE AND cs.holdable IS TRUE AND cl.opac_visible IS TRUE';
        $copies_visible = '' if ($self->api_name =~ /staff/o);
 
-       my (@types,@forms);
-       my ($t_filter, $f_filter) = ('','');
+       my (@types,@forms,@blvl);
+       my ($t_filter, $f_filter, $b_filter) = ('','','');
 
        if ($args{format}) {
-               my ($t, $f) = split '-', $args{format};
+               my ($t, $f, $b) = split '-', $args{format};
                @types = split '', $t;
                @forms = split '', $f;
+               @blvl = split '', $b;
+
                if (@types) {
                        $t_filter = ' AND rd.item_type IN ('.join(',',map{'?'}@types).')';
                }
@@ -284,6 +298,10 @@ sub metarecord_copy_count {
                if (@forms) {
                        $f_filter .= ' AND rd.item_form IN ('.join(',',map{'?'}@forms).')';
                }
+
+               if (@blvl) {
+                       $b_filter .= ' AND rd.bib_level IN ('.join(',',map{'?'}@blvl).')';
+               }
        }
 
        my $sql = <<"   SQL";
@@ -304,6 +322,7 @@ sub metarecord_copy_count {
                                        $copies_visible
                                        $t_filter
                                        $f_filter
+                                       $b_filter
                                )
                        ) AS count,
                        sum(
@@ -322,6 +341,7 @@ sub metarecord_copy_count {
                                        $copies_visible
                                        $t_filter
                                        $f_filter
+                                       $b_filter
                                )
                        ) AS available,
                        sum(
@@ -340,6 +360,7 @@ sub metarecord_copy_count {
                                        AND cl.opac_visible IS TRUE
                                        $t_filter
                                        $f_filter
+                                       $b_filter
                                )
                        ) AS unshadow,
                        sum(    
@@ -352,8 +373,7 @@ sub metarecord_copy_count {
                                )
                        ) AS transcendant
 
-                 FROM  $ancestors u
-                       JOIN $out_table t ON (u.ou_type = t.id)
+                 FROM  $ancestors
                  GROUP BY 1,2
        SQL
 
@@ -361,12 +381,15 @@ sub metarecord_copy_count {
        $sth->execute(  ''.$args{metarecord},
                        @types, 
                        @forms,
+                       @blvl,
                        ''.$args{metarecord},
                        @types, 
                        @forms,
+                       @blvl,
                        ''.$args{metarecord},
                        @types, 
                        @forms,
+                       @blvl,
                        ''.$args{metarecord},
                        ''.$args{org_unit}, 
        ); 
@@ -1915,10 +1938,6 @@ sub biblio_search_multi_class_fts {
                $ou = actor::org_unit->search( { parent_ou => undef } )->next->id;
        }
 
-       if (!defined($args{org_unit})) {
-               die "No target organizational unit passed to ".$self->api_name;
-       }
-
        if (! scalar( keys %{$args{searches}} )) {
                die "No search arguments were passed to ".$self->api_name;
        }
@@ -2309,6 +2328,235 @@ __PACKAGE__->register_method(
        cachable        => 1,
 );
 
+# XXX factored most of the PG dependant stuff out of here... need to find a way to do "dependants".
+sub staged_fts {
+       my $self = shift;
+       my $client = shift;
+       my %args = @_;
+       
+       my $ou = $args{org_unit};
+       my $limit = $args{limit} || 10;
+       my $offset = $args{offset} || 0;
+
+       if (!$ou) {
+               $ou = actor::org_unit->search( { parent_ou => undef } )->next->id;
+       }
+
+       if (! scalar( keys %{$args{searches}} )) {
+               die "No search arguments were passed to ".$self->api_name;
+       }
+
+       my (@statuses,@types,@forms,@lang,@aud,@lit_form,@vformats,@bib_level);
+
+       if ($args{available}) {
+               @statuses = (0,7);
+       }
+
+       if (my $s = $args{statuses}) {
+               $s = [$s] if (!ref($s));
+               @statuses = @$s;
+       }
+
+       if (my $a = $args{audience}) {
+               $a = [$a] if (!ref($a));
+               @aud = @$a;
+       }
+
+       if (my $l = $args{language}) {
+               $l = [$l] if (!ref($l));
+               @lang = @$l;
+       }
+
+       if (my $f = $args{lit_form}) {
+               $f = [$f] if (!ref($f));
+               @lit_form = @$f;
+       }
+
+       if (my $f = $args{item_form}) {
+               $f = [$f] if (!ref($f));
+               @forms = @$f;
+       }
+
+       if (my $t = $args{item_type}) {
+               $t = [$t] if (!ref($t));
+               @types = @$t;
+       }
+
+       if (my $b = $args{bib_level}) {
+               $b = [$b] if (!ref($b));
+               @bib_level = @$b;
+       }
+
+       if (my $v = $args{vr_format}) {
+               $v = [$v] if (!ref($v));
+               @vformats = @$v;
+       }
+
+       # XXX legacy format and item type support
+       if ($args{format}) {
+               my ($t, $f) = split '-', $args{format};
+               @types = split '', $t;
+               @forms = split '', $f;
+       }
+
+    my %stored_proc_search_args;
+       for my $search_group (sort keys %{$args{searches}}) {
+               (my $search_group_name = $search_group) =~ s/\|/_/gso;
+               my ($search_class,$search_field) = split /\|/, $search_group;
+               $log->debug("Searching class [$search_class] and field [$search_field]",DEBUG);
+
+               if ($search_field) {
+                       unless ( config::metabib_field->search( field_class => $search_class, name => $search_field )->next ) {
+                               $log->warn("Requested class [$search_class] or field [$search_field] does not exist!");
+                               return undef;
+                       }
+               }
+
+               my $class = $_cdbi->{$search_class};
+               my $search_table = $class->table;
+
+               my ($index_col) = $class->columns('FTS');
+               $index_col ||= 'value';
+
+               
+               my $fts = OpenILS::Application::Storage::FTS->compile(
+            $search_class => $args{searches}{$search_group}{term},
+            $search_group_name.'.value',
+            "$search_group_name.$index_col"
+        );
+               $fts->sql_where_clause; # this builds the ranks for us
+
+               my @fts_ranks = $fts->fts_rank;
+               my @fts_queries = $fts->fts_query;
+               my @phrases = map { lc($_) } $fts->phrases;
+               my @words = map { lc($_) } $fts->words;
+
+        $stored_proc_search_args{$search_group} = {
+            fts_rank    => \@fts_ranks,
+            fts_query   => \@fts_queries,
+            phrase      => \@phrases,
+            word        => \@words,
+        };
+
+       }
+
+       my $param_search_ou = $ou;
+       my $param_depth = $args{depth}; $param_depth = 'NULL' unless (defined($param_depth) and length($param_depth) > 0 );
+    my $param_searches = OpenSRF::Utils::JSON->perl2JSON( \%stored_proc_search_args ); $param_searches =~ s/\$//go; $param_searches = '$$'.$param_searches.'$$';
+    my $param_statuses = '$${' . join(',', map { s/\$//go; $_ } @statuses) . '}$$';
+    my $param_audience = '$${' . join(',', map { s/\$//go; $_ } @aud) . '}$$';
+    my $param_language = '$${' . join(',', map { s/\$//go; $_ } @lang) . '}$$';
+    my $param_lit_form = '$${' . join(',', map { s/\$//go; $_ } @lit_form) . '}$$';
+    my $param_types = '$${' . join(',', map { s/\$//go; $_ } @types) . '}$$';
+    my $param_forms = '$${' . join(',', map { s/\$//go; $_ } @forms) . '}$$';
+    my $param_vformats = '$${' . join(',', map { s/\$//go; $_ } @vformats) . '}$$';
+    my $param_bib_level = '$${' . join(',', map { s/\$//go; $_ } @bib_level) . '}$$';
+       my $param_pref_lang = $args{preferred_language}; $param_pref_lang =~ s/\$//go; $param_pref_lang = '$$'.$param_pref_lang.'$$';
+       my $param_pref_lang_multiplier = $args{preferred_language_weight}; $param_pref_lang_multiplier ||= 'NULL';
+       my $param_sort = $args{'sort'}; $param_sort =~ s/\$//go; $param_sort = '$$'.$param_sort.'$$';
+       my $param_sort_desc = defined($args{sort_dir}) && $args{sort_dir} =~ /^d/io ? "'t'" : "'f'";
+       my $metarecord = $self->api_name =~ /metabib/o ? "'t'" : "'f'";
+       my $staff = $self->api_name =~ /staff/o ? "'t'" : "'f'";
+    my $param_rel_limit = $args{core_limit}; $param_rel_limit ||= 'NULL';
+    my $param_chk_limit = $args{check_limit}; $param_chk_limit ||= 'NULL';
+    my $param_skip_chk = $args{skip_check}; $param_skip_chk ||= 'NULL';
+
+       my $sth = metabib::metarecord_source_map->db_Main->prepare(<<"    SQL");
+        SELECT  *
+          FROM  search.staged_fts(
+                    $param_search_ou,
+                    $param_depth,
+                    $param_searches,
+                    $param_statuses,
+                    $param_audience,
+                    $param_language,
+                    $param_lit_form,
+                    $param_types,
+                    $param_forms,
+                    $param_vformats,
+                    $param_bib_level,
+                    $param_pref_lang,
+                    $param_pref_lang_multiplier,
+                    $param_sort,
+                    $param_sort_desc,
+                    $metarecord,
+                    $staff,
+                    $param_rel_limit,
+                    $param_chk_limit,
+                    $param_skip_chk
+                );
+    SQL
+
+    $sth->execute;
+
+    my $recs = $sth->fetchall_arrayref({});
+    my $summary_row = pop @$recs;
+
+    my $total = $$summary_row{total};
+    my $checked = $$summary_row{checked};
+    my $visible = $$summary_row{visible};
+    my $deleted = $$summary_row{deleted};
+    my $excluded = $$summary_row{excluded};
+
+    my $estimate = $visible;
+    if ( $total > $checked && $checked ) {
+        my $deleted_ratio = $deleted / $checked;
+        my $exclution_ratio = $excluded / $checked;
+        my $delete_adjusted_total = $total - ( $total * $deleted_ratio );
+
+        $estimate = $$summary_row{estimated_hit_count} = int($delete_adjusted_total - ( $delete_adjusted_total * $exclution_ratio ));
+    }
+
+    delete $$summary_row{id};
+    delete $$summary_row{rel};
+    delete $$summary_row{record};
+
+    $client->respond( $summary_row );
+
+       $log->debug("Search yielded ".scalar(@$recs)." checked, visible results with an approximate visible total of $estimate.",DEBUG);
+
+       for my $rec (@$recs[$offset .. $offset + $limit - 1]) {
+        delete $$rec{checked};
+        delete $$rec{visible};
+        delete $$rec{excluded};
+        delete $$rec{deleted};
+        delete $$rec{total};
+        $$rec{rel} = sprintf('%0.3f',$$rec{rel});
+
+               $client->respond( $rec );
+       }
+       return undef;
+}
+__PACKAGE__->register_method(
+       api_name        => "open-ils.storage.biblio.multiclass.staged.search_fts",
+       method          => 'staged_fts',
+       api_level       => 1,
+       stream          => 1,
+       cachable        => 1,
+);
+__PACKAGE__->register_method(
+       api_name        => "open-ils.storage.biblio.multiclass.staged.search_fts.staff",
+       method          => 'staged_fts',
+       api_level       => 1,
+       stream          => 1,
+       cachable        => 1,
+);
+__PACKAGE__->register_method(
+       api_name        => "open-ils.storage.metabib.multiclass.staged.search_fts",
+       method          => 'staged_fts',
+       api_level       => 1,
+       stream          => 1,
+       cachable        => 1,
+);
+__PACKAGE__->register_method(
+       api_name        => "open-ils.storage.metabib.multiclass.staged.search_fts.staff",
+       method          => 'staged_fts',
+       api_level       => 1,
+       stream          => 1,
+       cachable        => 1,
+);
+
+
 sub xref_count {
        my $self = shift;
        my $client = shift;
index cf5f16b..7926897 100644 (file)
@@ -77,6 +77,10 @@ econst OILS_SETTING_DEF_ITEM_PRICE => 'cat.default_item_price';
 econst OILS_SETTING_ORG_BOUNCED_EMAIL => 'org.bounced_emails';
 econst OILS_SETTING_CHARGE_LOST_ON_ZERO => 'circ.charge_lost_on_zero';
 econst OILS_SETTING_VOID_OVERDUE_ON_LOST => 'circ.void_overdue_on_lost';
+econst OILS_SETTING_HOLD_SOFT_STALL => 'circ.hold_stalling.soft';
+econst OILS_SETTING_HOLD_HARD_STALL => 'circ.hold_stalling.hard';
+econst OILS_SETTING_HOLD_SOFT_BOUNDARY => 'circ.hold_boundary.soft';
+econst OILS_SETTING_HOLD_HARD_BOUNDARY => 'circ.hold_boundary.hard';
 
 
 
index c12bab9..f5307ef 100644 (file)
@@ -949,12 +949,14 @@ sub toSQL {
                $sql .= " NOT BETWEEN ". join(" AND ", map { $_->toSQL } @$val);
        } elsif (lc($op) eq 'like') {
                $val = $$val[0] if (ref($val) eq 'ARRAY');
+               $val = $val->toSQL;
                $val =~ s/^'(.*)'$/$1/o;
                $val =~ s/%/\\\\%/o;
                $val =~ s/_/\\\\_/o;
                $sql .= " LIKE '\%$val\%'";
        } elsif (lc($op) eq 'ilike') {
                $val = $$val[0] if (ref($val) eq 'ARRAY');
+               $val = $val->toSQL;
                $val =~ s/^'(.*)'$/$1/o;
                $val =~ s/%/\\\\%/o;
                $val =~ s/_/\\\\_/o;
index 8f609b2..a780b7e 100644 (file)
@@ -96,6 +96,13 @@ sub name {
                $u->second_given_name . ' ' . $u->family_name;
 }
 
+sub home_library {
+    my $self = shift;
+    my $lib = $self->{editor}->retrieve_actor_org_unit($self->{user}->home_ou)->shortname;
+       syslog('LOG_DEBUG', "OILS: Patron home library is $lib");
+    return $lib;
+}
+
 sub __addr_string {
        my $addr = shift;
        return "" unless $addr;
index d8a05dd..b625f4c 100644 (file)
@@ -52,7 +52,7 @@ sub import {
                next unless ($idl->{$c}{'oils_obj:fieldmapper'});
                my $n = 'Fieldmapper::'.$idl->{$c}{'oils_obj:fieldmapper'};
 
-               $log->debug("Building Fieldmapper clas for [$n] from IDL");
+               $log->debug("Building Fieldmapper class for [$n] from IDL");
 
                $$fieldmap{$n}{hint} = $c;
                $$fieldmap{$n}{virtual} = ($idl->{$c}{'oils_persist:virtual'} eq 'true') ? 1 : 0;
index 5f69de9..fcef298 100644 (file)
@@ -34,6 +34,7 @@ sub permit_copy_hold {
                _direct => {
                        requestLib      => $$params{request_lib},
                        pickupLib       => $$params{pickup_lib},
+            newHold    => $$params{new_hold},
                }
        };
 
index 3c38cd1..d02d4ff 100644 (file)
@@ -83,11 +83,25 @@ sub handler {
                }
        }
 
+       my $ses = OpenSRF::AppSession->create('open-ils.cstore');
+
+       # still no records ...
+       my $container = $cgi->param('containerid');
+       if ($container) {
+               my $authid = $cgi->cookie('ses') || $cgi->param('ses');
+               my $auth = verify_login($authid);
+               if (!$auth) {
+                       return 403;
+               }
+               my $recs = $ses->request( 'open-ils.cstore.direct.container.biblio_record_entry_bucket_item.search.atomic', { bucket => $container } )->gather(1);
+               @records = map { ($_->target_biblio_record_entry) } @$recs;
+       }
+
        return show_template($r) unless (@records);
 
        my $type = $cgi->param('rectype') || 'biblio';
        if ($type ne 'biblio' && $type ne 'authority') {
-               die "Bad record type: $type";
+               return 400;
        }
 
        my $tcn_v = 'tcn_value';
@@ -113,9 +127,7 @@ sub handler {
        binmode(STDOUT, ':utf8') if ($encoding eq 'UTF-8');
 
        if (!grep { uc($format) eq $_ } @formats) {
-               die     "Please select a supported format.  ".
-                       "Right now that means one of [".
-                       join('|',@formats). "]\n";
+               return 400;
        }
 
        if ($format ne 'XML') {
@@ -123,7 +135,6 @@ sub handler {
                $ftype->require;
        }
 
-       my $ses = OpenSRF::AppSession->create('open-ils.cstore');
 
        $r->headers_out->set("Content-Disposition" => "inline; filename=$filename");
 
@@ -147,7 +158,7 @@ sub handler {
                my $req = $ses->request( 'open-ils.cstore.direct.actor.org_unit.search', { id => { '!=' => undef } } );
 
                while (my $o = $req->recv) {
-                       die $req->failed->stringify if ($req->failed);
+                       next if ($req->failed);
                        $o = $o->content;
                        last unless ($o);
                        $orgs{$o->id} = $o;
@@ -157,7 +168,7 @@ sub handler {
                $req = $ses->request( 'open-ils.cstore.direct.asset.copy_location.search', { id => { '!=' => undef } } );
 
                while (my $s = $req->recv) {
-                       die $req->failed->stringify if ($req->failed);
+                       next if ($req->failed);
                        $s = $s->content;
                        last unless ($s);
                        $shelves{$s->id} = $s;
@@ -251,6 +262,8 @@ sub handler {
                                $r->print($req->as_usmarc);
                        }
 
+            $r->rflush();
+
                } otherwise {
                        my $e = shift;
                        warn "\n$e\n";
@@ -264,6 +277,23 @@ sub handler {
 
 }
 
+sub verify_login {
+        my $auth_token = shift;
+        return undef unless $auth_token;
+
+        my $user = OpenSRF::AppSession
+                ->create("open-ils.auth")
+                ->request( "open-ils.auth.session.retrieve", $auth_token )
+                ->gather(1);
+
+        if (ref($user) eq 'HASH' && $user->{ilsevent} == 1001) {
+                return undef;
+        }
+
+        return $user if ref($user);
+        return undef;
+}
+
 sub show_template {
        my $r = shift;
 
index b9ad7df..84c8f4d 100644 (file)
@@ -15,10 +15,41 @@ use OpenSRF::System;
 # set the bootstrap config and template include directory when 
 # this module is loaded
 my $bootstrap;
+my $ssl_off;
+
+my $default_template = <<HTML;
+<html>
+       <head>
+               <title>TITLE</title>
+       </head>
+       <body>
+               <br/><br/><br/>
+               <center>
+               <form method='POST'>
+                       <table style='border-collapse: collapse; border: 1px solid black;'>
+                               <tr>
+                                       <th colspan='2' align='center'><u>DESCRIPTION</u></th>
+                               </tr>
+                               <tr>
+                                       <th align="right">Username or barcode:</th>
+                                       <td><input type="text" name="user"/></td>
+                               </tr>
+                               <tr>
+                                       <th align="right">Password:</th>
+                                       <td><input type="password" name="passwd"/></td>
+                               </tr>
+                       </table>
+                       <input type="submit" value="Log in"/>
+               </form>
+               </center>
+       </body>
+</html>
+HTML
 
 sub import {
        my $self = shift;
        $bootstrap = shift;
+       $ssl_off = shift;
 }
 
 
@@ -39,13 +70,13 @@ sub handler {
        return Apache2::Const::NOT_FOUND unless (@$perms);
 
        my $cgi = new CGI;
-       my $auth_ses = $cgi->cookie('ses');
-       my $ws_ou = $cgi->cookie('ws_ou');
+       my $auth_ses = $cgi->cookie('ses') || $cgi->param('ses');
+       my $ws_ou = $cgi->cookie('ws_ou') || $cgi->param('ws_ou');
 
        my $url = $cgi->url;
 
        # push everyone to the secure site
-       if ($url =~ /^http:/o) {
+       if (!$ssl_off && $url =~ /^http:/o) {
                $url =~ s/^http:/https:/o;
                print "Location: $url\n\n";
                return Apache2::Const::OK;
@@ -59,7 +90,7 @@ sub handler {
 
                        print $cgi->header(-type=>'text/html', -expires=>'-1d');
                        if (!$proxyhtml) {
-                               $proxyhtml = join '', <DATA>;
+                               $proxyhtml = $default_template;
                                $proxyhtml =~ s/TITLE/$title/gso;
                                $proxyhtml =~ s/DESCRIPTION/$desc/gso;
                        } else {
@@ -147,35 +178,5 @@ sub oils_login {
         return $response->{payload}->{authtoken};
 }
 
-
-
 1;
 
-__DATA__
-<html>
-       <head>
-               <title>TITLE</title>
-       </head>
-       <body>
-               <br/><br/><br/>
-               <center>
-               <form method='POST'>
-                       <table style='border-collapse: collapse; border: 1px solid black;'>
-                               <tr>
-                                       <th colspan='2' align='center'><u>DESCRIPTION</u></th>
-                               </tr>
-                               <tr>
-                                       <th align="right">Username or barcode:</th>
-                                       <td><input type="text" name="user"/></td>
-                               </tr>
-                               <tr>
-                                       <th align="right">Password:</th>
-                                       <td><input type="password" name="passwd"/></td>
-                               </tr>
-                       </table>
-                       <input type="submit" value="Log in"/>
-               </form>
-               </center>
-       </body>
-</html>
-
index 34d0a12..4c2368a 100644 (file)
@@ -9,6 +9,8 @@ use Apache2::RequestIO ();
 use Apache2::RequestUtil;
 use CGI;
 use Data::Dumper;
+use SRU::Request;
+use SRU::Response;
 
 use OpenSRF::EX qw(:try);
 use OpenSRF::Utils qw/:datetime/;
@@ -27,6 +29,8 @@ use OpenSRF::Utils::Logger qw/$logger/;
 use MARC::Record;
 use MARC::File::XML;
 
+my $log = 'OpenSRF::Utils::Logger';
+
 # set the bootstrap config when this module is loaded
 my ($bootstrap, $cstore, $supercat, $actor, $parser, $search, $xslt, $cn_browse_xslt, %browse_types);
 
@@ -742,8 +746,8 @@ sub bookbag_feed {
        $feed->creator($host);
        $feed->update_ts(gmtime_ISO8601());
 
-       $feed->link(rss => $base . "/rss2-full/$id" => 'application/rss+xml');
-       $feed->link(alternate => $base . "/atom-full/$id" => 'application/atom+xml');
+       $feed->link(alternate => $base . "/rss2-full/$id" => 'application/rss+xml');
+       $feed->link(atom => $base . "/atom-full/$id" => 'application/atom+xml');
        $feed->link(html => $base . "/html-full/$id" => 'text/html');
        $feed->link(unapi => $unapi);
 
@@ -778,7 +782,7 @@ sub changes_feed {
 
        my $url = $cgi->url(-path_info=>$add_path);
        my $root = (split 'feed', $url)[0];
-       my $base = (split 'freshmeat', $url)[0] . 'freshmeat';
+       my $base = (split 'freshmeat', $url)[0] . '/freshmeat';
        my $unapi = (split 'feed', $url)[0] . 'unapi';
 
        my $path = $cgi->path_info;
@@ -811,8 +815,8 @@ sub changes_feed {
        $feed->creator($host);
        $feed->update_ts(gmtime_ISO8601());
 
-       $feed->link(rss => $base . "/rss2-full/$rtype/$axis/$limit/$date" => 'application/rss+xml');
-       $feed->link(alternate => $base . "/atom-full/$rtype/$axis/$limit/$date" => 'application/atom+xml');
+       $feed->link(alternate => $base . "/rss2-full/$rtype/$axis/$limit/$date" => 'application/rss+xml');
+       $feed->link(atom => $base . "/atom-full/$rtype/$axis/$limit/$date" => 'application/atom+xml');
        $feed->link(html => $base . "/html-full/$rtype/$axis/$limit/$date" => 'text/html');
        $feed->link(unapi => $unapi);
 
@@ -956,8 +960,12 @@ sub opensearch_feed {
        $lang = '' if ($lang eq '*');
 
        $sort = $cgi->param('searchSort') if $cgi->param('searchSort');
+       $sort ||= '';
        $sortdir = $cgi->param('searchSortDir') if $cgi->param('searchSortDir');
-       $terms .= " " . $cgi->param('searchTerms') if $cgi->param('searchTerms');
+       $sortdir ||= '';
+
+       $terms .= " " if ($terms && $cgi->param('searchTerms'));
+       $terms .= $cgi->param('searchTerms') if $cgi->param('searchTerms');
 
        $class = $cgi->param('searchClass') if $cgi->param('searchClass');
        $class ||= '-';
@@ -975,11 +983,16 @@ sub opensearch_feed {
        my $sut = $cgi->param('su');
        my $set = $cgi->param('se');
 
-       $terms .= " keyword: $kwt" if ($kwt);
-       $terms .= " title: $tit" if ($tit);
-       $terms .= " author: $aut" if ($aut);
-       $terms .= " subject: $sut" if ($sut);
-       $terms .= " series: $set" if ($set);
+       $terms .= " " if ($terms && $kwt);
+       $terms .= "keyword: $kwt" if ($kwt);
+       $terms .= " " if ($terms && $tit);
+       $terms .= "title: $tit" if ($tit);
+       $terms .= " " if ($terms && $aut);
+       $terms .= "author: $aut" if ($aut);
+       $terms .= " " if ($terms && $sut);
+       $terms .= "subject: $sut" if ($sut);
+       $terms .= " " if ($terms && $set);
+       $terms .= "series: $set" if ($set);
 
        if ($version eq '1.0') {
                $type = 'rss2';
@@ -988,13 +1001,6 @@ sub opensearch_feed {
        }
        my $flesh_feed = ($type =~ /-full$/o) ? 1 : 0;
 
-       $terms = decode_utf8($terms);
-       $terms =~ s/\+/ /go;
-       $terms =~ s/'//go;
-       $terms =~ s/^\s+//go;
-       my $term_copy = $terms;
-
-       my $complex_terms = 0;
        if ($terms eq 'help') {
                print $cgi->header(-type => 'text/html');
                print <<"               HTML";
@@ -1008,95 +1014,58 @@ sub opensearch_feed {
                        </html>
                HTML
                return Apache2::Const::OK;
-       }
-
-       my $cache_key = '';
-       my $searches = {};
-       while ($term_copy =~ s/((?:keyword(?:\|\w+)?|title(?:\|\w+)?|author(?:\|\w+)?|subject(?:\|\w+)?|series(?:\|\w+)?|site|dir|sort|lang):[^:]+)$//so) {
-               my ($c,$t) = split ':' => $1;
-               if ($c eq 'site') {
-                       $org = $t;
-                       $org =~ s/^\s*//o;
-                       $org =~ s/\s*$//o;
-               } elsif ($c eq 'sort') {
-                       ($sort = lc($t)) =~ s/^\s*(\w+)\s*$/$1/go;
-               } elsif ($c eq 'dir') {
-                       ($sortdir = lc($t)) =~ s/^\s*(\w+)\s*$/$1/go;
-               } elsif ($c eq 'lang') {
-                       ($lang = lc($t)) =~ s/^\s*(\w+)\s*$/$1/go;
-               } else {
-                       $$searches{$c}{term} .= ' '.$t;
-                       $cache_key .= $c . $t;
-                       $complex_terms = 1;
-               }
-       }
-
+    }
+       
+       $terms = decode_utf8($terms);
        $lang = 'eng' if ($lang eq 'en-US');
 
-       if ($term_copy) {
-               no warnings;
-               $class = 'keyword' if ($class eq '-');
-               $$searches{$class}{term} .= " $term_copy";
-               $cache_key .= $class . $term_copy;
-       }
+       $log->debug("OpenSearch terms: $terms");
 
        my $org_unit;
        if ($org eq '-') {
                $org_unit = $actor->request(
                        'open-ils.actor.org_unit_list.search' => parent_ou => undef
                )->gather(1);
-       } else {
+       } elsif ($org !~ /^\d+$/o) {
                $org_unit = $actor->request(
                        'open-ils.actor.org_unit_list.search' => shortname => uc($org)
                )->gather(1);
-       }
-
-       { no warnings; $cache_key .= $org.$sort.$sortdir.$lang; }
-
-       my $rs_name = $cgi->cookie('os_session');
-       my $cached_res = OpenSRF::Utils::Cache->new->get_cache( "os_session:$rs_name" ) if ($rs_name);
-
-       my $recs;
-       if (!($recs = $$cached_res{os_results}{$cache_key})) {
-               $rs_name = $cgi->remote_host . '::' . rand(time);
-               $recs = $search->request(
-                       'open-ils.search.biblio.multiclass' => {
-                               searches        => $searches,
-                               org_unit        => $org_unit->[0]->id,
-                               offset          => 0,
-                               limit           => 5000,
-                               ($sort ?    ( 'sort'     => $sort    ) : ()),
-                               ($sortdir ? ( 'sort_dir' => $sortdir ) : ($sort ? (sort_dir => 'asc') : (sort_dir => 'desc') )),
-                               ($lang ?    ( 'language' => $lang    ) : ()),
-                       }
+       } else {
+               $org_unit = $actor->request(
+                       'open-ils.actor.org_unit_list.search' => id => $org
                )->gather(1);
-               try {
-                       $$cached_res{os_results}{$cache_key} = $recs;
-                       OpenSRF::Utils::Cache->new->put_cache( "os_session:$rs_name", $cached_res, 1800 );
-               } catch Error with {
-                       warn "supercat unable to store IDs in memcache server\n";
-                       $logger->error("supercat unable to store IDs in memcache server");
-               };
        }
 
+    my $recs = $search->request(
+        'open-ils.search.biblio.multiclass.query' => {
+                       org_unit        => $org_unit->[0]->id,
+                       offset          => $offset - 1,
+                       limit           => $limit,
+                       sort            => $sort,
+                       sort_dir        => $sortdir,
+                       ($lang ?    ( 'language' => $lang    ) : ()),
+               } => $terms => 1
+       )->gather(1);
+
+       $log->debug("Hits for [$terms]: $recs->{count}");
+
        my $feed = create_record_feed(
                'record',
                $type,
-               [ map { $_->[0] } @{$recs->{ids}}[$offset .. $offset + $limit - 1] ],
+               [ map { $_->[0] } @{$recs->{ids}} ],
                $unapi,
                $org,
                $flesh_feed
        );
+
+       $log->debug("Feed created...");
+
        $feed->root($root);
        $feed->lib($org);
        $feed->search($terms);
        $feed->class($class);
 
-       if ($complex_terms) {
-               $feed->title("Search results for [$terms] at ".$org_unit->[0]->name);
-       } else {
-               $feed->title("Search results for [$class => $terms] at ".$org_unit->[0]->name);
-       }
+       $feed->title("Search results for [$terms] at ".$org_unit->[0]->name);
 
        $feed->creator($host);
        $feed->update_ts(gmtime_ISO8601());
@@ -1122,6 +1091,8 @@ sub opensearch_feed {
                $limit,
        );
 
+       $log->debug("...basic feed data added...");
+
        $feed->link(
                next =>
                $base . "/$version/$org/$type/$class?searchTerms=$terms&searchSort=$sort&searchSortDir=$sortdir&searchLang=$lang&startIndex=" . int($offset + $limit + 1) . "&count=" . $limit =>
@@ -1141,13 +1112,13 @@ sub opensearch_feed {
        );
 
        $feed->link(
-               rss =>
+               alternate =>
                $base .  "/$version/$org/rss2-full/$class?searchTerms=$terms&searchSort=$sort&searchSortDir=$sortdir&searchLang=$lang" =>
                'application/rss+xml'
        );
 
        $feed->link(
-               alternate =>
+               atom =>
                $base .  "/$version/$org/atom-full/$class?searchTerms=$terms&searchSort=$sort&searchSortDir=$sortdir&searchLang=$lang" =>
                'application/atom+xml'
        );
@@ -1166,6 +1137,8 @@ sub opensearch_feed {
 
        $feed->link( 'unapi-server' => $unapi);
 
+       $log->debug("...feed links added...");
+
 #      $feed->link(
 #              opac =>
 #              $root . "../$lang/skin/default/xml/rresult.xml?rt=list&" .
@@ -1173,13 +1146,9 @@ sub opensearch_feed {
 #              'text/html'
 #      );
 
-       print $cgi->header(
-               -type           => $feed->type,
-               -charset        => 'UTF-8',
-               -cookie         => $cgi->cookie( -name => 'os_session', -value => $rs_name, -expires => '+30m' ),
-       );
+       print $cgi->header( -type => $feed->type, -charset => 'UTF-8') . entityize($feed->toString) . "\n";
 
-       print entityize($feed->toString) . "\n";
+       $log->debug("...and feed returned.");
 
        return Apache2::Const::OK;
 }
@@ -1316,4 +1285,397 @@ sub string_browse {
        return Apache2::Const::OK;
 }
 
+our %qualifier_map = (
+
+    # Som EG qualifiers
+    'eg.site'               => 'site',
+    'eg.sort'               => 'sort',
+    'eg.direction'          => 'dir',
+    'eg.available'          => 'available',
+
+    # Title class:
+    'eg.title'              => 'title',
+    'dc.title'              => 'title',
+    'bib.titleabbreviated'  => 'title|abbreviated',
+    'bib.titleuniform'      => 'title|uniform',
+    'bib.titletranslated'   => 'title|translated',
+    'bib.titlealternative'  => 'title',
+    'bib.titleseries'       => 'series',
+    'eg.series'             => 'title',
+
+    # Author/Name class:
+    'eg.author'             => 'title',
+    'eg.name'               => 'title',
+    'creator'               => 'author',
+    'dc.creator'            => 'author',
+    'dc.contributer'        => 'author',
+    'dc.publisher'          => 'keyword',
+    'bib.name'              => 'author',
+    'bib.namepersonal'      => 'author|personal',
+    'bib.namepersonalfamily'=> 'author|personal',
+    'bib.namepersonalgiven' => 'author|personal',
+    'bib.namecorporate'     => 'author|corporate',
+    'bib.nameconference'    => 'author|conference',
+
+    # Subject class:
+    'eg.subject'            => 'subject',
+    'dc.subject'            => 'subject',
+    'bib.subjectplace'      => 'subject|geographic',
+    'bib.subjecttitle'      => 'keyword',
+    'bib.subjectname'       => 'subject|name',
+    'bib.subjectoccupation' => 'keyword',
+
+    # Keyword class:
+    'eg.keyword'            => 'keyword',
+    'srw.serverchoice'      => 'keyword',
+
+    # Identifiers:
+    'dc.identifier'         => 'keyword',
+
+    # Dates:
+    'bib.dateissued'        => undef,
+    'bib.datecreated'       => undef,
+    'bib.datevalid'         => undef,
+    'bib.datemodified'      => undef,
+    'bib.datecopyright'     => undef,
+
+    # Resource Type:
+    'dc.type'               => undef,
+
+    # Format:
+    'dc.format'             => undef,
+
+    # Genre:
+    'bib.genre'             => 'keyword',
+
+    # Target Audience:
+    'bib.audience'          => undef,
+
+    # Place of Origin:
+    'bib.originplace'       => undef,
+
+    # Language
+    'dc.language'           => 'lang',
+
+    # Edition
+    'bib.edition'           => 'keyword',
+
+    # Part:
+    'bib.volume'            => 'keyword',
+    'bib.issue'             => 'keyword',
+    'bib.startpage'         => 'keyword',
+    'bib.endpage'           => 'keyword',
+
+    # Issuance:
+    'bib.issuance'          => 'keyword',
+);
+
+our %qualifier_ids = (
+               eg => 'http://open-ils.org/spec/SRU/context-set/evergreen/v1',
+               dc => 'info:srw/cql-context-set/1/dc-v1.1',
+               bib => 'info:srw/cql-context-set/1/bib-v1.0',
+               srw     => ''
+);
+
+our %nested_qualifier_map = (
+               eg => {
+                       site            => ['site','Evergreen Site Code (shortname)'],
+                       sort            => ['sort','Sort on relevance, title, author, pubdate, create_date or edit_date'],
+                       direction       => ['dir','Sort direction (asc|desc)'],
+                       available       => ['available','Filter to availble (true|false)'],
+                       title           => ['title'],
+                       author          => ['author'],
+                       name            => ['author'],
+                       subject         => ['subject'],
+                       keyword         => ['keyword'],
+                       series          => ['series'],
+               },
+               dc => {
+                       title           => ['title'],
+                       creator         => ['author'],
+                       contributor     => ['author'],
+                       publisher       => ['keyword'],
+                       subject         => ['subject'],
+                       identifier      => ['keyword'],
+                       type            => [undef],
+                       format          => [undef],
+                       language        => ['lang'],
+               },
+               bib => {
+               # Title class:
+               titleAbbreviated        => ['title'],
+                   titleUniform                => ['title'],
+                       titleTranslated         => ['title'],
+               titleAlternative        => ['title'],
+                   titleSeries                 => ['series'],
+
+    # Author/Name class:
+                       name                            => ['author'],
+                       namePersonal            => ['author'],
+                       namePersonalFamily      => ['author'],
+                       namePersonalGiven       => ['author'],
+                       nameCorporate           => ['author'],
+                       nameConference          => ['author'],
+
+               # Subject class:
+                       subjectPlace            => ['subject'],
+                       subjectTitle            => ['keyword'],
+                       subjectName                     => ['subject|name'],
+                       subjectOccupation       => ['keyword'],
+
+    # Keyword class:
+
+    # Dates:
+                       dateIssued                      => [undef],
+                       dateCreated                     => [undef],
+                       dateValid                       => [undef],
+                       dateModified            => [undef],
+                       dateCopyright           => [undef],
+
+    # Genre:
+                       genre                           => ['keyword'],
+
+    # Target Audience:
+                       audience                        => [undef],
+
+    # Place of Origin:
+                       originPlace                     => [undef],
+
+    # Edition
+                       edition                         => ['keyword'],
+
+    # Part:
+                       volume                          => ['keyword'],
+                       issue                           => ['keyword'],
+                       startPage                       => ['keyword'],
+                       endPage                         => ['keyword'],
+
+    # Issuance:
+                       issuance                        => ['keyword'],
+               },
+               srw     => {
+                       serverChoice            => ['keyword'],
+               },
+);
+
+
+my $base_explain = <<XML;
+<explain
+               id="evergreen-sru-explain-full"
+               authoritative="true"
+               xmlns:z="http://explain.z3950.org/dtd/2.0/"
+               xmlns="http://explain.z3950.org/dtd/2.0/">
+       <serverInfo transport="http" protocol="SRU" version="1.1">
+               <host/>
+               <port/>
+               <database/>
+       </serverInfo>
+
+       <databaseInfo>
+               <title primary="true"/>
+               <description primary="true"/>
+       </databaseInfo>
+
+       <indexInfo>
+               <set identifier="info:srw/cql-context-set/1/cql-v1.2" name="cql"/>
+       </indexInfo>
+
+       <schemaInfo>
+               <schema
+                               identifier="info:srw/schema/1/marcxml-v1.1"
+                               location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
+                               sort="true"
+                               retrieve="true"
+                               name="marcxml">
+                       <title>MARC21Slim (marcxml)</title>
+               </schema>
+       </schemaInfo>
+
+       <configInfo>
+               <default type="numberOfRecords">10</default>
+               <default type="contextSet">eg</default>
+               <default type="index">keyword</default>
+               <default type="relation">all</default>
+               <default type="sortSchema">marcxml</default>
+               <default type="retrieveSchema">marcxml</default>
+               <setting type="maximumRecords">10</setting>
+               <supports type="relationModifier">relevant</supports>
+               <supports type="relationModifier">stem</supports>
+               <supports type="relationModifier">fuzzy</supports>
+               <supports type="relationModifier">word</supports>
+       </configInfo>
+
+</explain>
+XML
+
+
+my $ex_doc;
+sub sru_search {
+    my $cgi = new CGI;
+
+    my $req = SRU::Request->newFromCGI( $cgi );
+    my $resp = SRU::Response->newFromRequest( $req );
+
+    if ( $resp->type eq 'searchRetrieve' ) {
+               my $cql_query = $req->query;
+               my $search_string = $req->cql->toEvergreen;
+
+        my $offset = $req->startRecord;
+        $offset-- if ($offset);
+        $offset ||= 0;
+
+        my $limit = $req->maximumRecords;
+        $limit ||= 10;
+
+        warn "SRU search string [$cql_query] converted to [$search_string]\n";
+
+               my $recs = $search->request(
+                       'open-ils.search.biblio.multiclass.query' => {offset => $offset, limit => $limit} => $search_string => 1
+               )->gather(1);
+
+        my $bre = $supercat->request( 'open-ils.supercat.record.object.retrieve' => [ map { $_->[0] } @{$recs->{ids}} ] )->gather(1);
+
+        $resp->addRecord(
+            SRU::Response::Record->new(
+                recordSchema    => 'info:srw/schema/1/marcxml-v1.1',
+                recordData => $_->marc
+            )
+        ) for @$bre;
+
+        $resp->numberOfRecords($recs->{count});
+
+    } elsif ( $resp->type eq 'explain' ) {
+               if (!$ex_doc) {
+                       my $host = $cgi->virtual_host || $cgi->server_name;
+
+                       my $add_path = 0;
+                       if ( $cgi->server_software !~ m|^Apache/2.2| ) {
+                               my $rel_name = $cgi->url(-relative=>1);
+                               $add_path = 1 if ($cgi->url(-path_info=>1) !~ /$rel_name$/);
+                       }
+                       my $base = $cgi->url(-base=>1);
+                       my $url = $cgi->url(-path_info=>$add_path);
+                       $url =~ s/^$base\///o;
+
+                       my $doc = $parser->parse_string($base_explain);
+                       my $e = $doc->documentElement;
+                       $e->findnodes('/z:explain/z:serverInfo/z:host')->shift->appendText( $host );
+                       $e->findnodes('/z:explain/z:serverInfo/z:port')->shift->appendText( $cgi->server_port );
+                       $e->findnodes('/z:explain/z:serverInfo/z:database')->shift->appendText( $url );
+
+                       for my $name ( keys %OpenILS::WWW::SuperCat::nested_qualifier_map ) {
+
+                               my $identifier = $OpenILS::WWW::SuperCat::qualifier_ids{ $name };
+
+                               next unless $identifier;
+
+                               my $set_node = $doc->createElementNS( 'http://explain.z3950.org/dtd/2.0/', 'set' );
+                               $set_node->setAttribute( identifier => $identifier );
+                               $set_node->setAttribute( name => $name );
+
+                               $e->findnodes('/z:explain/z:indexInfo')->shift->appendChild( $set_node );
+
+                               for my $index ( keys %{ $OpenILS::WWW::SuperCat::nested_qualifier_map{$name} } ) {
+                                       my $desc = $OpenILS::WWW::SuperCat::nested_qualifier_map{$name}{$index}[1] || $index;
+
+                                       my $name_node = $doc->createElementNS( 'http://explain.z3950.org/dtd/2.0/', 'name' );
+
+                                       my $map_node = $doc->createElementNS( 'http://explain.z3950.org/dtd/2.0/', 'map' );
+                                       $map_node->appendChild( $name_node );
+
+                                       my $title_node = $doc->createElementNS( 'http://explain.z3950.org/dtd/2.0/', 'title' );
+
+                                       my $index_node = $doc->createElementNS( 'http://explain.z3950.org/dtd/2.0/', 'index' );
+                                       $index_node->appendChild( $title_node );
+                                       $index_node->appendChild( $map_node );
+
+                                       $index_node->setAttribute( id => $name . '.' . $index );
+                                       $title_node->appendText( $desc );
+                                       $name_node->setAttribute( set => $name );
+                                       $name_node->appendText($index );
+
+                                       $e->findnodes('/z:explain/z:indexInfo')->shift->appendChild( $index_node );
+                               }
+                       }
+
+                       $ex_doc = $e->toString;
+               }
+
+               $resp->record(
+                       SRU::Response::Record->new(
+                               recordSchema    => 'info:srw/cql-context-set/2/zeerex-1.1',
+                               recordData              => $ex_doc
+                       )
+               );
+       }
+
+       print $cgi->header( -type => 'application/xml' );
+       print entityize($resp->asXML) . "\n";
+    return Apache2::Const::OK;
+}
+
+
+{
+    package CQL::BooleanNode;
+
+    sub toEvergreen {
+        my $self     = shift;
+        my $left     = $self->left();
+        my $right    = $self->right();
+        my $leftStr  = $left->toEvergreen;
+        my $rightStr = $right->toEvergreen();
+
+        my $op =  '||' if uc $self->op() eq 'OR';
+        $op ||=  '&&';
+
+        return  "$leftStr $rightStr";
+    }
+
+    package CQL::TermNode;
+
+    sub toEvergreen {
+        my $self      = shift;
+        my $qualifier = $self->getQualifier();
+        my $term      = $self->getTerm();
+        my $relation  = $self->getRelation();
+
+        my $query;
+        if ( $qualifier ) {
+                       my ($qset, $qname) = split(/\./, $qualifier);
+
+                       warn "!!! $qset, $qname   $OpenILS::WWW::SuperCat::nested_qualifier_map{$qset}{$qname}[0]\n";
+
+            if ( exists($OpenILS::WWW::SuperCat::nested_qualifier_map{$qset}{$qname}) ) {
+                $qualifier = $OpenILS::WWW::SuperCat::nested_qualifier_map{$qset}{$qname}[0] || 'kw';
+                       }
+
+            my @modifiers = $relation->getModifiers();
+
+            my $base = $relation->getBase();
+            if ( grep { $base eq $_ } qw/= scr exact all/ ) {
+
+                my $quote_it = 1;
+                foreach my $m ( @modifiers ) {
+                    if( grep { $m->[ 1 ] eq $_ } qw/cql.fuzzy cql.stem cql.relevant cql.word/ ) {
+                        $quote_it = 0;
+                        last;
+                    }
+                }
+
+                $quote_it = 0 if ( $base eq 'all' );
+                $term = maybeQuote($term) if $quote_it;
+
+            } else {
+                croak( "Evergreen doesn't support the $base relations" );
+            }
+
+
+        } else {
+            $qualifier = "kw";
+        }
+
+        return "$qualifier:$term";
+    }
+}
+
 1;
index 76f8a6a..9ad6c2c 100644 (file)
@@ -5,8 +5,11 @@ use OpenSRF::EX qw(:try);
 use XML::LibXML;
 use XML::LibXSLT;
 use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::Logger qw/$logger/;
 use CGI;
 
+my $log = 'OpenSRF::Utils::Logger';
+
 sub exists {
        my $class = shift;
        my $type = shift;
@@ -212,6 +215,7 @@ sub composeDoc {
 sub toString {
        my $self = shift;
        $self->composeDoc;
+       $log->debug("Document composed");
        return $self->{doc}->toString(1);
 }
 
@@ -230,7 +234,8 @@ sub new {
        my $class = shift;
        my $self = $class->SUPER::build('<feed xmlns:atom="http://www.w3.org/2005/Atom"/>');
        $self->{doc}->documentElement->setNamespace('http://www.w3.org/2005/Atom', undef);
-       $self->{type} = 'application/xml';
+       $self->{doc}->documentElement->setNamespace('http://www.w3.org/2005/Atom', 'atom');
+       $self->{type} = 'application/atom+xml';
        $self->{item_xpath} = '/atom:feed';
        return $self;
 }
@@ -290,10 +295,11 @@ sub new {
        my $class = shift;
        my $xml = shift;
        my $self = $class->SUPER::build($xml);
+       $self->{doc}->documentElement->setNamespace('http://www.w3.org/2005/Atom', undef);
        $self->{doc}->documentElement->setNamespace('http://www.w3.org/2005/Atom', 'atom');
        $self->{item_xpath} = '/atom:entry';
        $self->{holdings_xpath} = '/atom:entry';
-       $self->{type} = 'application/xml';
+       $self->{type} = 'application/atom+xml';
        return $self;
 }
 
@@ -306,7 +312,7 @@ use base 'OpenILS::WWW::SuperCat::Feed';
 sub new {
        my $class = shift;
        my $self = $class->SUPER::build('<rss version="2.0"><channel/></rss>');
-       $self->{type} = 'application/xml';
+       $self->{type} = 'application/rss+xml';
        $self->{item_xpath} = '/rss/channel';
        return $self;
 }
@@ -355,7 +361,7 @@ sub new {
        my $class = shift;
        my $xml = shift;
        my $self = $class->SUPER::build($xml);
-       $self->{type} = 'application/xml';
+       $self->{type} = 'application/rss+xml';
        $self->{item_xpath} = '/item';
        $self->{holdings_xpath} = '/item';
        return $self;
@@ -389,6 +395,7 @@ sub new {
        my $class = shift;
        my $xml = shift;
        my $self = $class->SUPER::build($xml);
+       $self->{doc}->documentElement->setNamespace('http://www.loc.gov/mods/', undef);
        $self->{doc}->documentElement->setNamespace('http://www.loc.gov/mods/', 'mods');
        $self->{type} = 'application/xml';
        $self->{holdings_xpath} = '/mods:mods';
@@ -441,6 +448,7 @@ sub new {
        my $class = shift;
        my $xml = shift;
        my $self = $class->SUPER::build($xml);
+       $self->{doc}->documentElement->setNamespace('http://www.loc.gov/mods/v3', undef);
        $self->{doc}->documentElement->setNamespace('http://www.loc.gov/mods/v3', 'mods');
        $self->{type} = 'application/xml';
        $self->{holdings_xpath} = '/mods:mods';
@@ -509,6 +517,7 @@ sub new {
        my $xml = shift;
        my $self = $class->SUPER::build($xml);
        return undef unless $self;
+       $self->{doc}->documentElement->setNamespace('http://www.loc.gov/MARC21/slim', undef);
        $self->{doc}->documentElement->setNamespace('http://www.loc.gov/MARC21/slim', 'marc');
        $self->{type} = 'application/xml';
        $self->{holdings_xpath} = '/marc:record';
index 870b86c..5a2eae7 100644 (file)
@@ -182,14 +182,6 @@ class IDLClass(object):
         else:
             self.virtual = False
 
-    def __getitem__(self, member):
-        """
-        Returns the requested member using dictionary syntax.
-        """
-        if hasattr(self, member):
-            exec("result = self.%s" % member)
-            return result
-
     def get_field(self, field_name):
         try:
             return [f for f in self.fields if f.name == field_name][0]
@@ -217,13 +209,6 @@ class IDLField(object):
         else:
             self.virtual = False
 
-    def __getitem__(self, member):
-        """
-        Returns the requested member using dictionary syntax.
-        """
-        if hasattr(self, member):
-            exec("result = self.%s" % member)
-            return result
 
 class IDLLink(object):
     def __init__(self, field, **kwargs):
index d05f46b..0be6676 100755 (executable)
@@ -1,8 +1,7 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
 # vim:ts=4:noet:
 
 use strict;
-use diagnostics;
 use DBI;
 use FileHandle;
 use XML::LibXML;
index d13a4f5..ded3995 100644 (file)
@@ -40,13 +40,13 @@ $_$ LANGUAGE SQL;
 
 */
 
-CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keytable TEXT, keycol TEXT, identcol TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
+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' ) );
     language    TEXT := REGEXP_REPLACE( locale, E'_.+$', '' );
     result      config.i18n_core%ROWTYPE;
     fallback    TEXT;
-    keyfield    TEXT := keytable || '.' || keycol;
+    keyfield    TEXT := keyclass || '.' || keycol;
 BEGIN
 
     -- Try the full locale
@@ -85,5 +85,9 @@ CREATE OR REPLACE FUNCTION oils_i18n_gettext( TEXT ) RETURNS TEXT AS $$
     SELECT $1;
 $$ LANGUAGE SQL;
 
+CREATE OR REPLACE FUNCTION public.first_word ( TEXT ) RETURNS TEXT AS $$
+        SELECT SUBSTRING( $1 FROM $_$^\S+$_$);
+$$ LANGUAGE SQL;
+
 COMMIT;
 
index 745435c..596135c 100644 (file)
@@ -4,7 +4,7 @@ BEGIN;
 CREATE SCHEMA actor;
 COMMENT ON SCHEMA actor IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * Schema: actor
@@ -66,7 +66,7 @@ CREATE TABLE actor.usr (
 );
 COMMENT ON TABLE actor.usr IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * User objects
@@ -150,7 +150,7 @@ CREATE TABLE actor.usr_standing_penalty (
 );
 COMMENT ON TABLE actor.usr_standing_penalty IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * User standing penalties
@@ -180,7 +180,7 @@ CREATE TABLE actor.usr_setting (
 );
 COMMENT ON TABLE actor.usr_setting IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * User settings
@@ -214,7 +214,7 @@ CREATE TABLE actor.stat_cat (
 );
 COMMENT ON TABLE actor.stat_cat IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * User Statistical Catagories
@@ -246,7 +246,7 @@ CREATE TABLE actor.stat_cat_entry (
 );
 COMMENT ON TABLE actor.stat_cat_entry IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * User Statistical Catagory Entries
@@ -280,7 +280,7 @@ CREATE TABLE actor.stat_cat_entry_usr_map (
 );
 COMMENT ON TABLE actor.stat_cat_entry_usr_map IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * Statistical Catagory Entry to User map
@@ -312,7 +312,7 @@ CREATE TABLE actor.card (
 );
 COMMENT ON TABLE actor.card IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * Library Cards
@@ -371,6 +371,19 @@ CREATE INDEX actor_org_unit_billing_address_idx ON actor.org_unit (billing_addre
 CREATE INDEX actor_org_unit_mailing_address_idx ON actor.org_unit (mailing_address);
 CREATE INDEX actor_org_unit_holds_address_idx ON actor.org_unit (holds_address);
 
+CREATE TABLE actor.org_lasso (
+    id      SERIAL  PRIMARY KEY,
+    name       TEXT    UNIQUE
+);
+
+CREATE TABLE actor.org_lasso_map (
+    id          SERIAL  PRIMARY KEY,
+    lasso       INT     NOT NULL REFERENCES actor.org_lasso (id) ON DELETE CASCADE,
+    org_unit    INT     NOT NULL REFERENCES actor.org_unit (id) ON DELETE CASCADE
+);
+CREATE UNIQUE INDEX ou_lasso_lasso_ou_idx ON actor.org_lasso_map (lasso, org_unit);
+CREATE INDEX ou_lasso_org_unit_idx ON actor.org_lasso_map (org_unit);
+
 CREATE TABLE actor.org_unit_proximity (
        id              BIGSERIAL       PRIMARY KEY,
        from_org        INT,
@@ -431,7 +444,7 @@ CREATE TABLE actor.org_unit_setting (
 );
 COMMENT ON TABLE actor.org_unit_setting IS $$
 /*
- * Copyright (C) 2005  Georgia Public Library Service 
+ * Copyright (C) 2005-2008  Equinox Software, Inc. / Georgia Public Library Service 
  * Mike Rylander <mrylander@gmail.com>
  *
  * Org Unit settings
@@ -497,4 +510,8 @@ CREATE TABLE actor.org_address (
 
 CREATE INDEX actor_org_address_org_unit_idx ON actor.org_address (org_unit);
 
+CREATE OR REPLACE FUNCTION public.first5 ( TEXT ) RETURNS TEXT AS $$
+       SELECT SUBSTRING( $1, 1, 5);
+$$ LANGUAGE SQL;
+
 COMMIT;
index c2a85bd..0ba1add 100644 (file)
@@ -17,9 +17,12 @@ CREATE OR REPLACE FUNCTION public.non_filing_normalize ( TEXT, "char" ) RETURNS
 $$ LANGUAGE SQL STRICT IMMUTABLE;
 
 CREATE OR REPLACE FUNCTION public.naco_normalize( TEXT, TEXT ) RETURNS TEXT AS $func$
+    use Unicode::Normalize;
+
        my $txt = lc(shift);
        my $sf = shift;
 
+    $txt = NFD($txt);
        $txt =~ s/\pM+//go;     # Remove diacritics
 
        $txt =~ s/\xE6/AE/go;   # Convert ae digraph
@@ -33,7 +36,7 @@ CREATE OR REPLACE FUNCTION public.naco_normalize( TEXT, TEXT ) RETURNS TEXT AS $
        $txt =~ tr/\x{2113}\xF0\!\"\(\)\-\{\}\<\>\;\:\.\?\xA1\xBF\/\\\@\*\%\=\xB1\+\xAE\xA9\x{2117}\$\xA3\x{FFE1}\xB0\^\_\~\`/LD /;     # Convert Misc
        $txt =~ tr/\'\[\]\|//d;                                                 # Remove Misc
 
-       if ($sf =~ /^a/o) {
+       if ($sf && $sf =~ /^a/o) {
                my $commapos = index($txt,',');
                if ($commapos > -1) {
                        if ($commapos != length($txt) - 1) {
@@ -59,17 +62,47 @@ CREATE OR REPLACE FUNCTION public.naco_normalize( TEXT ) RETURNS TEXT AS $func$
        SELECT public.naco_normalize($1,'');
 $func$ LANGUAGE 'sql' STRICT IMMUTABLE;
 
+CREATE OR REPLACE FUNCTION public.normalize_space( TEXT ) RETURNS TEXT AS $$
+    SELECT regexp_replace(regexp_replace(regexp_replace($1, E'\\n', ' ', 'g'), E'(?:^\\s+)|(\\s+$)', '', 'g'), E'\\s+', ' ', 'g');
+$$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION public.lowercase( TEXT ) RETURNS TEXT AS $$
+    return lc(shift);
+$$ LANGUAGE PLPERLU;
+
+CREATE OR REPLACE FUNCTION public.uppercase( TEXT ) RETURNS TEXT AS $$
+    return uc(shift);
+$$ LANGUAGE PLPERLU;
+
+CREATE OR REPLACE FUNCTION public.remove_diacritics( TEXT ) RETURNS TEXT AS $$
+    use Unicode::Normalize;
+
+    my $x = NFD(shift);
+    $x =~ s/\pM+//go;
+    return $x;
+
+$$ LANGUAGE PLPERLU;
+
+CREATE OR REPLACE FUNCTION public.entityize( TEXT ) RETURNS TEXT AS $$
+    use Unicode::Normalize;
+
+    my $x = NFC(shift);
+    $x =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
+    return $x;
+
+$$ LANGUAGE PLPERLU;
+
 CREATE OR REPLACE FUNCTION public.call_number_dewey( TEXT ) RETURNS TEXT AS $$
        my $txt = shift;
        $txt =~ s/^\s+//o;
        $txt =~ s/[\[\]\{\}\(\)`'"#<>\*\?\-\+\$\\]+//o;
        $txt =~ s/\s+$//o;
-       if (/(\d{3}(?:\.\d+)?)/o) {
+       if ($txt =~ /(\d{3}(?:\.\d+)?)/o) {
                return $1;
        } else {
                return (split /\s+/, $txt)[0];
        }
-$$ LANGUAGE 'plperl' STRICT IMMUTABLE;
+$$ LANGUAGE 'plperlu' STRICT IMMUTABLE;
 
 CREATE OR REPLACE FUNCTION public.call_number_dewey( TEXT, INT ) RETURNS TEXT AS $$
        SELECT SUBSTRING(call_number_dewey($1) FROM 1 FOR $2);
index 0e06d3b..e542877 100644 (file)
@@ -89,6 +89,7 @@ CREATE TABLE action.circulation (
        due_date                TIMESTAMP WITH TIME ZONE,
        stop_fines_time         TIMESTAMP WITH TIME ZONE,
        checkin_time            TIMESTAMP WITH TIME ZONE,
+       create_time             TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
        duration                INTERVAL,                                 -- derived from "circ duration" rule
        fine_interval           INTERVAL                        NOT NULL DEFAULT '1 day'::INTERVAL, -- derived from "circ fine" rule
        recuring_fine           NUMERIC(6,2),                             -- derived from "circ fine" rule
diff --git a/Open-ILS/src/sql/Pg/100.circ_matrix.sql b/Open-ILS/src/sql/Pg/100.circ_matrix.sql
new file mode 100644 (file)
index 0000000..321e697
--- /dev/null
@@ -0,0 +1,389 @@
+
+BEGIN;
+
+-- NOTE: current config.item_type should get sip2_media_type and magnetic_media columns
+
+-- New table needed to handle circ modifiers inside the DB.  Will still require
+-- central admin.  The circ_modifier column on asset.copy will become an fkey to this table.
+CREATE TABLE config.circ_modifier (
+       code                    TEXT    PRIMARY KEY,
+       name            TEXT    UNIQUE NOT NULL,
+       description         TEXT        NOT NULL,
+       sip2_media_type TEXT    NOT NULL,
+       magnetic_media  BOOL    NOT NULL DEFAULT TRUE
+);
+
+/*
+-- for instance ...
+INSERT INTO config.circ_modifier VALUES ( 'DVD', 'DVD', 'um ... DVDs', '001', FALSE );
+INSERT INTO config.circ_modifier VALUES ( 'VIDEO', 'VIDEO', 'Tapes', '001', TRUE );
+INSERT INTO config.circ_modifier VALUES ( 'BOOK', 'BOOK', 'Dead tree', '001', FALSE );
+INSERT INTO config.circ_modifier VALUES ( 'CRAZY_ARL-ATH_SETTING', 'R2R_TAPE', 'reel2reel tape', '007', TRUE );
+*/
+
+-- But, just to get us started, use this
+/*
+
+UPDATE asset.copy SET circ_modifier = UPPER(circ_modifier) WHERE circ_modifier IS NOT NULL AND circ_modifier <> '';
+UPDATE asset.copy SET circ_modifier = NULL WHERE circ_modifier = '';
+
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type )
+    SELECT DISTINCT
+            UPPER(circ_modifier),
+            UPPER(circ_modifier),
+            LOWER(circ_modifier),
+            '001'
+      FROM  asset.copy
+      WHERE circ_modifier IS NOT NULL;
+
+*/
+
+-- add an fkey pointing to the new circ mod table
+ALTER TABLE asset.copy ADD CONSTRAINT circ_mod_fkey FOREIGN KEY (circ_modifier) REFERENCES config.circ_modifier (code) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+
+-- config table to hold the vr_format names
+CREATE TABLE config.videorecording_format_map (
+       code    TEXT    PRIMARY KEY,
+       value   TEXT    NOT NULL
+);
+
+INSERT INTO config.videorecording_format_map VALUES ('a','Beta');
+INSERT INTO config.videorecording_format_map VALUES ('b','VHS');
+INSERT INTO config.videorecording_format_map VALUES ('c','U-matic');
+INSERT INTO config.videorecording_format_map VALUES ('d','EIAJ');
+INSERT INTO config.videorecording_format_map VALUES ('e','Type C');
+INSERT INTO config.videorecording_format_map VALUES ('f','Quadruplex');
+INSERT INTO config.videorecording_format_map VALUES ('g','Laserdisc');
+INSERT INTO config.videorecording_format_map VALUES ('h','CED');
+INSERT INTO config.videorecording_format_map VALUES ('i','Betacam');
+INSERT INTO config.videorecording_format_map VALUES ('j','Betacam SP');
+INSERT INTO config.videorecording_format_map VALUES ('k','Super-VHS');
+INSERT INTO config.videorecording_format_map VALUES ('m','M-II');
+INSERT INTO config.videorecording_format_map VALUES ('o','D-2');
+INSERT INTO config.videorecording_format_map VALUES ('p','8 mm.');
+INSERT INTO config.videorecording_format_map VALUES ('q','Hi-8 mm.');
+INSERT INTO config.videorecording_format_map VALUES ('u','Unknown');
+INSERT INTO config.videorecording_format_map VALUES ('v','DVD');
+INSERT INTO config.videorecording_format_map VALUES ('z','Other');
+
+
+
+/**
+ **  Here we define the tables that make up the circ matrix.  Conceptually, this implements
+ **  the "sparse matrix" that everyone talks about, instead of using traditional rules logic.
+ **  Physically, we cut the matrix up into separate tables (almost 3rd normal form!) that handle
+ **  different portions of the matrix.  This wil simplify creation of the UI (I hope), and help the
+ **  developers focus on specific parts of the matrix.
+ **/
+
+
+--
+--                 ****** Which ruleset and tests to use *******
+--
+-- * Most specific range for org_unit and grp wins.
+--
+-- * circ_modifier match takes precidence over marc_type match, if circ_modifier is set here
+--
+-- * marc_type is first checked against the circ_as_type from the copy, then the item type from the marc record
+--
+-- * If neither circ_modifier nor marc_type is set (both are NULLABLE) then the entry defines the default
+--   ruleset and tests for the OU + group (like BOOK in PINES)
+--
+
+CREATE TABLE config.circ_matrix_matchpoint (
+       id                      SERIAL  PRIMARY KEY,
+       active                  BOOL    NOT NULL DEFAULT TRUE,
+       org_unit                INT     NOT NULL REFERENCES actor.org_unit (id),        -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       grp                     INT     NOT NULL REFERENCES permission.grp_tree (id),   -- Set to the top applicable group from the group tree; will need decendents and prox functions for filtering
+       circ_modifier   TEXT    REFERENCES config.circ_modifier (code),
+       marc_type               TEXT    REFERENCES config.item_type_map (code),
+       marc_form               TEXT    REFERENCES config.item_form_map (code),
+       marc_vr_format  TEXT    REFERENCES config.videorecording_format_map (code),
+       ref_flag                BOOL,
+       usr_age_lower_bound     INTERVAL,
+       usr_age_upper_bound     INTERVAL,
+       CONSTRAINT ep_once_per_grp_loc_mod_marc UNIQUE (grp, org_unit, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, usr_age_lower_bound, usr_age_upper_bound)
+);
+
+
+-- Tests to determine if circ can occur for this item at this location for this patron
+CREATE TABLE config.circ_matrix_test (
+       matchpoint                      INT     PRIMARY KEY NOT NULL REFERENCES config.circ_matrix_matchpoint (id) ON DELETE CASCADE,
+       circulate                       BOOL    NOT NULL DEFAULT TRUE,  -- Hard "can't circ" flag requiring an override
+       max_items_out           INT,                            -- Total current active circulations must be less than this, NULL means skip (always pass)
+       max_overdue                     INT,                                            -- Total overdue active circulations must be less than this, NULL means skip (always pass)
+       max_fines                       NUMERIC(8,2),                           -- Total fines owed must be less than this, NULL means skip (always pass)
+       script_test                     TEXT                                    -- filename or javascript source ??
+);
+
+-- Tests for max items out by circ_modifier
+CREATE TABLE config.circ_matrix_circ_mod_test (
+       id          SERIAL     PRIMARY KEY,
+       matchpoint  INT     NOT NULL REFERENCES config.circ_matrix_matchpoint (id) ON DELETE CASCADE,
+       items_out   INT     NOT NULL,                           -- Total current active circulations must be less than this, NULL means skip (always pass)
+       circ_mod    TEXT    NOT NULL REFERENCES config.circ_modifier (code) ON DELETE CASCADE ON UPDATE CASCADE -- circ_modifier type that the max out applies to
+);
+
+
+-- How to circ, assuming tests pass
+CREATE TABLE config.circ_matrix_ruleset (
+       matchpoint              INT     PRIMARY KEY REFERENCES config.circ_matrix_matchpoint (id),
+       duration_rule           INT     NOT NULL REFERENCES config.rule_circ_duration (id),
+       recurring_fine_rule     INT     NOT NULL REFERENCES config.rule_recuring_fine (id),
+       max_fine_rule           INT     NOT NULL REFERENCES config.rule_max_fine (id)
+);
+
+CREATE OR REPLACE FUNCTION action.find_circ_matrix_matchpoint( context_ou INT, match_item BIGINT, match_user INT ) RETURNS INT AS $func$
+DECLARE
+       current_group   permission.grp_tree%ROWTYPE;
+       user_object     actor.usr%ROWTYPE;
+       item_object     asset.copy%ROWTYPE;
+       rec_descriptor  metabib.rec_descriptor%ROWTYPE;
+       current_mp      config.circ_matrix_matchpoint%ROWTYPE;
+       matchpoint      config.circ_matrix_matchpoint%ROWTYPE;
+BEGIN
+       SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+       SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
+       SELECT INTO rec_descriptor r.* FROM metabib.rec_descriptor r JOIN asset.call_number c USING (record) WHERE c.id = item_object.call_number;
+       SELECT INTO current_group * FROM permission.grp_tree WHERE id = user_object.profile;
+
+       LOOP 
+               -- for each potential matchpoint for this ou and group ...
+               FOR current_mp IN
+                       SELECT  m.*
+                         FROM  config.circ_matrix_matchpoint m
+                               JOIN actor.org_unit_ancestors( context_ou ) d ON (m.org_unit = d.id)
+                               LEFT JOIN actor.org_unit_proximity p ON (p.from_org = context_ou AND p.to_org = d.id)
+                         WHERE m.grp = current_group.id AND m.active
+                         ORDER BY      CASE WHEN p.prox                IS NULL THEN 999 ELSE p.prox END,
+                                       CASE WHEN m.circ_modifier       IS NOT NULL THEN 32 ELSE 0 END +
+                                       CASE WHEN m.marc_type           IS NOT NULL THEN 16 ELSE 0 END +
+                                       CASE WHEN m.marc_form           IS NOT NULL THEN 8 ELSE 0 END +
+                                       CASE WHEN m.marc_vr_format      IS NOT NULL THEN 4 ELSE 0 END +
+                                       CASE WHEN m.ref_flag            IS NOT NULL THEN 2 ELSE 0 END +
+                                       CASE WHEN m.usr_age_lower_bound IS NOT NULL THEN 0.5 ELSE 0 END +
+                                       CASE WHEN m.usr_age_upper_bound IS NOT NULL THEN 0.5 ELSE 0 END DESC LOOP
+
+                       IF current_mp.circ_modifier IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.circ_modifier <> item_object.circ_modifier;
+                       END IF;
+
+                       IF current_mp.marc_type IS NOT NULL THEN
+                               IF item_object.circ_as_type IS NOT NULL THEN
+                                       CONTINUE WHEN current_mp.marc_type <> item_object.circ_as_type;
+                               ELSE
+                                       CONTINUE WHEN current_mp.marc_type <> rec_descriptor.item_type;
+                               END IF;
+                       END IF;
+
+                       IF current_mp.marc_form IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.marc_form <> rec_descriptor.item_form;
+                       END IF;
+
+                       IF current_mp.marc_vr_format IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.marc_vr_format <> rec_descriptor.vr_format;
+                       END IF;
+
+                       IF current_mp.ref_flag IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.ref_flag <> item_object.ref;
+                       END IF;
+
+                       IF current_mp.usr_age_lower_bound IS NOT NULL THEN
+                               CONTINUE WHEN user_object.dob IS NULL OR current_mp.usr_age_lower_bound < age(user_object.dob);
+                       END IF;
+
+                       IF current_mp.usr_age_upper_bound IS NOT NULL THEN
+                               CONTINUE WHEN user_object.dob IS NULL OR current_mp.usr_age_upper_bound > age(user_object.dob);
+                       END IF;
+
+
+                       -- everything was undefined or matched
+                       matchpoint = current_mp;
+
+                       EXIT WHEN matchpoint.id IS NOT NULL;
+               END LOOP;
+
+               EXIT WHEN current_group.parent IS NULL OR matchpoint.id IS NOT NULL;
+
+               SELECT INTO current_group * FROM permission.grp_tree WHERE id = current_group.parent;
+       END LOOP;
+
+       RETURN matchpoint.id;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+CREATE TYPE action.matrix_test_result AS ( success BOOL, matchpoint INT, fail_part TEXT );
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.matrix_test_result AS $func$
+DECLARE
+       matchpoint_id           INT;
+       user_object             actor.usr%ROWTYPE;
+       item_object             asset.copy%ROWTYPE;
+       item_status_object      config.copy_status%ROWTYPE;
+       item_location_object    asset.copy_location%ROWTYPE;
+       result                  action.matrix_test_result;
+       circ_test               config.circ_matrix_test%ROWTYPE;
+       out_by_circ_mod         config.circ_matrix_circ_mod_test%ROWTYPE;
+       items_out               INT;
+       items_overdue           INT;
+       current_fines           NUMERIC(8,2) := 0.0;
+       tmp_fines               NUMERIC(8,2);
+       tmp_xact                BIGINT;
+       done                    BOOL := FALSE;
+BEGIN
+       result.success := TRUE;
+
+       -- Fail if the user is BARRED
+       SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+       -- Fail if we couldn't find a set of tests
+       IF user_object.id IS NULL THEN
+               result.fail_part := 'no_user';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+               RETURN;
+       END IF;
+
+       IF user_object.barred IS TRUE THEN
+               result.fail_part := 'actor.usr.barred';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       -- Fail if the item can't circulate
+       SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
+       IF item_object.circulate IS FALSE THEN
+               result.fail_part := 'asset.copy.circulate';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       -- Fail if the item isn't in a circulateable status on a non-renewal
+       IF NOT renewal AND item_object.status NOT IN ( 0, 7, 8 ) THEN 
+               result.fail_part := 'asset.copy.status';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       ELSIF renewal AND item_object.status <> 1 THEN
+               result.fail_part := 'asset.copy.status';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       -- Fail if the item can't circulate because of the shelving location
+       SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
+       IF item_location_object.circulate IS FALSE THEN
+               result.fail_part := 'asset.copy_location.circulate';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       SELECT INTO matchpoint_id action.find_circ_matrix_matchpoint(circ_ou, match_item, match_user);
+       result.matchpoint := matchpoint_id;
+
+       -- Fail if we couldn't find a set of tests
+       IF result.matchpoint IS NULL THEN
+               result.fail_part := 'no_matchpoint';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       -- Fail if the test is set to hard non-circulating
+       IF circ_test.circulate IS FALSE THEN
+               result.fail_part := 'config.circ_matrix_test.circulate';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       -- Fail if the user has too many items checked out
+       IF circ_test.max_items_out IS NOT NULL THEN
+       SELECT  INTO items_out COUNT(*)
+          FROM  action.circulation
+          WHERE usr = match_user
+                AND checkin_time IS NULL
+                AND (stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE') OR stop_fines IS NULL);
+               IF items_out >= circ_test.max_items_out THEN
+                       result.fail_part := 'config.circ_matrix_test.max_items_out';
+                       result.success := FALSE;
+                       done := TRUE;
+                       RETURN NEXT result;
+               END IF;
+       END IF;
+
+       -- Fail if the user has too many items with specific circ_modifiers checked out
+       FOR out_by_circ_mod IN SELECT * FROM config.circ_matrix_circ_mod_test WHERE matchpoint = matchpoint_id LOOP
+               SELECT  INTO items_out COUNT(*)
+                 FROM  action.circulation circ
+                       JOIN asset.copy cp ON (cp.id = circ.target_copy)
+                 WHERE circ.usr = match_user
+                       AND circ.checkin_time IS NULL
+                       AND (circ.stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE') OR circ.stop_fines IS NULL)
+                       AND cp.circ_modifier = out_by_circ_mod.circ_mod;
+               IF items_out >= out_by_circ_mod.items_out THEN
+                       result.fail_part := 'config.circ_matrix_circ_mod_test';
+                       result.success := FALSE;
+                       done := TRUE;
+                       RETURN NEXT result;
+               END IF;
+       END LOOP;
+
+       -- Fail if the user has too many overdue items
+       IF circ_test.max_overdue IS NOT NULL THEN
+               SELECT  INTO items_overdue COUNT(*)
+                 FROM  action.circulation
+                 WHERE usr = match_user
+                       AND checkin_time IS NULL
+                       AND due_date < NOW()
+                       AND (stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE') OR stop_fines IS NULL);
+               IF items_overdue >= circ_test.max_overdue THEN
+                       result.fail_part := 'config.circ_matrix_test.max_overdue';
+                       result.success := FALSE;
+                       done := TRUE;
+                       RETURN NEXT result;
+               END IF;
+       END IF;
+
+       -- Fail if the user has a high fine balance
+       IF circ_test.max_fines IS NOT NULL THEN
+               FOR tmp_xact IN SELECT id FROM money.billable_xact WHERE usr = match_usr AND xact_finish IS NULL LOOP
+                       SELECT INTO tmp_fines SUM( amount ) FROM money.billing WHERE xact = tmp_xact AND NOT voided;
+                       current_fines = current_fines + COALESCE(tmp_fines, 0.0);
+                       SELECT INTO tmp_fines SUM( amount ) FROM money.payment WHERE xact = tmp_xact AND NOT voided;
+                       current_fines = current_fines - COALESCE(tmp_fines, 0.0);
+               END LOOP;
+
+               IF current_fines >= circ_test.max_overdue THEN
+                       result.fail_part := 'config.circ_matrix_test.max_fines';
+                       result.success := FALSE;
+                       RETURN NEXT result;
+                       done := TRUE;
+               END IF;
+       END IF;
+
+       -- If we passed everything, return the successful matchpoint id
+       IF NOT done THEN
+               RETURN NEXT result;
+       END IF;
+
+       RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( INT, BIGINT, INT ) RETURNS SETOF action.matrix_test_result AS $func$
+       SELECT * FROM action.item_user_circ_test( $1, $2, $3, FALSE );
+$func$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION action.item_user_renew_test( INT, BIGINT, INT ) RETURNS SETOF action.matrix_test_result AS $func$
+       SELECT * FROM action.item_user_circ_test( $1, $2, $3, TRUE );
+$func$ LANGUAGE SQL;
+
+
+COMMIT;
+
diff --git a/Open-ILS/src/sql/Pg/110.hold_matrix.sql b/Open-ILS/src/sql/Pg/110.hold_matrix.sql
new file mode 100644 (file)
index 0000000..ac34949
--- /dev/null
@@ -0,0 +1,278 @@
+BEGIN;
+
+
+--
+--                 ****** Which ruleset and tests to use *******
+--
+-- * Most specific range for org_unit and grp wins.
+--
+-- * circ_modifier match takes precidence over marc_type match, if circ_modifier is set here
+--
+-- * marc_type is first checked against the circ_as_type from the copy, then the item type from the marc record
+--
+-- * If neither circ_modifier nor marc_type is set (both are NULLABLE) then the entry defines the default
+--   ruleset and tests for the OU + group (like BOOK in PINES)
+--
+
+
+
+CREATE TABLE config.hold_matrix_matchpoint (
+       id                      SERIAL      PRIMARY KEY,
+       active                  BOOL    NOT NULL DEFAULT TRUE,
+       user_home_ou    INT         REFERENCES actor.org_unit (id),     -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       request_ou              INT         REFERENCES actor.org_unit (id),     -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       pickup_ou               INT         REFERENCES actor.org_unit (id),     -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       item_owning_ou  INT         REFERENCES actor.org_unit (id),     -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       item_circ_ou    INT         REFERENCES actor.org_unit (id),     -- Set to the top OU for the matchpoint applicability range; we can use org_unit_prox to choose the "best"
+       usr_grp                 INT         REFERENCES permission.grp_tree (id),        -- Set to the top applicable group from the group tree; will need decendents and prox functions for filtering
+       requestor_grp   INT         NOT NULL REFERENCES permission.grp_tree (id),       -- Set to the top applicable group from the group tree; will need decendents and prox functions for filtering
+       circ_modifier   TEXT    REFERENCES config.circ_modifier (code),
+       marc_type               TEXT    REFERENCES config.item_type_map (code),
+       marc_form               TEXT    REFERENCES config.item_form_map (code),
+       marc_vr_format  TEXT    REFERENCES config.videorecording_format_map (code),
+       ref_flag                BOOL,
+       CONSTRAINT hous_once_per_grp_loc_mod_marc UNIQUE (user_home_ou, request_ou, pickup_ou, item_owning_ou, item_circ_ou, requestor_grp, usr_grp, circ_modifier, marc_type, marc_form, marc_vr_format)
+);
+
+INSERT INTO config.hold_matrix_matchpoint (requestor_grp) VALUES (1);
+
+-- Tests to determine if hold against a specific copy is possible for a user at (and from) a location
+CREATE TABLE config.hold_matrix_test (
+       matchpoint                      INT     PRIMARY KEY REFERENCES config.hold_matrix_matchpoint (id),
+       holdable                        BOOL    NOT NULL DEFAULT TRUE,                          -- Hard "can't hold" flag requiring an override
+       distance_is_from_owner  BOOL    NOT NULL DEFAULT FALSE,                         -- How to calculate transit_range.  True means owning lib, false means copy circ lib
+       transit_range               INT REFERENCES actor.org_unit_type (id),            -- Can circ inside range of cn.owner/cp.circ_lib at depth of the org_unit_type specified here
+       max_holds                       INT,                                                    -- Total hold requests must be less than this, NULL means skip (always pass)
+       include_frozen_holds    BOOL    NOT NULL DEFAULT TRUE,                          -- Include frozen hold requests in the count for max_holds test
+       age_hold_protect_rule   INT     REFERENCES config.rule_age_hold_protect (id)    -- still not sure we want to move this off the copy
+);
+
+CREATE OR REPLACE FUNCTION action.find_hold_matrix_matchpoint( pickup_ou INT, request_ou INT, match_item BIGINT, match_user INT, match_requestor INT ) RETURNS INT AS $func$
+DECLARE
+       current_requestor_group permission.grp_tree%ROWTYPE;
+       root_ou                 actor.org_unit%ROWTYPE;
+       requestor_object        actor.usr%ROWTYPE;
+       user_object             actor.usr%ROWTYPE;
+       item_object             asset.copy%ROWTYPE;
+       item_cn_object          asset.call_number%ROWTYPE;
+       rec_descriptor          metabib.rec_descriptor%ROWTYPE;
+       current_mp_weight       FLOAT;
+       matchpoint_weight       FLOAT;
+       tmp_weight              FLOAT;
+       current_mp              config.hold_matrix_matchpoint%ROWTYPE;
+       matchpoint              config.hold_matrix_matchpoint%ROWTYPE;
+BEGIN
+       SELECT INTO root_ou * FROM actor.org_unit WHERE parent_ou IS NULL;
+       SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+       SELECT INTO requestor_object * FROM actor.usr WHERE id = match_requestor;
+       SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
+       SELECT INTO item_cn_object * FROM asset.call_number WHERE id = item_object.call_number;
+       SELECT INTO rec_descriptor r.* FROM metabib.rec_descriptor r WHERE r.record = item_cn_object.record;
+       SELECT INTO current_requestor_group * FROM permission.grp_tree WHERE id = requestor_object.profile;
+
+       LOOP 
+               -- for each potential matchpoint for this ou and group ...
+               FOR current_mp IN
+                       SELECT  m.*
+                         FROM  config.hold_matrix_matchpoint m
+                         WHERE m.requestor_grp = current_requestor_group.id AND m.active
+                         ORDER BY      CASE WHEN m.circ_modifier       IS NOT NULL THEN 16 ELSE 0 END +
+                                       CASE WHEN m.marc_type           IS NOT NULL THEN 8 ELSE 0 END +
+                                       CASE WHEN m.marc_form           IS NOT NULL THEN 4 ELSE 0 END +
+                                       CASE WHEN m.marc_vr_format      IS NOT NULL THEN 2 ELSE 0 END +
+                                       CASE WHEN m.ref_flag            IS NOT NULL THEN 1 ELSE 0 END DESC LOOP
+
+                       current_mp_weight := 5.0;
+
+                       IF current_mp.circ_modifier IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.circ_modifier <> item_object.circ_modifier;
+                       END IF;
+
+                       IF current_mp.marc_type IS NOT NULL THEN
+                               IF item_object.circ_as_type IS NOT NULL THEN
+                                       CONTINUE WHEN current_mp.marc_type <> item_object.circ_as_type;
+                               ELSE
+                                       CONTINUE WHEN current_mp.marc_type <> rec_descriptor.item_type;
+                               END IF;
+                       END IF;
+
+                       IF current_mp.marc_form IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.marc_form <> rec_descriptor.item_form;
+                       END IF;
+
+                       IF current_mp.marc_vr_format IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.marc_vr_format <> rec_descriptor.vr_format;
+                       END IF;
+
+                       IF current_mp.ref_flag IS NOT NULL THEN
+                               CONTINUE WHEN current_mp.ref_flag <> item_object.ref;
+                       END IF;
+
+
+                       -- caclulate the rule match weight
+                       IF current_mp.item_owning_ou IS NOT NULL AND current_mp.item_owning_ou <> root_ou.id THEN
+                               SELECT INTO tmp_weight 1.0 / (actor.org_unit_proximity(current_mp.item_owning_ou, item_cn_object.owning_lib)::FLOAT + 1.0)::FLOAT;
+                               current_mp_weight := current_mp_weight - tmp_weight;
+                       END IF; 
+
+                       IF current_mp.item_circ_ou IS NOT NULL AND current_mp.item_circ_ou <> root_ou.id THEN
+                               SELECT INTO tmp_weight 1.0 / (actor.org_unit_proximity(current_mp.item_circ_ou, item_object.circ_lib)::FLOAT + 1.0)::FLOAT;
+                               current_mp_weight := current_mp_weight - tmp_weight;
+                       END IF; 
+
+                       IF current_mp.pickup_ou IS NOT NULL AND current_mp.pickup_ou <> root_ou.id THEN
+                               SELECT INTO tmp_weight 1.0 / (actor.org_unit_proximity(current_mp.pickup_ou, pickup_ou)::FLOAT + 1.0)::FLOAT;
+                               current_mp_weight := current_mp_weight - tmp_weight;
+                       END IF; 
+
+                       IF current_mp.request_ou IS NOT NULL AND current_mp.request_ou <> root_ou.id THEN
+                               SELECT INTO tmp_weight 1.0 / (actor.org_unit_proximity(current_mp.request_ou, request_ou)::FLOAT + 1.0)::FLOAT;
+                               current_mp_weight := current_mp_weight - tmp_weight;
+                       END IF; 
+
+                       IF current_mp.user_home_ou IS NOT NULL AND current_mp.user_home_ou <> root_ou.id THEN
+                               SELECT INTO tmp_weight 1.0 / (actor.org_unit_proximity(current_mp.user_home_ou, user_object.home_ou)::FLOAT + 1.0)::FLOAT;
+                               current_mp_weight := current_mp_weight - tmp_weight;
+                       END IF; 
+
+                       -- set the matchpoint if we found the best one
+                       IF matchpoint_weight IS NULL OR matchpoint_weight > current_mp_weight THEN
+                               matchpoint = current_mp;
+                               matchpoint_weight = current_mp_weight;
+                       END IF;
+
+               END LOOP;
+
+               EXIT WHEN current_requestor_group.parent IS NULL OR matchpoint.id IS NOT NULL;
+
+               SELECT INTO current_requestor_group * FROM permission.grp_tree WHERE id = current_requestor_group.parent;
+       END LOOP;
+
+       RETURN matchpoint.id;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION action.hold_request_permit_test( pickup_ou INT, request_ou INT, match_item BIGINT, match_user INT, match_requestor INT ) RETURNS SETOF action.matrix_test_result AS $func$
+DECLARE
+       matchpoint_id           INT;
+       user_object             actor.usr%ROWTYPE;
+       age_protect_object      config.rule_age_hold_protect%ROWTYPE;
+       transit_range_ou_type   actor.org_unit_type%ROWTYPE;
+       transit_source          actor.org_unit%ROWTYPE;
+       item_object             asset.copy%ROWTYPE;
+       result                  action.matrix_test_result;
+       hold_test               config.hold_matrix_test%ROWTYPE;
+       hold_count              INT;
+       hold_transit_prox       INT;
+       frozen_hold_count       INT;
+       done                    BOOL := FALSE;
+BEGIN
+       SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+       -- Fail if we couldn't find a user
+       IF user_object.id IS NULL THEN
+               result.fail_part := 'no_user';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+               RETURN;
+       END IF;
+
+       SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
+
+       -- Fail if we couldn't find a copy
+       IF item_object.id IS NULL THEN
+               result.fail_part := 'no_item';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+               RETURN;
+       END IF;
+
+       SELECT INTO matchpoint_id action.find_hold_matrix_matchpoint(pickup_ou, request_ou, match_item, match_user, match_requestor);
+
+       -- Fail if we couldn't find any matchpoint (requires a default)
+       IF matchpoint_id IS NULL THEN
+               result.fail_part := 'no_matchpoint';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+               RETURN;
+       END IF;
+
+       SELECT INTO hold_test * FROM config.hold_matrix_test WHERE matchpoint = matchpoint_id;
+
+       result.matchpoint := matchpoint_id;
+       result.success := TRUE;
+
+       IF hold_test.holdable IS FALSE THEN
+               result.fail_part := 'config.hold_matrix_test.holdable';
+               result.success := FALSE;
+               done := TRUE;
+               RETURN NEXT result;
+       END IF;
+
+       IF hold_test.transit_range IS NOT NULL THEN
+               SELECT INTO transit_range_ou_type * FROM actor.org_unit_type WHERE id = hold_test.transit_range;
+               IF hold_test.distance_is_from_owner THEN
+                       SELECT INTO transit_source ou.* FROM actor.org_unit ou JOIN asset.call_number cn ON (cn.owning_lib = ou.id) WHERE cn.id = item_object.call_number;
+               ELSE
+                       SELECT INTO transit_source * FROM actor.org_unit WHERE id = item_object.circ_lib;
+               END IF;
+
+               PERFORM * FROM actor.org_unit_descendants( transit_source.id, transit_range_ou_type.depth ) WHERE id = pickup_ou;
+
+               IF NOT FOUND THEN
+                       result.fail_part := 'transit_range';
+                       result.success := FALSE;
+                       done := TRUE;
+                       RETURN NEXT result;
+               END IF;
+       END IF;
+
+       IF hold_test.max_holds IS NOT NULL THEN
+               SELECT  INTO hold_count COUNT(*)
+                 FROM  action.hold_request
+                 WHERE usr = match_user
+                       AND fulfillment_time IS NULL
+                       AND cancel_time IS NULL
+                       AND CASE WHEN hold_test.include_frozen_holds THEN TRUE ELSE frozen IS FALSE END;
+
+               IF items_out >= hold_test.max_holds THEN
+                       result.fail_part := 'config.hold_matrix_test.max_holds';
+                       result.success := FALSE;
+                       done := TRUE;
+                       RETURN NEXT result;
+               END IF;
+       END IF;
+
+       IF item_object.age_protect IS NOT NULL THEN
+               SELECT INTO age_protect_object * FROM config.rule_age_hold_protect WHERE id = item_object.age_protect;
+
+               IF item_object.create_date + age_protect_object.age > NOW() THEN
+                       IF hold_test.distance_is_from_owner THEN
+                               SELECT INTO hold_transit_prox prox FROM actor.org_unit_prox WHERE from_org = item_cn_object.owning_lib AND to_org = pickup_ou;
+                       ELSE
+                               SELECT INTO hold_transit_prox prox FROM actor.org_unit_prox WHERE from_org = item_object.circ_lib AND to_org = pickup_ou;
+                       END IF;
+
+                       IF hold_transit_prox > age_protect_object.prox THEN
+                               result.fail_part := 'config.rule_age_hold_protect.prox';
+                               result.success := FALSE;
+                               done := TRUE;
+                               RETURN NEXT result;
+                       END IF;
+               END IF;
+       END IF;
+
+       IF NOT done THEN
+               RETURN NEXT result;
+       END IF;
+
+       RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+COMMIT;
+
diff --git a/Open-ILS/src/sql/Pg/300.schema.staged_search.sql b/Open-ILS/src/sql/Pg/300.schema.staged_search.sql
new file mode 100644 (file)
index 0000000..bbfb291
--- /dev/null
@@ -0,0 +1,562 @@
+
+DROP SCHEMA search CASCADE;
+
+BEGIN;
+
+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 );
+
+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_bib_level 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;
+
+    IF param_bib_level IS NOT NULL AND array_upper(param_bib_level, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.bib_level IN ('$$ || array_to_string(param_bib_level, $$','$$) || $$') $$;
+    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_search_ou > 0 THEN
+        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;
+    ELSIF param_search_ou < 0 THEN
+        SELECT array_accum(distinct org_unit) INTO search_org_list FROM actor.org_lasso_map WHERE lasso = -param_search_ou;
+    ELSIF param_search_ou = 0 THEN
+        -- reserved for user lassos (ou_buckets/type='lasso') with ID passed in depth ... hack? sure.
+    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;
+
+/*
+    param_statuses  INT[],
+    param_audience  TEXT[], x
+    param_language  TEXT[], x
+    param_lit_form  TEXT[], x
+    param_types     TEXT[], x
+    param_forms     TEXT[], x
+    param_vformats  TEXT[], x
+*/
+
+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;
+
index e241bf7..e030984 100644 (file)
@@ -3,6 +3,7 @@ BEGIN;
 ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_mailing_address_fkey FOREIGN KEY (mailing_address) REFERENCES actor.usr_address (id) DEFERRABLE INITIALLY DEFERRED;
 ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_billining_address_fkey FOREIGN KEY (billing_address) REFERENCES actor.usr_address (id) DEFERRABLE INITIALLY DEFERRED;
 ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_home_ou_fkey FOREIGN KEY (home_ou) REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_profile_fkey FOREIGN KEY (profile) REFERENCES permission.grp_tree (id) DEFERRABLE INITIALLY DEFERRED;
         
 ALTER TABLE actor.stat_cat ADD CONSTRAINT actor_stat_cat_owner_fkey FOREIGN KEY (owner) REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 
index 9c52b07..484c101 100644 (file)
@@ -1,64 +1,97 @@
 --002.schema.config.sql:
 INSERT INTO config.bib_source (quality, source, transcendant) VALUES 
-    (90, oils_i18n_gettext('oclc'), FALSE),
-    (10, oils_i18n_gettext('System Local'), FALSE),
+    (90, oils_i18n_gettext('oclc'), FALSE);
+INSERT INTO config.bib_source (quality, source, transcendant) VALUES 
+    (10, oils_i18n_gettext('System Local'), FALSE);
+INSERT INTO config.bib_source (quality, source, transcendant) VALUES 
     (1, oils_i18n_gettext('Project Gutenberg'), TRUE);
 
 INSERT INTO config.standing (value) VALUES (oils_i18n_gettext('Good'));
 INSERT INTO config.standing (value) VALUES (oils_i18n_gettext('Barred'));
 
-INSERT INTO config.xml_transform VALUES ( 'marcxml', 'http://www.loc.gov/MARC21/slim', 'marc', '---' );
-INSERT INTO config.xml_transform VALUES ( 'mods', 'http://www.loc.gov/mods/', 'mods', '/home/miker/MARC21slim2MODS.xsl' );
-
 INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
-    ( 'series', 'seriestitle', $$//mods:mods/mods:relatedItem[@type="series"]/mods:titleInfo$$ ),
-    ( 'title', 'abbreviated', $$//mods:mods/mods:titleInfo[mods:title and (@type='abbreviated')]$$ ),
-    ( 'title', 'translated', $$//mods:mods/mods:titleInfo[mods:title and (@type='translated')]$$ ),
-    ( 'title', 'uniform', $$//mods:mods/mods:titleInfo[mods:title and (@type='uniform')]$$ ),
-    ( 'title', 'proper', $$//mods:mods/mods:titleInfo[mods:title and not (@type)]$$ ),
-    ( 'author', 'corporate', $$//mods:mods/mods:name[@type='corporate']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ ),
-    ( 'author', 'personal', $$//mods:mods/mods:name[@type='personal']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ ),
-    ( 'author', 'conference', $$//mods:mods/mods:name[@type='conference']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ ),
-    ( 'author', 'other', $$//mods:mods/mods:name[@type='personal']/mods:namePart[not(../mods:role)]$$ ),
-    ( 'subject', 'geographic', $$//mods:mods/mods:subject/mods:geographic$$ ),
-    ( 'subject', 'name', $$//mods:mods/mods:subject/mods:name$$ ),
-    ( 'subject', 'temporal', $$//mods:mods/mods:subject/mods:temporal$$ ),
-    ( 'subject', 'topic', $$//mods:mods/mods:subject/mods:topic$$ ),
---  ( field_class, name, xpath ) VALUES ( 'subject', 'genre', $$//mods:mods/mods:genre$$ ),
-    ( 'keyword', 'keyword', $$//mods:mods/*[not(local-name()='originInfo')]$$ ); -- /* to fool vim */
+    ( 'series', 'seriestitle', $$//mods:mods/mods:relatedItem[@type="series"]/mods:titleInfo$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'title', 'abbreviated', $$//mods:mods/mods:titleInfo[mods:title and (@type='abbreviated')]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'title', 'translated', $$//mods:mods/mods:titleInfo[mods:title and (@type='translated')]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'title', 'uniform', $$//mods:mods/mods:titleInfo[mods:title and (@type='uniform')]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'title', 'proper', $$//mods:mods/mods:titleInfo[mods:title and not (@type)]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'author', 'corporate', $$//mods:mods/mods:name[@type='corporate']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'author', 'personal', $$//mods:mods/mods:name[@type='personal']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'author', 'conference', $$//mods:mods/mods:name[@type='conference']/mods:namePart[../mods:role/mods:text[text()='creator']]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'author', 'other', $$//mods:mods/mods:name[@type='personal']/mods:namePart[not(../mods:role)]$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'subject', 'geographic', $$//mods:mods/mods:subject/mods:geographic$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'subject', 'name', $$//mods:mods/mods:subject/mods:name$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'subject', 'temporal', $$//mods:mods/mods:subject/mods:temporal$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'subject', 'topic', $$//mods:mods/mods:subject/mods:topic$$ );
+--INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+--  ( field_class, name, xpath ) VALUES ( 'subject', 'genre', $$//mods:mods/mods:genre$$ );
+INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES 
+    ( 'keyword', 'keyword', $$//mods:mods/*[not(local-name()='originInfo')]$$ ); -- /* to fool vim */;
 
 INSERT INTO config.non_cataloged_type ( owning_lib, name ) VALUES ( 1, oils_i18n_gettext('Paperback Book') );
 
 INSERT INTO config.identification_type ( name ) VALUES 
-    ( oils_i18n_gettext('Drivers License') ),
-    ( oils_i18n_gettext('SSN') ),
+    ( oils_i18n_gettext('Drivers License') );
+INSERT INTO config.identification_type ( name ) VALUES 
+    ( oils_i18n_gettext('SSN') );
+INSERT INTO config.identification_type ( name ) VALUES 
     ( oils_i18n_gettext('Other') );
 
 INSERT INTO config.rule_circ_duration VALUES 
-    (DEFAULT, oils_i18n_gettext('7_days_0_renew'), '7 days', '7 days', '7 days', 0),
-    (DEFAULT, oils_i18n_gettext('28_days_2_renew'), '28 days', '28 days', '28 days', 2),
-    (DEFAULT, oils_i18n_gettext('3_months_0_renew'), '3 months', '3 months', '3 months', 0),
-    (DEFAULT, oils_i18n_gettext('3_days_1_renew'), '3 days', '3 days', '3 days', 1),
-    (DEFAULT, oils_i18n_gettext('2_months_2_renew'), '2 months', '2 months', '2 months', 2),
-    (DEFAULT, oils_i18n_gettext('35_days_1_renew'), '35 days', '35 days', '35 days', 1),
-    (DEFAULT, oils_i18n_gettext('7_days_2_renew'), '7 days', '7 days', '7 days', 2),
-    (DEFAULT, oils_i18n_gettext('1_hour_2_renew'), '1 hour', '1 hour', '1 hour', 2),
-    (DEFAULT, oils_i18n_gettext('28_days_0_renew'), '28 days', '28 days', '28 days', 0),
-    (DEFAULT, oils_i18n_gettext('14_days_2_renew'), '14 days', '14 days', '14 days', 2),
+    (DEFAULT, oils_i18n_gettext('7_days_0_renew'), '7 days', '7 days', '7 days', 0);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('28_days_2_renew'), '28 days', '28 days', '28 days', 2);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('3_months_0_renew'), '3 months', '3 months', '3 months', 0);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('3_days_1_renew'), '3 days', '3 days', '3 days', 1);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('2_months_2_renew'), '2 months', '2 months', '2 months', 2);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('35_days_1_renew'), '35 days', '35 days', '35 days', 1);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('7_days_2_renew'), '7 days', '7 days', '7 days', 2);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('1_hour_2_renew'), '1 hour', '1 hour', '1 hour', 2);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('28_days_0_renew'), '28 days', '28 days', '28 days', 0);
+INSERT INTO config.rule_circ_duration VALUES 
+    (DEFAULT, oils_i18n_gettext('14_days_2_renew'), '14 days', '14 days', '14 days', 2);
+INSERT INTO config.rule_circ_duration VALUES 
     (DEFAULT, oils_i18n_gettext('default'), '21 days', '14 days', '7 days', 2);
 
 INSERT INTO config.rule_max_fine VALUES 
-    (DEFAULT, oils_i18n_gettext('default'), 5.00),
-    (DEFAULT, oils_i18n_gettext('overdue_min'), 5.00),
-    (DEFAULT, oils_i18n_gettext('overdue_mid'), 10.00),
-    (DEFAULT, oils_i18n_gettext('overdue_max'), 100.00),
-    (DEFAULT, oils_i18n_gettext('overdue_equip_min'), 25.00),
-    (DEFAULT, oils_i18n_gettext('overdue_equip_mid'), 25.00),
+    (DEFAULT, oils_i18n_gettext('default'), 5.00);
+INSERT INTO config.rule_max_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('overdue_min'), 5.00);
+INSERT INTO config.rule_max_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('overdue_mid'), 10.00);
+INSERT INTO config.rule_max_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('overdue_max'), 100.00);
+INSERT INTO config.rule_max_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('overdue_equip_min'), 25.00);
+INSERT INTO config.rule_max_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('overdue_equip_mid'), 25.00);
+INSERT INTO config.rule_max_fine VALUES 
     (DEFAULT, oils_i18n_gettext('overdue_equip_max'), 100.00);
 
 INSERT INTO config.rule_recuring_fine VALUES 
-    (DEFAULT, oils_i18n_gettext('default'), 0.50, 0.10, 0.05, '1 day'),
-    (DEFAULT, oils_i18n_gettext('10_cent_per_day'), 0.50, 0.10, 0.10, '1 day'),
+    (DEFAULT, oils_i18n_gettext('default'), 0.50, 0.10, 0.05, '1 day');
+INSERT INTO config.rule_recuring_fine VALUES 
+    (DEFAULT, oils_i18n_gettext('10_cent_per_day'), 0.50, 0.10, 0.10, '1 day');
+INSERT INTO config.rule_recuring_fine VALUES 
     (DEFAULT, oils_i18n_gettext('50_cent_per_day'), 0.50, 0.50, 0.50, '1 day');
 
 INSERT INTO config.rule_age_hold_protect VALUES (DEFAULT, oils_i18n_gettext('3month'), '3 months', 0);
@@ -87,730 +120,908 @@ INSERT INTO config.copy_status (id,name)                 VALUES (14,oils_i18n_gettext('Damaged
 SELECT SETVAL('config.copy_status_id_seq'::TEXT, 100);
 
 INSERT INTO config.net_access_level (name) VALUES 
-    (oils_i18n_gettext('Filtered')),
-    (oils_i18n_gettext('Unfiltered')),
+    (oils_i18n_gettext('Filtered'));
+INSERT INTO config.net_access_level (name) VALUES 
+    (oils_i18n_gettext('Unfiltered'));
+INSERT INTO config.net_access_level (name) VALUES 
     (oils_i18n_gettext('No Access'));
 
 INSERT INTO config.audience_map (code, value, description) VALUES 
-    ('', oils_i18n_gettext('Unknown or unspecified'), oils_i18n_gettext('The target audience for the item not known or not specified.')),
-    ('a', oils_i18n_gettext('Preschool'), oils_i18n_gettext('The item is intended for children, approximate ages 0-5 years.')),
-    ('b', oils_i18n_gettext('Primary'), oils_i18n_gettext('The item is intended for children, approximate ages 6-8 years.')),
-    ('c', oils_i18n_gettext('Pre-adolescent'), oils_i18n_gettext('The item is intended for young people, approximate ages 9-13 years.')),
-    ('d', oils_i18n_gettext('Adolescent'), oils_i18n_gettext('The item is intended for young people, approximate ages 14-17 years.')),
-    ('e', oils_i18n_gettext('Adult'), oils_i18n_gettext('The item is intended for adults.')),
-    ('f', oils_i18n_gettext('Specialized'), oils_i18n_gettext('The item is aimed at a particular audience and the nature of the presentation makes the item of little interest to another audience.')),
-    ('g', oils_i18n_gettext('General'), oils_i18n_gettext('The item is of general interest and not aimed at an audience of a particular intellectual level.')),
+    ('', oils_i18n_gettext('Unknown or unspecified'), oils_i18n_gettext('The target audience for the item not known or not specified.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('a', oils_i18n_gettext('Preschool'), oils_i18n_gettext('The item is intended for children, approximate ages 0-5 years.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('b', oils_i18n_gettext('Primary'), oils_i18n_gettext('The item is intended for children, approximate ages 6-8 years.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('c', oils_i18n_gettext('Pre-adolescent'), oils_i18n_gettext('The item is intended for young people, approximate ages 9-13 years.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('d', oils_i18n_gettext('Adolescent'), oils_i18n_gettext('The item is intended for young people, approximate ages 14-17 years.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('e', oils_i18n_gettext('Adult'), oils_i18n_gettext('The item is intended for adults.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('f', oils_i18n_gettext('Specialized'), oils_i18n_gettext('The item is aimed at a particular audience and the nature of the presentation makes the item of little interest to another audience.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
+    ('g', oils_i18n_gettext('General'), oils_i18n_gettext('The item is of general interest and not aimed at an audience of a particular intellectual level.'));
+INSERT INTO config.audience_map (code, value, description) VALUES 
     ('j', oils_i18n_gettext('Juvenile'), oils_i18n_gettext('The item is intended for children and young people, approximate ages 0-15 years.'));
 
 INSERT INTO config.lit_form_map (code, value, description) VALUES 
-    ('0', oils_i18n_gettext('Not fiction (not further specified)'), oils_i18n_gettext('The item is not a work of fiction and no further identification of the literary form is desired')),
-    ('1', oils_i18n_gettext('Fiction (not further specified)'), oils_i18n_gettext('The item is a work of fiction and no further identification of the literary form is desired')),
-    ('c', oils_i18n_gettext('Comic strips'), NULL),
-    ('d', oils_i18n_gettext('Dramas'), NULL),
-    ('e', oils_i18n_gettext('Essays'), NULL),
-    ('f', oils_i18n_gettext('Novels'), NULL),
-    ('h', oils_i18n_gettext('Humor, satires, etc.'), oils_i18n_gettext('The item is a humorous work, satire or of similar literary form.')),
-    ('i', oils_i18n_gettext('Letters'), oils_i18n_gettext('The item is a single letter or collection of correspondence.')),
-    ('j', oils_i18n_gettext('Short stories'), oils_i18n_gettext('The item is a short story or collection of short stories.')),
-    ('m', oils_i18n_gettext('Mixed forms'), oils_i18n_gettext('The item is a variety of literary forms (e.g., poetry and short stories).')),
-    ('p', oils_i18n_gettext('Poetry'), oils_i18n_gettext('The item is a poem or collection of poems.')),
-    ('s', oils_i18n_gettext('Speeches'), oils_i18n_gettext('The item is a speech or collection of speeches.')),
+    ('0', oils_i18n_gettext('Not fiction (not further specified)'), oils_i18n_gettext('The item is not a work of fiction and no further identification of the literary form is desired'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('1', oils_i18n_gettext('Fiction (not further specified)'), oils_i18n_gettext('The item is a work of fiction and no further identification of the literary form is desired'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('c', oils_i18n_gettext('Comic strips'), NULL);
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('d', oils_i18n_gettext('Dramas'), NULL);
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('e', oils_i18n_gettext('Essays'), NULL);
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('f', oils_i18n_gettext('Novels'), NULL);
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('h', oils_i18n_gettext('Humor, satires, etc.'), oils_i18n_gettext('The item is a humorous work, satire or of similar literary form.'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('i', oils_i18n_gettext('Letters'), oils_i18n_gettext('The item is a single letter or collection of correspondence.'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('j', oils_i18n_gettext('Short stories'), oils_i18n_gettext('The item is a short story or collection of short stories.'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('m', oils_i18n_gettext('Mixed forms'), oils_i18n_gettext('The item is a variety of literary forms (e.g., poetry and short stories).'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('p', oils_i18n_gettext('Poetry'), oils_i18n_gettext('The item is a poem or collection of poems.'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
+    ('s', oils_i18n_gettext('Speeches'), oils_i18n_gettext('The item is a speech or collection of speeches.'));
+INSERT INTO config.lit_form_map (code, value, description) VALUES 
     ('u', oils_i18n_gettext('Unknown'), oils_i18n_gettext('The literary form of the item is unknown.'));
 
 -- TO-DO: Auto-generate these values from CLDR
-INSERT INTO config.language_map (code, value) VALUES 
-    ('aar', oils_i18n_gettext('Afar')),
-    ('abk', oils_i18n_gettext('Abkhaz')),
-    ('ace', oils_i18n_gettext('Achinese')),
-    ('ach', oils_i18n_gettext('Acoli')),
-    ('ada', oils_i18n_gettext('Adangme')),
-    ('ady', oils_i18n_gettext('Adygei')),
-    ('afa', oils_i18n_gettext('Afroasiatic (Other)')),
-    ('afh', oils_i18n_gettext('Afrihili (Artificial language)')),
-    ('afr', oils_i18n_gettext('Afrikaans')),
-    ('-ajm', oils_i18n_gettext('Aljamía')),
-    ('aka', oils_i18n_gettext('Akan')),
-    ('akk', oils_i18n_gettext('Akkadian')),
-    ('alb', oils_i18n_gettext('Albanian')),
-    ('ale', oils_i18n_gettext('Aleut')),
-    ('alg', oils_i18n_gettext('Algonquian (Other)')),
-    ('amh', oils_i18n_gettext('Amharic')),
-    ('ang', oils_i18n_gettext('English, Old (ca. 450-1100)')),
-    ('apa', oils_i18n_gettext('Apache languages')),
-    ('ara', oils_i18n_gettext('Arabic')),
-    ('arc', oils_i18n_gettext('Aramaic')),
-    ('arg', oils_i18n_gettext('Aragonese Spanish')),
-    ('arm', oils_i18n_gettext('Armenian')),
-    ('arn', oils_i18n_gettext('Mapuche')),
-    ('arp', oils_i18n_gettext('Arapaho')),
-    ('art', oils_i18n_gettext('Artificial (Other)')),
-    ('arw', oils_i18n_gettext('Arawak')),
-    ('asm', oils_i18n_gettext('Assamese')),
-    ('ast', oils_i18n_gettext('Bable')),
-    ('ath', oils_i18n_gettext('Athapascan (Other)')),
-    ('aus', oils_i18n_gettext('Australian languages')),
-    ('ava', oils_i18n_gettext('Avaric')),
-    ('ave', oils_i18n_gettext('Avestan')),
-    ('awa', oils_i18n_gettext('Awadhi')),
-    ('aym', oils_i18n_gettext('Aymara')),
-    ('aze', oils_i18n_gettext('Azerbaijani')),
-    ('bad', oils_i18n_gettext('Banda')),
-    ('bai', oils_i18n_gettext('Bamileke languages')),
-    ('bak', oils_i18n_gettext('Bashkir')),
-    ('bal', oils_i18n_gettext('Baluchi')),
-    ('bam', oils_i18n_gettext('Bambara')),
-    ('ban', oils_i18n_gettext('Balinese')),
-    ('baq', oils_i18n_gettext('Basque')),
-    ('bas', oils_i18n_gettext('Basa')),
-    ('bat', oils_i18n_gettext('Baltic (Other)')),
-    ('bej', oils_i18n_gettext('Beja')),
-    ('bel', oils_i18n_gettext('Belarusian')),
-    ('bem', oils_i18n_gettext('Bemba')),
-    ('ben', oils_i18n_gettext('Bengali')),
-    ('ber', oils_i18n_gettext('Berber (Other)')),
-    ('bho', oils_i18n_gettext('Bhojpuri')),
-    ('bih', oils_i18n_gettext('Bihari')),
-    ('bik', oils_i18n_gettext('Bikol')),
-    ('bin', oils_i18n_gettext('Edo')),
-    ('bis', oils_i18n_gettext('Bislama')),
-    ('bla', oils_i18n_gettext('Siksika')),
-    ('bnt', oils_i18n_gettext('Bantu (Other)')),
-    ('bos', oils_i18n_gettext('Bosnian')),
-    ('bra', oils_i18n_gettext('Braj')),
-    ('bre', oils_i18n_gettext('Breton')),
-    ('btk', oils_i18n_gettext('Batak')),
-    ('bua', oils_i18n_gettext('Buriat')),
-    ('bug', oils_i18n_gettext('Bugis')),
-    ('bul', oils_i18n_gettext('Bulgarian')),
-    ('bur', oils_i18n_gettext('Burmese')),
-    ('cad', oils_i18n_gettext('Caddo')),
-    ('cai', oils_i18n_gettext('Central American Indian (Other)')),
-    ('-cam', oils_i18n_gettext('Khmer')),
-    ('car', oils_i18n_gettext('Carib')),
-    ('cat', oils_i18n_gettext('Catalan')),
-    ('cau', oils_i18n_gettext('Caucasian (Other)')),
-    ('ceb', oils_i18n_gettext('Cebuano')),
-    ('cel', oils_i18n_gettext('Celtic (Other)')),
-    ('cha', oils_i18n_gettext('Chamorro')),
-    ('chb', oils_i18n_gettext('Chibcha')),
-    ('che', oils_i18n_gettext('Chechen')),
-    ('chg', oils_i18n_gettext('Chagatai')),
-    ('chi', oils_i18n_gettext('Chinese')),
-    ('chk', oils_i18n_gettext('Truk')),
-    ('chm', oils_i18n_gettext('Mari')),
-    ('chn', oils_i18n_gettext('Chinook jargon')),
-    ('cho', oils_i18n_gettext('Choctaw')),
-    ('chp', oils_i18n_gettext('Chipewyan')),
-    ('chr', oils_i18n_gettext('Cherokee')),
-    ('chu', oils_i18n_gettext('Church Slavic')),
-    ('chv', oils_i18n_gettext('Chuvash')),
-    ('chy', oils_i18n_gettext('Cheyenne')),
-    ('cmc', oils_i18n_gettext('Chamic languages')),
-    ('cop', oils_i18n_gettext('Coptic')),
-    ('cor', oils_i18n_gettext('Cornish')),
-    ('cos', oils_i18n_gettext('Corsican')),
-    ('cpe', oils_i18n_gettext('Creoles and Pidgins, English-based (Other)')),
-    ('cpf', oils_i18n_gettext('Creoles and Pidgins, French-based (Other)')),
-    ('cpp', oils_i18n_gettext('Creoles and Pidgins, Portuguese-based (Other)')),
-    ('cre', oils_i18n_gettext('Cree')),
-    ('crh', oils_i18n_gettext('Crimean Tatar')),
-    ('crp', oils_i18n_gettext('Creoles and Pidgins (Other)')),
-    ('cus', oils_i18n_gettext('Cushitic (Other)')),
-    ('cze', oils_i18n_gettext('Czech')),
-    ('dak', oils_i18n_gettext('Dakota')),
-    ('dan', oils_i18n_gettext('Danish')),
-    ('dar', oils_i18n_gettext('Dargwa')),
-    ('day', oils_i18n_gettext('Dayak')),
-    ('del', oils_i18n_gettext('Delaware')),
-    ('den', oils_i18n_gettext('Slave')),
-    ('dgr', oils_i18n_gettext('Dogrib')),
-    ('din', oils_i18n_gettext('Dinka')),
-    ('div', oils_i18n_gettext('Divehi')),
-    ('doi', oils_i18n_gettext('Dogri')),
-    ('dra', oils_i18n_gettext('Dravidian (Other)')),
-    ('dua', oils_i18n_gettext('Duala')),
-    ('dum', oils_i18n_gettext('Dutch, Middle (ca. 1050-1350)')),
-    ('dut', oils_i18n_gettext('Dutch')),
-    ('dyu', oils_i18n_gettext('Dyula')),
-    ('dzo', oils_i18n_gettext('Dzongkha')),
-    ('efi', oils_i18n_gettext('Efik')),
-    ('egy', oils_i18n_gettext('Egyptian')),
-    ('eka', oils_i18n_gettext('Ekajuk')),
-    ('elx', oils_i18n_gettext('Elamite')),
-    ('eng', oils_i18n_gettext('English')),
-    ('enm', oils_i18n_gettext('English, Middle (1100-1500)')),
-    ('epo', oils_i18n_gettext('Esperanto')),
-    ('-esk', oils_i18n_gettext('Eskimo languages')),
-    ('-esp', oils_i18n_gettext('Esperanto')),
-    ('est', oils_i18n_gettext('Estonian')),
-    ('-eth', oils_i18n_gettext('Ethiopic')),
-    ('ewe', oils_i18n_gettext('Ewe')),
-    ('ewo', oils_i18n_gettext('Ewondo')),
-    ('fan', oils_i18n_gettext('Fang')),
-    ('fao', oils_i18n_gettext('Faroese')),
-    ('-far', oils_i18n_gettext('Faroese')),
-    ('fat', oils_i18n_gettext('Fanti')),
-    ('fij', oils_i18n_gettext('Fijian')),
-    ('fin', oils_i18n_gettext('Finnish')),
-    ('fiu', oils_i18n_gettext('Finno-Ugrian (Other)')),
-    ('fon', oils_i18n_gettext('Fon')),
-    ('fre', oils_i18n_gettext('French')),
-    ('-fri', oils_i18n_gettext('Frisian')),
-    ('frm', oils_i18n_gettext('French, Middle (ca. 1400-1600)')),
-    ('fro', oils_i18n_gettext('French, Old (ca. 842-1400)')),
-    ('fry', oils_i18n_gettext('Frisian')),
-    ('ful', oils_i18n_gettext('Fula')),
-    ('fur', oils_i18n_gettext('Friulian')),
-    ('gaa', oils_i18n_gettext('Gã')),
-    ('-gae', oils_i18n_gettext('Scottish Gaelic')),
-    ('-gag', oils_i18n_gettext('Galician')),
-    ('-gal', oils_i18n_gettext('Oromo')),
-    ('gay', oils_i18n_gettext('Gayo')),
-    ('gba', oils_i18n_gettext('Gbaya')),
-    ('gem', oils_i18n_gettext('Germanic (Other)')),
-    ('geo', oils_i18n_gettext('Georgian')),
-    ('ger', oils_i18n_gettext('German')),
-    ('gez', oils_i18n_gettext('Ethiopic')),
-    ('gil', oils_i18n_gettext('Gilbertese')),
-    ('gla', oils_i18n_gettext('Scottish Gaelic')),
-    ('gle', oils_i18n_gettext('Irish')),
-    ('glg', oils_i18n_gettext('Galician')),
-    ('glv', oils_i18n_gettext('Manx')),
-    ('gmh', oils_i18n_gettext('German, Middle High (ca. 1050-1500)')),
-    ('goh', oils_i18n_gettext('German, Old High (ca. 750-1050)')),
-    ('gon', oils_i18n_gettext('Gondi')),
-    ('gor', oils_i18n_gettext('Gorontalo')),
-    ('got', oils_i18n_gettext('Gothic')),
-    ('grb', oils_i18n_gettext('Grebo')),
-    ('grc', oils_i18n_gettext('Greek, Ancient (to 1453)')),
-    ('gre', oils_i18n_gettext('Greek, Modern (1453- )')),
-    ('grn', oils_i18n_gettext('Guarani')),
-    ('-gua', oils_i18n_gettext('Guarani')),
-    ('guj', oils_i18n_gettext('Gujarati')),
-    ('gwi', oils_i18n_gettext('Gwich''in')),
-    ('hai', oils_i18n_gettext('Haida')),
-    ('hat', oils_i18n_gettext('Haitian French Creole')),
-    ('hau', oils_i18n_gettext('Hausa')),
-    ('haw', oils_i18n_gettext('Hawaiian')),
-    ('heb', oils_i18n_gettext('Hebrew')),
-    ('her', oils_i18n_gettext('Herero')),
-    ('hil', oils_i18n_gettext('Hiligaynon')),
-    ('him', oils_i18n_gettext('Himachali')),
-    ('hin', oils_i18n_gettext('Hindi')),
-    ('hit', oils_i18n_gettext('Hittite')),
-    ('hmn', oils_i18n_gettext('Hmong')),
-    ('hmo', oils_i18n_gettext('Hiri Motu')),
-    ('hun', oils_i18n_gettext('Hungarian')),
-    ('hup', oils_i18n_gettext('Hupa')),
-    ('iba', oils_i18n_gettext('Iban')),
-    ('ibo', oils_i18n_gettext('Igbo')),
-    ('ice', oils_i18n_gettext('Icelandic')),
-    ('ido', oils_i18n_gettext('Ido')),
-    ('iii', oils_i18n_gettext('Sichuan Yi')),
-    ('ijo', oils_i18n_gettext('Ijo')),
-    ('iku', oils_i18n_gettext('Inuktitut')),
-    ('ile', oils_i18n_gettext('Interlingue')),
-    ('ilo', oils_i18n_gettext('Iloko')),
-    ('ina', oils_i18n_gettext('Interlingua (International Auxiliary Language Association)')),
-    ('inc', oils_i18n_gettext('Indic (Other)')),
-    ('ind', oils_i18n_gettext('Indonesian')),
-    ('ine', oils_i18n_gettext('Indo-European (Other)')),
-    ('inh', oils_i18n_gettext('Ingush')),
-    ('-int', oils_i18n_gettext('Interlingua (International Auxiliary Language Association)')),
-    ('ipk', oils_i18n_gettext('Inupiaq')),
-    ('ira', oils_i18n_gettext('Iranian (Other)')),
-    ('-iri', oils_i18n_gettext('Irish')),
-    ('iro', oils_i18n_gettext('Iroquoian (Other)')),
-    ('ita', oils_i18n_gettext('Italian')),
-    ('jav', oils_i18n_gettext('Javanese')),
-    ('jpn', oils_i18n_gettext('Japanese')),
-    ('jpr', oils_i18n_gettext('Judeo-Persian')),
-    ('jrb', oils_i18n_gettext('Judeo-Arabic')),
-    ('kaa', oils_i18n_gettext('Kara-Kalpak')),
-    ('kab', oils_i18n_gettext('Kabyle')),
-    ('kac', oils_i18n_gettext('Kachin')),
-    ('kal', oils_i18n_gettext('Kalâtdlisut')),
-    ('kam', oils_i18n_gettext('Kamba')),
-    ('kan', oils_i18n_gettext('Kannada')),
-    ('kar', oils_i18n_gettext('Karen')),
-    ('kas', oils_i18n_gettext('Kashmiri')),
-    ('kau', oils_i18n_gettext('Kanuri')),
-    ('kaw', oils_i18n_gettext('Kawi')),
-    ('kaz', oils_i18n_gettext('Kazakh')),
-    ('kbd', oils_i18n_gettext('Kabardian')),
-    ('kha', oils_i18n_gettext('Khasi')),
-    ('khi', oils_i18n_gettext('Khoisan (Other)')),
-    ('khm', oils_i18n_gettext('Khmer')),
-    ('kho', oils_i18n_gettext('Khotanese')),
-    ('kik', oils_i18n_gettext('Kikuyu')),
-    ('kin', oils_i18n_gettext('Kinyarwanda')),
-    ('kir', oils_i18n_gettext('Kyrgyz')),
-    ('kmb', oils_i18n_gettext('Kimbundu')),
-    ('kok', oils_i18n_gettext('Konkani')),
-    ('kom', oils_i18n_gettext('Komi')),
-    ('kon', oils_i18n_gettext('Kongo')),
-    ('kor', oils_i18n_gettext('Korean')),
-    ('kos', oils_i18n_gettext('Kusaie')),
-    ('kpe', oils_i18n_gettext('Kpelle')),
-    ('kro', oils_i18n_gettext('Kru')),
-    ('kru', oils_i18n_gettext('Kurukh')),
-    ('kua', oils_i18n_gettext('Kuanyama')),
-    ('kum', oils_i18n_gettext('Kumyk')),
-    ('kur', oils_i18n_gettext('Kurdish')),
-    ('-kus', oils_i18n_gettext('Kusaie')),
-    ('kut', oils_i18n_gettext('Kutenai')),
-    ('lad', oils_i18n_gettext('Ladino')),
-    ('lah', oils_i18n_gettext('Lahnda')),
-    ('lam', oils_i18n_gettext('Lamba')),
-    ('-lan', oils_i18n_gettext('Occitan (post-1500)')),
-    ('lao', oils_i18n_gettext('Lao')),
-    ('-lap', oils_i18n_gettext('Sami')),
-    ('lat', oils_i18n_gettext('Latin')),
-    ('lav', oils_i18n_gettext('Latvian')),
-    ('lez', oils_i18n_gettext('Lezgian')),
-    ('lim', oils_i18n_gettext('Limburgish')),
-    ('lin', oils_i18n_gettext('Lingala')),
-    ('lit', oils_i18n_gettext('Lithuanian')),
-    ('lol', oils_i18n_gettext('Mongo-Nkundu')),
-    ('loz', oils_i18n_gettext('Lozi')),
-    ('ltz', oils_i18n_gettext('Letzeburgesch')),
-    ('lua', oils_i18n_gettext('Luba-Lulua')),
-    ('lub', oils_i18n_gettext('Luba-Katanga')),
-    ('lug', oils_i18n_gettext('Ganda')),
-    ('lui', oils_i18n_gettext('Luiseño')),
-    ('lun', oils_i18n_gettext('Lunda')),
-    ('luo', oils_i18n_gettext('Luo (Kenya and Tanzania)')),
-    ('lus', oils_i18n_gettext('Lushai')),
-    ('mac', oils_i18n_gettext('Macedonian')),
-    ('mad', oils_i18n_gettext('Madurese')),
-    ('mag', oils_i18n_gettext('Magahi')),
-    ('mah', oils_i18n_gettext('Marshallese')),
-    ('mai', oils_i18n_gettext('Maithili')),
-    ('mak', oils_i18n_gettext('Makasar')),
-    ('mal', oils_i18n_gettext('Malayalam')),
-    ('man', oils_i18n_gettext('Mandingo')),
-    ('mao', oils_i18n_gettext('Maori')),
-    ('map', oils_i18n_gettext('Austronesian (Other)')),
-    ('mar', oils_i18n_gettext('Marathi')),
-    ('mas', oils_i18n_gettext('Masai')),
-    ('-max', oils_i18n_gettext('Manx')),
-    ('may', oils_i18n_gettext('Malay')),
-    ('mdr', oils_i18n_gettext('Mandar')),
-    ('men', oils_i18n_gettext('Mende')),
-    ('mga', oils_i18n_gettext('Irish, Middle (ca. 1100-1550)')),
-    ('mic', oils_i18n_gettext('Micmac')),
-    ('min', oils_i18n_gettext('Minangkabau')),
-    ('mis', oils_i18n_gettext('Miscellaneous languages')),
-    ('mkh', oils_i18n_gettext('Mon-Khmer (Other)')),
-    ('-mla', oils_i18n_gettext('Malagasy')),
-    ('mlg', oils_i18n_gettext('Malagasy')),
-    ('mlt', oils_i18n_gettext('Maltese')),
-    ('mnc', oils_i18n_gettext('Manchu')),
-    ('mni', oils_i18n_gettext('Manipuri')),
-    ('mno', oils_i18n_gettext('Manobo languages')),
-    ('moh', oils_i18n_gettext('Mohawk')),
-    ('mol', oils_i18n_gettext('Moldavian')),
-    ('mon', oils_i18n_gettext('Mongolian')),
-    ('mos', oils_i18n_gettext('Mooré')),
-    ('mul', oils_i18n_gettext('Multiple languages')),
-    ('mun', oils_i18n_gettext('Munda (Other)')),
-    ('mus', oils_i18n_gettext('Creek')),
-    ('mwr', oils_i18n_gettext('Marwari')),
-    ('myn', oils_i18n_gettext('Mayan languages')),
-    ('nah', oils_i18n_gettext('Nahuatl')),
-    ('nai', oils_i18n_gettext('North American Indian (Other)')),
-    ('nap', oils_i18n_gettext('Neapolitan Italian')),
-    ('nau', oils_i18n_gettext('Nauru')),
-    ('nav', oils_i18n_gettext('Navajo')),
-    ('nbl', oils_i18n_gettext('Ndebele (South Africa)')),
-    ('nde', oils_i18n_gettext('Ndebele (Zimbabwe)  ')),
-    ('ndo', oils_i18n_gettext('Ndonga')),
-    ('nds', oils_i18n_gettext('Low German')),
-    ('nep', oils_i18n_gettext('Nepali')),
-    ('new', oils_i18n_gettext('Newari')),
-    ('nia', oils_i18n_gettext('Nias')),
-    ('nic', oils_i18n_gettext('Niger-Kordofanian (Other)')),
-    ('niu', oils_i18n_gettext('Niuean')),
-    ('nno', oils_i18n_gettext('Norwegian (Nynorsk)')),
-    ('nob', oils_i18n_gettext('Norwegian (Bokmål)')),
-    ('nog', oils_i18n_gettext('Nogai')),
-    ('non', oils_i18n_gettext('Old Norse')),
-    ('nor', oils_i18n_gettext('Norwegian')),
-    ('nso', oils_i18n_gettext('Northern Sotho')),
-    ('nub', oils_i18n_gettext('Nubian languages')),
-    ('nya', oils_i18n_gettext('Nyanja')),
-    ('nym', oils_i18n_gettext('Nyamwezi')),
-    ('nyn', oils_i18n_gettext('Nyankole')),
-    ('nyo', oils_i18n_gettext('Nyoro')),
-    ('nzi', oils_i18n_gettext('Nzima')),
-    ('oci', oils_i18n_gettext('Occitan (post-1500)')),
-    ('oji', oils_i18n_gettext('Ojibwa')),
-    ('ori', oils_i18n_gettext('Oriya')),
-    ('orm', oils_i18n_gettext('Oromo')),
-    ('osa', oils_i18n_gettext('Osage')),
-    ('oss', oils_i18n_gettext('Ossetic')),
-    ('ota', oils_i18n_gettext('Turkish, Ottoman')),
-    ('oto', oils_i18n_gettext('Otomian languages')),
-    ('paa', oils_i18n_gettext('Papuan (Other)')),
-    ('pag', oils_i18n_gettext('Pangasinan')),
-    ('pal', oils_i18n_gettext('Pahlavi')),
-    ('pam', oils_i18n_gettext('Pampanga')),
-    ('pan', oils_i18n_gettext('Panjabi')),
-    ('pap', oils_i18n_gettext('Papiamento')),
-    ('pau', oils_i18n_gettext('Palauan')),
-    ('peo', oils_i18n_gettext('Old Persian (ca. 600-400 B.C.)')),
-    ('per', oils_i18n_gettext('Persian')),
-    ('phi', oils_i18n_gettext('Philippine (Other)')),
-    ('phn', oils_i18n_gettext('Phoenician')),
-    ('pli', oils_i18n_gettext('Pali')),
-    ('pol', oils_i18n_gettext('Polish')),
-    ('pon', oils_i18n_gettext('Ponape')),
-    ('por', oils_i18n_gettext('Portuguese')),
-    ('pra', oils_i18n_gettext('Prakrit languages')),
-    ('pro', oils_i18n_gettext('Provençal (to 1500)')),
-    ('pus', oils_i18n_gettext('Pushto')),
-    ('que', oils_i18n_gettext('Quechua')),
-    ('raj', oils_i18n_gettext('Rajasthani')),
-    ('rap', oils_i18n_gettext('Rapanui')),
-    ('rar', oils_i18n_gettext('Rarotongan')),
-    ('roa', oils_i18n_gettext('Romance (Other)')),
-    ('roh', oils_i18n_gettext('Raeto-Romance')),
-    ('rom', oils_i18n_gettext('Romani')),
-    ('rum', oils_i18n_gettext('Romanian')),
-    ('run', oils_i18n_gettext('Rundi')),
-    ('rus', oils_i18n_gettext('Russian')),
-    ('sad', oils_i18n_gettext('Sandawe')),
-    ('sag', oils_i18n_gettext('Sango (Ubangi Creole)')),
-    ('sah', oils_i18n_gettext('Yakut')),
-    ('sai', oils_i18n_gettext('South American Indian (Other)')),
-    ('sal', oils_i18n_gettext('Salishan languages')),
-    ('sam', oils_i18n_gettext('Samaritan Aramaic')),
-    ('san', oils_i18n_gettext('Sanskrit')),
-    ('-sao', oils_i18n_gettext('Samoan')),
-    ('sas', oils_i18n_gettext('Sasak')),
-    ('sat', oils_i18n_gettext('Santali')),
-    ('scc', oils_i18n_gettext('Serbian')),
-    ('sco', oils_i18n_gettext('Scots')),
-    ('scr', oils_i18n_gettext('Croatian')),
-    ('sel', oils_i18n_gettext('Selkup')),
-    ('sem', oils_i18n_gettext('Semitic (Other)')),
-    ('sga', oils_i18n_gettext('Irish, Old (to 1100)')),
-    ('sgn', oils_i18n_gettext('Sign languages')),
-    ('shn', oils_i18n_gettext('Shan')),
-    ('-sho', oils_i18n_gettext('Shona')),
-    ('sid', oils_i18n_gettext('Sidamo')),
-    ('sin', oils_i18n_gettext('Sinhalese')),
-    ('sio', oils_i18n_gettext('Siouan (Other)')),
-    ('sit', oils_i18n_gettext('Sino-Tibetan (Other)')),
-    ('sla', oils_i18n_gettext('Slavic (Other)')),
-    ('slo', oils_i18n_gettext('Slovak')),
-    ('slv', oils_i18n_gettext('Slovenian')),
-    ('sma', oils_i18n_gettext('Southern Sami')),
-    ('sme', oils_i18n_gettext('Northern Sami')),
-    ('smi', oils_i18n_gettext('Sami')),
-    ('smj', oils_i18n_gettext('Lule Sami')),
-    ('smn', oils_i18n_gettext('Inari Sami')),
-    ('smo', oils_i18n_gettext('Samoan')),
-    ('sms', oils_i18n_gettext('Skolt Sami')),
-    ('sna', oils_i18n_gettext('Shona')),
-    ('snd', oils_i18n_gettext('Sindhi')),
-    ('-snh', oils_i18n_gettext('Sinhalese')),
-    ('snk', oils_i18n_gettext('Soninke')),
-    ('sog', oils_i18n_gettext('Sogdian')),
-    ('som', oils_i18n_gettext('Somali')),
-    ('son', oils_i18n_gettext('Songhai')),
-    ('sot', oils_i18n_gettext('Sotho')),
-    ('spa', oils_i18n_gettext('Spanish')),
-    ('srd', oils_i18n_gettext('Sardinian')),
-    ('srr', oils_i18n_gettext('Serer')),
-    ('ssa', oils_i18n_gettext('Nilo-Saharan (Other)')),
-    ('-sso', oils_i18n_gettext('Sotho')),
-    ('ssw', oils_i18n_gettext('Swazi')),
-    ('suk', oils_i18n_gettext('Sukuma')),
-    ('sun', oils_i18n_gettext('Sundanese')),
-    ('sus', oils_i18n_gettext('Susu')),
-    ('sux', oils_i18n_gettext('Sumerian')),
-    ('swa', oils_i18n_gettext('Swahili')),
-    ('swe', oils_i18n_gettext('Swedish')),
-    ('-swz', oils_i18n_gettext('Swazi')),
-    ('syr', oils_i18n_gettext('Syriac')),
-    ('-tag', oils_i18n_gettext('Tagalog')),
-    ('tah', oils_i18n_gettext('Tahitian')),
-    ('tai', oils_i18n_gettext('Tai (Other)')),
-    ('-taj', oils_i18n_gettext('Tajik')),
-    ('tam', oils_i18n_gettext('Tamil')),
-    ('-tar', oils_i18n_gettext('Tatar')),
-    ('tat', oils_i18n_gettext('Tatar')),
-    ('tel', oils_i18n_gettext('Telugu')),
-    ('tem', oils_i18n_gettext('Temne')),
-    ('ter', oils_i18n_gettext('Terena')),
-    ('tet', oils_i18n_gettext('Tetum')),
-    ('tgk', oils_i18n_gettext('Tajik')),
-    ('tgl', oils_i18n_gettext('Tagalog')),
-    ('tha', oils_i18n_gettext('Thai')),
-    ('tib', oils_i18n_gettext('Tibetan')),
-    ('tig', oils_i18n_gettext('Tigré')),
-    ('tir', oils_i18n_gettext('Tigrinya')),
-    ('tiv', oils_i18n_gettext('Tiv')),
-    ('tkl', oils_i18n_gettext('Tokelauan')),
-    ('tli', oils_i18n_gettext('Tlingit')),
-    ('tmh', oils_i18n_gettext('Tamashek')),
-    ('tog', oils_i18n_gettext('Tonga (Nyasa)')),
-    ('ton', oils_i18n_gettext('Tongan')),
-    ('tpi', oils_i18n_gettext('Tok Pisin')),
-    ('-tru', oils_i18n_gettext('Truk')),
-    ('tsi', oils_i18n_gettext('Tsimshian')),
-    ('tsn', oils_i18n_gettext('Tswana')),
-    ('tso', oils_i18n_gettext('Tsonga')),
-    ('-tsw', oils_i18n_gettext('Tswana')),
-    ('tuk', oils_i18n_gettext('Turkmen')),
-    ('tum', oils_i18n_gettext('Tumbuka')),
-    ('tup', oils_i18n_gettext('Tupi languages')),
-    ('tur', oils_i18n_gettext('Turkish')),
-    ('tut', oils_i18n_gettext('Altaic (Other)')),
-    ('tvl', oils_i18n_gettext('Tuvaluan')),
-    ('twi', oils_i18n_gettext('Twi')),
-    ('tyv', oils_i18n_gettext('Tuvinian')),
-    ('udm', oils_i18n_gettext('Udmurt')),
-    ('uga', oils_i18n_gettext('Ugaritic')),
-    ('uig', oils_i18n_gettext('Uighur')),
-    ('ukr', oils_i18n_gettext('Ukrainian')),
-    ('umb', oils_i18n_gettext('Umbundu')),
-    ('und', oils_i18n_gettext('Undetermined')),
-    ('urd', oils_i18n_gettext('Urdu')),
-    ('uzb', oils_i18n_gettext('Uzbek')),
-    ('vai', oils_i18n_gettext('Vai')),
-    ('ven', oils_i18n_gettext('Venda')),
-    ('vie', oils_i18n_gettext('Vietnamese')),
-    ('vol', oils_i18n_gettext('Volapük')),
-    ('vot', oils_i18n_gettext('Votic')),
-    ('wak', oils_i18n_gettext('Wakashan languages')),
-    ('wal', oils_i18n_gettext('Walamo')),
-    ('war', oils_i18n_gettext('Waray')),
-    ('was', oils_i18n_gettext('Washo')),
-    ('wel', oils_i18n_gettext('Welsh')),
-    ('wen', oils_i18n_gettext('Sorbian languages')),
-    ('wln', oils_i18n_gettext('Walloon')),
-    ('wol', oils_i18n_gettext('Wolof')),
-    ('xal', oils_i18n_gettext('Kalmyk')),
-    ('xho', oils_i18n_gettext('Xhosa')),
-    ('yao', oils_i18n_gettext('Yao (Africa)')),
-    ('yap', oils_i18n_gettext('Yapese')),
-    ('yid', oils_i18n_gettext('Yiddish')),
-    ('yor', oils_i18n_gettext('Yoruba')),
-    ('ypk', oils_i18n_gettext('Yupik languages')),
-    ('zap', oils_i18n_gettext('Zapotec')),
-    ('zen', oils_i18n_gettext('Zenaga')),
-    ('zha', oils_i18n_gettext('Zhuang')),
-    ('znd', oils_i18n_gettext('Zande')),
-    ('zul', oils_i18n_gettext('Zulu')),
-    ('zun', oils_i18n_gettext('Zuni'));
-
-INSERT INTO config.item_form_map (code, value) VALUES
-    ('a', oils_i18n_gettext('Microfilm')),
-    ('b', oils_i18n_gettext('Microfiche')),
-    ('c', oils_i18n_gettext('Microopaque')),
-    ('d', oils_i18n_gettext('Large print')),
-    ('f', oils_i18n_gettext('Braille')),
-    ('r', oils_i18n_gettext('Regular print reproduction')),
-    ('s', oils_i18n_gettext('Electronic'));
-
-INSERT INTO config.item_type_map (code, value) VALUES 
-    ('a', oils_i18n_gettext('Language material')),
-    ('t', oils_i18n_gettext('Manuscript language material')),
-    ('g', oils_i18n_gettext('Projected medium')),
-    ('k', oils_i18n_gettext('Two-dimensional nonprojectable graphic')),
-    ('r', oils_i18n_gettext('Three-dimensional artifact or naturally occurring object')),
-    ('o', oils_i18n_gettext('Kit')),
-    ('p', oils_i18n_gettext('Mixed materials')),
-    ('e', oils_i18n_gettext('Cartographic material')),
-    ('f', oils_i18n_gettext('Manuscript cartographic material')),
-    ('c', oils_i18n_gettext('Notated music')),
-    ('d', oils_i18n_gettext('Manuscript notated music')),
-    ('i', oils_i18n_gettext('Nonmusical sound recording')),
-    ('j', oils_i18n_gettext('Musical sound recording')),
-    ('m', oils_i18n_gettext('Computer file'));
+INSERT INTO config.language_map (code, value) VALUES ('aar', oils_i18n_gettext('Afar'));
+INSERT INTO config.language_map (code, value) VALUES ('abk', oils_i18n_gettext('Abkhaz'));
+INSERT INTO config.language_map (code, value) VALUES ('ace', oils_i18n_gettext('Achinese'));
+INSERT INTO config.language_map (code, value) VALUES ('ach', oils_i18n_gettext('Acoli'));
+INSERT INTO config.language_map (code, value) VALUES ('ada', oils_i18n_gettext('Adangme'));
+INSERT INTO config.language_map (code, value) VALUES ('ady', oils_i18n_gettext('Adygei'));
+INSERT INTO config.language_map (code, value) VALUES ('afa', oils_i18n_gettext('Afroasiatic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('afh', oils_i18n_gettext('Afrihili (Artificial language)'));
+INSERT INTO config.language_map (code, value) VALUES ('afr', oils_i18n_gettext('Afrikaans'));
+INSERT INTO config.language_map (code, value) VALUES ('-ajm', oils_i18n_gettext('Aljamía'));
+INSERT INTO config.language_map (code, value) VALUES ('aka', oils_i18n_gettext('Akan'));
+INSERT INTO config.language_map (code, value) VALUES ('akk', oils_i18n_gettext('Akkadian'));
+INSERT INTO config.language_map (code, value) VALUES ('alb', oils_i18n_gettext('Albanian'));
+INSERT INTO config.language_map (code, value) VALUES ('ale', oils_i18n_gettext('Aleut'));
+INSERT INTO config.language_map (code, value) VALUES ('alg', oils_i18n_gettext('Algonquian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('amh', oils_i18n_gettext('Amharic'));
+INSERT INTO config.language_map (code, value) VALUES ('ang', oils_i18n_gettext('English, Old (ca. 450-1100)'));
+INSERT INTO config.language_map (code, value) VALUES ('apa', oils_i18n_gettext('Apache languages'));
+INSERT INTO config.language_map (code, value) VALUES ('ara', oils_i18n_gettext('Arabic'));
+INSERT INTO config.language_map (code, value) VALUES ('arc', oils_i18n_gettext('Aramaic'));
+INSERT INTO config.language_map (code, value) VALUES ('arg', oils_i18n_gettext('Aragonese Spanish'));
+INSERT INTO config.language_map (code, value) VALUES ('arm', oils_i18n_gettext('Armenian'));
+INSERT INTO config.language_map (code, value) VALUES ('arn', oils_i18n_gettext('Mapuche'));
+INSERT INTO config.language_map (code, value) VALUES ('arp', oils_i18n_gettext('Arapaho'));
+INSERT INTO config.language_map (code, value) VALUES ('art', oils_i18n_gettext('Artificial (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('arw', oils_i18n_gettext('Arawak'));
+INSERT INTO config.language_map (code, value) VALUES ('asm', oils_i18n_gettext('Assamese'));
+INSERT INTO config.language_map (code, value) VALUES ('ast', oils_i18n_gettext('Bable'));
+INSERT INTO config.language_map (code, value) VALUES ('ath', oils_i18n_gettext('Athapascan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('aus', oils_i18n_gettext('Australian languages'));
+INSERT INTO config.language_map (code, value) VALUES ('ava', oils_i18n_gettext('Avaric'));
+INSERT INTO config.language_map (code, value) VALUES ('ave', oils_i18n_gettext('Avestan'));
+INSERT INTO config.language_map (code, value) VALUES ('awa', oils_i18n_gettext('Awadhi'));
+INSERT INTO config.language_map (code, value) VALUES ('aym', oils_i18n_gettext('Aymara'));
+INSERT INTO config.language_map (code, value) VALUES ('aze', oils_i18n_gettext('Azerbaijani'));
+INSERT INTO config.language_map (code, value) VALUES ('bad', oils_i18n_gettext('Banda'));
+INSERT INTO config.language_map (code, value) VALUES ('bai', oils_i18n_gettext('Bamileke languages'));
+INSERT INTO config.language_map (code, value) VALUES ('bak', oils_i18n_gettext('Bashkir'));
+INSERT INTO config.language_map (code, value) VALUES ('bal', oils_i18n_gettext('Baluchi'));
+INSERT INTO config.language_map (code, value) VALUES ('bam', oils_i18n_gettext('Bambara'));
+INSERT INTO config.language_map (code, value) VALUES ('ban', oils_i18n_gettext('Balinese'));
+INSERT INTO config.language_map (code, value) VALUES ('baq', oils_i18n_gettext('Basque'));
+INSERT INTO config.language_map (code, value) VALUES ('bas', oils_i18n_gettext('Basa'));
+INSERT INTO config.language_map (code, value) VALUES ('bat', oils_i18n_gettext('Baltic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('bej', oils_i18n_gettext('Beja'));
+INSERT INTO config.language_map (code, value) VALUES ('bel', oils_i18n_gettext('Belarusian'));
+INSERT INTO config.language_map (code, value) VALUES ('bem', oils_i18n_gettext('Bemba'));
+INSERT INTO config.language_map (code, value) VALUES ('ben', oils_i18n_gettext('Bengali'));
+INSERT INTO config.language_map (code, value) VALUES ('ber', oils_i18n_gettext('Berber (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('bho', oils_i18n_gettext('Bhojpuri'));
+INSERT INTO config.language_map (code, value) VALUES ('bih', oils_i18n_gettext('Bihari'));
+INSERT INTO config.language_map (code, value) VALUES ('bik', oils_i18n_gettext('Bikol'));
+INSERT INTO config.language_map (code, value) VALUES ('bin', oils_i18n_gettext('Edo'));
+INSERT INTO config.language_map (code, value) VALUES ('bis', oils_i18n_gettext('Bislama'));
+INSERT INTO config.language_map (code, value) VALUES ('bla', oils_i18n_gettext('Siksika'));
+INSERT INTO config.language_map (code, value) VALUES ('bnt', oils_i18n_gettext('Bantu (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('bos', oils_i18n_gettext('Bosnian'));
+INSERT INTO config.language_map (code, value) VALUES ('bra', oils_i18n_gettext('Braj'));
+INSERT INTO config.language_map (code, value) VALUES ('bre', oils_i18n_gettext('Breton'));
+INSERT INTO config.language_map (code, value) VALUES ('btk', oils_i18n_gettext('Batak'));
+INSERT INTO config.language_map (code, value) VALUES ('bua', oils_i18n_gettext('Buriat'));
+INSERT INTO config.language_map (code, value) VALUES ('bug', oils_i18n_gettext('Bugis'));
+INSERT INTO config.language_map (code, value) VALUES ('bul', oils_i18n_gettext('Bulgarian'));
+INSERT INTO config.language_map (code, value) VALUES ('bur', oils_i18n_gettext('Burmese'));
+INSERT INTO config.language_map (code, value) VALUES ('cad', oils_i18n_gettext('Caddo'));
+INSERT INTO config.language_map (code, value) VALUES ('cai', oils_i18n_gettext('Central American Indian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('-cam', oils_i18n_gettext('Khmer'));
+INSERT INTO config.language_map (code, value) VALUES ('car', oils_i18n_gettext('Carib'));
+INSERT INTO config.language_map (code, value) VALUES ('cat', oils_i18n_gettext('Catalan'));
+INSERT INTO config.language_map (code, value) VALUES ('cau', oils_i18n_gettext('Caucasian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('ceb', oils_i18n_gettext('Cebuano'));
+INSERT INTO config.language_map (code, value) VALUES ('cel', oils_i18n_gettext('Celtic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cha', oils_i18n_gettext('Chamorro'));
+INSERT INTO config.language_map (code, value) VALUES ('chb', oils_i18n_gettext('Chibcha'));
+INSERT INTO config.language_map (code, value) VALUES ('che', oils_i18n_gettext('Chechen'));
+INSERT INTO config.language_map (code, value) VALUES ('chg', oils_i18n_gettext('Chagatai'));
+INSERT INTO config.language_map (code, value) VALUES ('chi', oils_i18n_gettext('Chinese'));
+INSERT INTO config.language_map (code, value) VALUES ('chk', oils_i18n_gettext('Truk'));
+INSERT INTO config.language_map (code, value) VALUES ('chm', oils_i18n_gettext('Mari'));
+INSERT INTO config.language_map (code, value) VALUES ('chn', oils_i18n_gettext('Chinook jargon'));
+INSERT INTO config.language_map (code, value) VALUES ('cho', oils_i18n_gettext('Choctaw'));
+INSERT INTO config.language_map (code, value) VALUES ('chp', oils_i18n_gettext('Chipewyan'));
+INSERT INTO config.language_map (code, value) VALUES ('chr', oils_i18n_gettext('Cherokee'));
+INSERT INTO config.language_map (code, value) VALUES ('chu', oils_i18n_gettext('Church Slavic'));
+INSERT INTO config.language_map (code, value) VALUES ('chv', oils_i18n_gettext('Chuvash'));
+INSERT INTO config.language_map (code, value) VALUES ('chy', oils_i18n_gettext('Cheyenne'));
+INSERT INTO config.language_map (code, value) VALUES ('cmc', oils_i18n_gettext('Chamic languages'));
+INSERT INTO config.language_map (code, value) VALUES ('cop', oils_i18n_gettext('Coptic'));
+INSERT INTO config.language_map (code, value) VALUES ('cor', oils_i18n_gettext('Cornish'));
+INSERT INTO config.language_map (code, value) VALUES ('cos', oils_i18n_gettext('Corsican'));
+INSERT INTO config.language_map (code, value) VALUES ('cpe', oils_i18n_gettext('Creoles and Pidgins, English-based (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cpf', oils_i18n_gettext('Creoles and Pidgins, French-based (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cpp', oils_i18n_gettext('Creoles and Pidgins, Portuguese-based (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cre', oils_i18n_gettext('Cree'));
+INSERT INTO config.language_map (code, value) VALUES ('crh', oils_i18n_gettext('Crimean Tatar'));
+INSERT INTO config.language_map (code, value) VALUES ('crp', oils_i18n_gettext('Creoles and Pidgins (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cus', oils_i18n_gettext('Cushitic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('cze', oils_i18n_gettext('Czech'));
+INSERT INTO config.language_map (code, value) VALUES ('dak', oils_i18n_gettext('Dakota'));
+INSERT INTO config.language_map (code, value) VALUES ('dan', oils_i18n_gettext('Danish'));
+INSERT INTO config.language_map (code, value) VALUES ('dar', oils_i18n_gettext('Dargwa'));
+INSERT INTO config.language_map (code, value) VALUES ('day', oils_i18n_gettext('Dayak'));
+INSERT INTO config.language_map (code, value) VALUES ('del', oils_i18n_gettext('Delaware'));
+INSERT INTO config.language_map (code, value) VALUES ('den', oils_i18n_gettext('Slave'));
+INSERT INTO config.language_map (code, value) VALUES ('dgr', oils_i18n_gettext('Dogrib'));
+INSERT INTO config.language_map (code, value) VALUES ('din', oils_i18n_gettext('Dinka'));
+INSERT INTO config.language_map (code, value) VALUES ('div', oils_i18n_gettext('Divehi'));
+INSERT INTO config.language_map (code, value) VALUES ('doi', oils_i18n_gettext('Dogri'));
+INSERT INTO config.language_map (code, value) VALUES ('dra', oils_i18n_gettext('Dravidian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('dua', oils_i18n_gettext('Duala'));
+INSERT INTO config.language_map (code, value) VALUES ('dum', oils_i18n_gettext('Dutch, Middle (ca. 1050-1350)'));
+INSERT INTO config.language_map (code, value) VALUES ('dut', oils_i18n_gettext('Dutch'));
+INSERT INTO config.language_map (code, value) VALUES ('dyu', oils_i18n_gettext('Dyula'));
+INSERT INTO config.language_map (code, value) VALUES ('dzo', oils_i18n_gettext('Dzongkha'));
+INSERT INTO config.language_map (code, value) VALUES ('efi', oils_i18n_gettext('Efik'));
+INSERT INTO config.language_map (code, value) VALUES ('egy', oils_i18n_gettext('Egyptian'));
+INSERT INTO config.language_map (code, value) VALUES ('eka', oils_i18n_gettext('Ekajuk'));
+INSERT INTO config.language_map (code, value) VALUES ('elx', oils_i18n_gettext('Elamite'));
+INSERT INTO config.language_map (code, value) VALUES ('eng', oils_i18n_gettext('English'));
+INSERT INTO config.language_map (code, value) VALUES ('enm', oils_i18n_gettext('English, Middle (1100-1500)'));
+INSERT INTO config.language_map (code, value) VALUES ('epo', oils_i18n_gettext('Esperanto'));
+INSERT INTO config.language_map (code, value) VALUES ('-esk', oils_i18n_gettext('Eskimo languages'));
+INSERT INTO config.language_map (code, value) VALUES ('-esp', oils_i18n_gettext('Esperanto'));
+INSERT INTO config.language_map (code, value) VALUES ('est', oils_i18n_gettext('Estonian'));
+INSERT INTO config.language_map (code, value) VALUES ('-eth', oils_i18n_gettext('Ethiopic'));
+INSERT INTO config.language_map (code, value) VALUES ('ewe', oils_i18n_gettext('Ewe'));
+INSERT INTO config.language_map (code, value) VALUES ('ewo', oils_i18n_gettext('Ewondo'));
+INSERT INTO config.language_map (code, value) VALUES ('fan', oils_i18n_gettext('Fang'));
+INSERT INTO config.language_map (code, value) VALUES ('fao', oils_i18n_gettext('Faroese'));
+INSERT INTO config.language_map (code, value) VALUES ('-far', oils_i18n_gettext('Faroese'));
+INSERT INTO config.language_map (code, value) VALUES ('fat', oils_i18n_gettext('Fanti'));
+INSERT INTO config.language_map (code, value) VALUES ('fij', oils_i18n_gettext('Fijian'));
+INSERT INTO config.language_map (code, value) VALUES ('fin', oils_i18n_gettext('Finnish'));
+INSERT INTO config.language_map (code, value) VALUES ('fiu', oils_i18n_gettext('Finno-Ugrian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('fon', oils_i18n_gettext('Fon'));
+INSERT INTO config.language_map (code, value) VALUES ('fre', oils_i18n_gettext('French'));
+INSERT INTO config.language_map (code, value) VALUES ('-fri', oils_i18n_gettext('Frisian'));
+INSERT INTO config.language_map (code, value) VALUES ('frm', oils_i18n_gettext('French, Middle (ca. 1400-1600)'));
+INSERT INTO config.language_map (code, value) VALUES ('fro', oils_i18n_gettext('French, Old (ca. 842-1400)'));
+INSERT INTO config.language_map (code, value) VALUES ('fry', oils_i18n_gettext('Frisian'));
+INSERT INTO config.language_map (code, value) VALUES ('ful', oils_i18n_gettext('Fula'));
+INSERT INTO config.language_map (code, value) VALUES ('fur', oils_i18n_gettext('Friulian'));
+INSERT INTO config.language_map (code, value) VALUES ('gaa', oils_i18n_gettext('Gã'));
+INSERT INTO config.language_map (code, value) VALUES ('-gae', oils_i18n_gettext('Scottish Gaelic'));
+INSERT INTO config.language_map (code, value) VALUES ('-gag', oils_i18n_gettext('Galician'));
+INSERT INTO config.language_map (code, value) VALUES ('-gal', oils_i18n_gettext('Oromo'));
+INSERT INTO config.language_map (code, value) VALUES ('gay', oils_i18n_gettext('Gayo'));
+INSERT INTO config.language_map (code, value) VALUES ('gba', oils_i18n_gettext('Gbaya'));
+INSERT INTO config.language_map (code, value) VALUES ('gem', oils_i18n_gettext('Germanic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('geo', oils_i18n_gettext('Georgian'));
+INSERT INTO config.language_map (code, value) VALUES ('ger', oils_i18n_gettext('German'));
+INSERT INTO config.language_map (code, value) VALUES ('gez', oils_i18n_gettext('Ethiopic'));
+INSERT INTO config.language_map (code, value) VALUES ('gil', oils_i18n_gettext('Gilbertese'));
+INSERT INTO config.language_map (code, value) VALUES ('gla', oils_i18n_gettext('Scottish Gaelic'));
+INSERT INTO config.language_map (code, value) VALUES ('gle', oils_i18n_gettext('Irish'));
+INSERT INTO config.language_map (code, value) VALUES ('glg', oils_i18n_gettext('Galician'));
+INSERT INTO config.language_map (code, value) VALUES ('glv', oils_i18n_gettext('Manx'));
+INSERT INTO config.language_map (code, value) VALUES ('gmh', oils_i18n_gettext('German, Middle High (ca. 1050-1500)'));
+INSERT INTO config.language_map (code, value) VALUES ('goh', oils_i18n_gettext('German, Old High (ca. 750-1050)'));
+INSERT INTO config.language_map (code, value) VALUES ('gon', oils_i18n_gettext('Gondi'));
+INSERT INTO config.language_map (code, value) VALUES ('gor', oils_i18n_gettext('Gorontalo'));
+INSERT INTO config.language_map (code, value) VALUES ('got', oils_i18n_gettext('Gothic'));
+INSERT INTO config.language_map (code, value) VALUES ('grb', oils_i18n_gettext('Grebo'));
+INSERT INTO config.language_map (code, value) VALUES ('grc', oils_i18n_gettext('Greek, Ancient (to 1453)'));
+INSERT INTO config.language_map (code, value) VALUES ('gre', oils_i18n_gettext('Greek, Modern (1453- )'));
+INSERT INTO config.language_map (code, value) VALUES ('grn', oils_i18n_gettext('Guarani'));
+INSERT INTO config.language_map (code, value) VALUES ('-gua', oils_i18n_gettext('Guarani'));
+INSERT INTO config.language_map (code, value) VALUES ('guj', oils_i18n_gettext('Gujarati'));
+INSERT INTO config.language_map (code, value) VALUES ('gwi', oils_i18n_gettext('Gwich''in'));
+INSERT INTO config.language_map (code, value) VALUES ('hai', oils_i18n_gettext('Haida'));
+INSERT INTO config.language_map (code, value) VALUES ('hat', oils_i18n_gettext('Haitian French Creole'));
+INSERT INTO config.language_map (code, value) VALUES ('hau', oils_i18n_gettext('Hausa'));
+INSERT INTO config.language_map (code, value) VALUES ('haw', oils_i18n_gettext('Hawaiian'));
+INSERT INTO config.language_map (code, value) VALUES ('heb', oils_i18n_gettext('Hebrew'));
+INSERT INTO config.language_map (code, value) VALUES ('her', oils_i18n_gettext('Herero'));
+INSERT INTO config.language_map (code, value) VALUES ('hil', oils_i18n_gettext('Hiligaynon'));
+INSERT INTO config.language_map (code, value) VALUES ('him', oils_i18n_gettext('Himachali'));
+INSERT INTO config.language_map (code, value) VALUES ('hin', oils_i18n_gettext('Hindi'));
+INSERT INTO config.language_map (code, value) VALUES ('hit', oils_i18n_gettext('Hittite'));
+INSERT INTO config.language_map (code, value) VALUES ('hmn', oils_i18n_gettext('Hmong'));
+INSERT INTO config.language_map (code, value) VALUES ('hmo', oils_i18n_gettext('Hiri Motu'));
+INSERT INTO config.language_map (code, value) VALUES ('hun', oils_i18n_gettext('Hungarian'));
+INSERT INTO config.language_map (code, value) VALUES ('hup', oils_i18n_gettext('Hupa'));
+INSERT INTO config.language_map (code, value) VALUES ('iba', oils_i18n_gettext('Iban'));
+INSERT INTO config.language_map (code, value) VALUES ('ibo', oils_i18n_gettext('Igbo'));
+INSERT INTO config.language_map (code, value) VALUES ('ice', oils_i18n_gettext('Icelandic'));
+INSERT INTO config.language_map (code, value) VALUES ('ido', oils_i18n_gettext('Ido'));
+INSERT INTO config.language_map (code, value) VALUES ('iii', oils_i18n_gettext('Sichuan Yi'));
+INSERT INTO config.language_map (code, value) VALUES ('ijo', oils_i18n_gettext('Ijo'));
+INSERT INTO config.language_map (code, value) VALUES ('iku', oils_i18n_gettext('Inuktitut'));
+INSERT INTO config.language_map (code, value) VALUES ('ile', oils_i18n_gettext('Interlingue'));
+INSERT INTO config.language_map (code, value) VALUES ('ilo', oils_i18n_gettext('Iloko'));
+INSERT INTO config.language_map (code, value) VALUES ('ina', oils_i18n_gettext('Interlingua (International Auxiliary Language Association)'));
+INSERT INTO config.language_map (code, value) VALUES ('inc', oils_i18n_gettext('Indic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('ind', oils_i18n_gettext('Indonesian'));
+INSERT INTO config.language_map (code, value) VALUES ('ine', oils_i18n_gettext('Indo-European (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('inh', oils_i18n_gettext('Ingush'));
+INSERT INTO config.language_map (code, value) VALUES ('-int', oils_i18n_gettext('Interlingua (International Auxiliary Language Association)'));
+INSERT INTO config.language_map (code, value) VALUES ('ipk', oils_i18n_gettext('Inupiaq'));
+INSERT INTO config.language_map (code, value) VALUES ('ira', oils_i18n_gettext('Iranian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('-iri', oils_i18n_gettext('Irish'));
+INSERT INTO config.language_map (code, value) VALUES ('iro', oils_i18n_gettext('Iroquoian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('ita', oils_i18n_gettext('Italian'));
+INSERT INTO config.language_map (code, value) VALUES ('jav', oils_i18n_gettext('Javanese'));
+INSERT INTO config.language_map (code, value) VALUES ('jpn', oils_i18n_gettext('Japanese'));
+INSERT INTO config.language_map (code, value) VALUES ('jpr', oils_i18n_gettext('Judeo-Persian'));
+INSERT INTO config.language_map (code, value) VALUES ('jrb', oils_i18n_gettext('Judeo-Arabic'));
+INSERT INTO config.language_map (code, value) VALUES ('kaa', oils_i18n_gettext('Kara-Kalpak'));
+INSERT INTO config.language_map (code, value) VALUES ('kab', oils_i18n_gettext('Kabyle'));
+INSERT INTO config.language_map (code, value) VALUES ('kac', oils_i18n_gettext('Kachin'));
+INSERT INTO config.language_map (code, value) VALUES ('kal', oils_i18n_gettext('Kalâtdlisut'));
+INSERT INTO config.language_map (code, value) VALUES ('kam', oils_i18n_gettext('Kamba'));
+INSERT INTO config.language_map (code, value) VALUES ('kan', oils_i18n_gettext('Kannada'));
+INSERT INTO config.language_map (code, value) VALUES ('kar', oils_i18n_gettext('Karen'));
+INSERT INTO config.language_map (code, value) VALUES ('kas', oils_i18n_gettext('Kashmiri'));
+INSERT INTO config.language_map (code, value) VALUES ('kau', oils_i18n_gettext('Kanuri'));
+INSERT INTO config.language_map (code, value) VALUES ('kaw', oils_i18n_gettext('Kawi'));
+INSERT INTO config.language_map (code, value) VALUES ('kaz', oils_i18n_gettext('Kazakh'));
+INSERT INTO config.language_map (code, value) VALUES ('kbd', oils_i18n_gettext('Kabardian'));
+INSERT INTO config.language_map (code, value) VALUES ('kha', oils_i18n_gettext('Khasi'));
+INSERT INTO config.language_map (code, value) VALUES ('khi', oils_i18n_gettext('Khoisan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('khm', oils_i18n_gettext('Khmer'));
+INSERT INTO config.language_map (code, value) VALUES ('kho', oils_i18n_gettext('Khotanese'));
+INSERT INTO config.language_map (code, value) VALUES ('kik', oils_i18n_gettext('Kikuyu'));
+INSERT INTO config.language_map (code, value) VALUES ('kin', oils_i18n_gettext('Kinyarwanda'));
+INSERT INTO config.language_map (code, value) VALUES ('kir', oils_i18n_gettext('Kyrgyz'));
+INSERT INTO config.language_map (code, value) VALUES ('kmb', oils_i18n_gettext('Kimbundu'));
+INSERT INTO config.language_map (code, value) VALUES ('kok', oils_i18n_gettext('Konkani'));
+INSERT INTO config.language_map (code, value) VALUES ('kom', oils_i18n_gettext('Komi'));
+INSERT INTO config.language_map (code, value) VALUES ('kon', oils_i18n_gettext('Kongo'));
+INSERT INTO config.language_map (code, value) VALUES ('kor', oils_i18n_gettext('Korean'));
+INSERT INTO config.language_map (code, value) VALUES ('kos', oils_i18n_gettext('Kusaie'));
+INSERT INTO config.language_map (code, value) VALUES ('kpe', oils_i18n_gettext('Kpelle'));
+INSERT INTO config.language_map (code, value) VALUES ('kro', oils_i18n_gettext('Kru'));
+INSERT INTO config.language_map (code, value) VALUES ('kru', oils_i18n_gettext('Kurukh'));
+INSERT INTO config.language_map (code, value) VALUES ('kua', oils_i18n_gettext('Kuanyama'));
+INSERT INTO config.language_map (code, value) VALUES ('kum', oils_i18n_gettext('Kumyk'));
+INSERT INTO config.language_map (code, value) VALUES ('kur', oils_i18n_gettext('Kurdish'));
+INSERT INTO config.language_map (code, value) VALUES ('-kus', oils_i18n_gettext('Kusaie'));
+INSERT INTO config.language_map (code, value) VALUES ('kut', oils_i18n_gettext('Kutenai'));
+INSERT INTO config.language_map (code, value) VALUES ('lad', oils_i18n_gettext('Ladino'));
+INSERT INTO config.language_map (code, value) VALUES ('lah', oils_i18n_gettext('Lahnda'));
+INSERT INTO config.language_map (code, value) VALUES ('lam', oils_i18n_gettext('Lamba'));
+INSERT INTO config.language_map (code, value) VALUES ('-lan', oils_i18n_gettext('Occitan (post-1500)'));
+INSERT INTO config.language_map (code, value) VALUES ('lao', oils_i18n_gettext('Lao'));
+INSERT INTO config.language_map (code, value) VALUES ('-lap', oils_i18n_gettext('Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('lat', oils_i18n_gettext('Latin'));
+INSERT INTO config.language_map (code, value) VALUES ('lav', oils_i18n_gettext('Latvian'));
+INSERT INTO config.language_map (code, value) VALUES ('lez', oils_i18n_gettext('Lezgian'));
+INSERT INTO config.language_map (code, value) VALUES ('lim', oils_i18n_gettext('Limburgish'));
+INSERT INTO config.language_map (code, value) VALUES ('lin', oils_i18n_gettext('Lingala'));
+INSERT INTO config.language_map (code, value) VALUES ('lit', oils_i18n_gettext('Lithuanian'));
+INSERT INTO config.language_map (code, value) VALUES ('lol', oils_i18n_gettext('Mongo-Nkundu'));
+INSERT INTO config.language_map (code, value) VALUES ('loz', oils_i18n_gettext('Lozi'));
+INSERT INTO config.language_map (code, value) VALUES ('ltz', oils_i18n_gettext('Letzeburgesch'));
+INSERT INTO config.language_map (code, value) VALUES ('lua', oils_i18n_gettext('Luba-Lulua'));
+INSERT INTO config.language_map (code, value) VALUES ('lub', oils_i18n_gettext('Luba-Katanga'));
+INSERT INTO config.language_map (code, value) VALUES ('lug', oils_i18n_gettext('Ganda'));
+INSERT INTO config.language_map (code, value) VALUES ('lui', oils_i18n_gettext('Luiseño'));
+INSERT INTO config.language_map (code, value) VALUES ('lun', oils_i18n_gettext('Lunda'));
+INSERT INTO config.language_map (code, value) VALUES ('luo', oils_i18n_gettext('Luo (Kenya and Tanzania)'));
+INSERT INTO config.language_map (code, value) VALUES ('lus', oils_i18n_gettext('Lushai'));
+INSERT INTO config.language_map (code, value) VALUES ('mac', oils_i18n_gettext('Macedonian'));
+INSERT INTO config.language_map (code, value) VALUES ('mad', oils_i18n_gettext('Madurese'));
+INSERT INTO config.language_map (code, value) VALUES ('mag', oils_i18n_gettext('Magahi'));
+INSERT INTO config.language_map (code, value) VALUES ('mah', oils_i18n_gettext('Marshallese'));
+INSERT INTO config.language_map (code, value) VALUES ('mai', oils_i18n_gettext('Maithili'));
+INSERT INTO config.language_map (code, value) VALUES ('mak', oils_i18n_gettext('Makasar'));
+INSERT INTO config.language_map (code, value) VALUES ('mal', oils_i18n_gettext('Malayalam'));
+INSERT INTO config.language_map (code, value) VALUES ('man', oils_i18n_gettext('Mandingo'));
+INSERT INTO config.language_map (code, value) VALUES ('mao', oils_i18n_gettext('Maori'));
+INSERT INTO config.language_map (code, value) VALUES ('map', oils_i18n_gettext('Austronesian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('mar', oils_i18n_gettext('Marathi'));
+INSERT INTO config.language_map (code, value) VALUES ('mas', oils_i18n_gettext('Masai'));
+INSERT INTO config.language_map (code, value) VALUES ('-max', oils_i18n_gettext('Manx'));
+INSERT INTO config.language_map (code, value) VALUES ('may', oils_i18n_gettext('Malay'));
+INSERT INTO config.language_map (code, value) VALUES ('mdr', oils_i18n_gettext('Mandar'));
+INSERT INTO config.language_map (code, value) VALUES ('men', oils_i18n_gettext('Mende'));
+INSERT INTO config.language_map (code, value) VALUES ('mga', oils_i18n_gettext('Irish, Middle (ca. 1100-1550)'));
+INSERT INTO config.language_map (code, value) VALUES ('mic', oils_i18n_gettext('Micmac'));
+INSERT INTO config.language_map (code, value) VALUES ('min', oils_i18n_gettext('Minangkabau'));
+INSERT INTO config.language_map (code, value) VALUES ('mis', oils_i18n_gettext('Miscellaneous languages'));
+INSERT INTO config.language_map (code, value) VALUES ('mkh', oils_i18n_gettext('Mon-Khmer (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('-mla', oils_i18n_gettext('Malagasy'));
+INSERT INTO config.language_map (code, value) VALUES ('mlg', oils_i18n_gettext('Malagasy'));
+INSERT INTO config.language_map (code, value) VALUES ('mlt', oils_i18n_gettext('Maltese'));
+INSERT INTO config.language_map (code, value) VALUES ('mnc', oils_i18n_gettext('Manchu'));
+INSERT INTO config.language_map (code, value) VALUES ('mni', oils_i18n_gettext('Manipuri'));
+INSERT INTO config.language_map (code, value) VALUES ('mno', oils_i18n_gettext('Manobo languages'));
+INSERT INTO config.language_map (code, value) VALUES ('moh', oils_i18n_gettext('Mohawk'));
+INSERT INTO config.language_map (code, value) VALUES ('mol', oils_i18n_gettext('Moldavian'));
+INSERT INTO config.language_map (code, value) VALUES ('mon', oils_i18n_gettext('Mongolian'));
+INSERT INTO config.language_map (code, value) VALUES ('mos', oils_i18n_gettext('Mooré'));
+INSERT INTO config.language_map (code, value) VALUES ('mul', oils_i18n_gettext('Multiple languages'));
+INSERT INTO config.language_map (code, value) VALUES ('mun', oils_i18n_gettext('Munda (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('mus', oils_i18n_gettext('Creek'));
+INSERT INTO config.language_map (code, value) VALUES ('mwr', oils_i18n_gettext('Marwari'));
+INSERT INTO config.language_map (code, value) VALUES ('myn', oils_i18n_gettext('Mayan languages'));
+INSERT INTO config.language_map (code, value) VALUES ('nah', oils_i18n_gettext('Nahuatl'));
+INSERT INTO config.language_map (code, value) VALUES ('nai', oils_i18n_gettext('North American Indian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('nap', oils_i18n_gettext('Neapolitan Italian'));
+INSERT INTO config.language_map (code, value) VALUES ('nau', oils_i18n_gettext('Nauru'));
+INSERT INTO config.language_map (code, value) VALUES ('nav', oils_i18n_gettext('Navajo'));
+INSERT INTO config.language_map (code, value) VALUES ('nbl', oils_i18n_gettext('Ndebele (South Africa)'));
+INSERT INTO config.language_map (code, value) VALUES ('nde', oils_i18n_gettext('Ndebele (Zimbabwe)  '));
+INSERT INTO config.language_map (code, value) VALUES ('ndo', oils_i18n_gettext('Ndonga'));
+INSERT INTO config.language_map (code, value) VALUES ('nds', oils_i18n_gettext('Low German'));
+INSERT INTO config.language_map (code, value) VALUES ('nep', oils_i18n_gettext('Nepali'));
+INSERT INTO config.language_map (code, value) VALUES ('new', oils_i18n_gettext('Newari'));
+INSERT INTO config.language_map (code, value) VALUES ('nia', oils_i18n_gettext('Nias'));
+INSERT INTO config.language_map (code, value) VALUES ('nic', oils_i18n_gettext('Niger-Kordofanian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('niu', oils_i18n_gettext('Niuean'));
+INSERT INTO config.language_map (code, value) VALUES ('nno', oils_i18n_gettext('Norwegian (Nynorsk)'));
+INSERT INTO config.language_map (code, value) VALUES ('nob', oils_i18n_gettext('Norwegian (Bokmål)'));
+INSERT INTO config.language_map (code, value) VALUES ('nog', oils_i18n_gettext('Nogai'));
+INSERT INTO config.language_map (code, value) VALUES ('non', oils_i18n_gettext('Old Norse'));
+INSERT INTO config.language_map (code, value) VALUES ('nor', oils_i18n_gettext('Norwegian'));
+INSERT INTO config.language_map (code, value) VALUES ('nso', oils_i18n_gettext('Northern Sotho'));
+INSERT INTO config.language_map (code, value) VALUES ('nub', oils_i18n_gettext('Nubian languages'));
+INSERT INTO config.language_map (code, value) VALUES ('nya', oils_i18n_gettext('Nyanja'));
+INSERT INTO config.language_map (code, value) VALUES ('nym', oils_i18n_gettext('Nyamwezi'));
+INSERT INTO config.language_map (code, value) VALUES ('nyn', oils_i18n_gettext('Nyankole'));
+INSERT INTO config.language_map (code, value) VALUES ('nyo', oils_i18n_gettext('Nyoro'));
+INSERT INTO config.language_map (code, value) VALUES ('nzi', oils_i18n_gettext('Nzima'));
+INSERT INTO config.language_map (code, value) VALUES ('oci', oils_i18n_gettext('Occitan (post-1500)'));
+INSERT INTO config.language_map (code, value) VALUES ('oji', oils_i18n_gettext('Ojibwa'));
+INSERT INTO config.language_map (code, value) VALUES ('ori', oils_i18n_gettext('Oriya'));
+INSERT INTO config.language_map (code, value) VALUES ('orm', oils_i18n_gettext('Oromo'));
+INSERT INTO config.language_map (code, value) VALUES ('osa', oils_i18n_gettext('Osage'));
+INSERT INTO config.language_map (code, value) VALUES ('oss', oils_i18n_gettext('Ossetic'));
+INSERT INTO config.language_map (code, value) VALUES ('ota', oils_i18n_gettext('Turkish, Ottoman'));
+INSERT INTO config.language_map (code, value) VALUES ('oto', oils_i18n_gettext('Otomian languages'));
+INSERT INTO config.language_map (code, value) VALUES ('paa', oils_i18n_gettext('Papuan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('pag', oils_i18n_gettext('Pangasinan'));
+INSERT INTO config.language_map (code, value) VALUES ('pal', oils_i18n_gettext('Pahlavi'));
+INSERT INTO config.language_map (code, value) VALUES ('pam', oils_i18n_gettext('Pampanga'));
+INSERT INTO config.language_map (code, value) VALUES ('pan', oils_i18n_gettext('Panjabi'));
+INSERT INTO config.language_map (code, value) VALUES ('pap', oils_i18n_gettext('Papiamento'));
+INSERT INTO config.language_map (code, value) VALUES ('pau', oils_i18n_gettext('Palauan'));
+INSERT INTO config.language_map (code, value) VALUES ('peo', oils_i18n_gettext('Old Persian (ca. 600-400 B.C.)'));
+INSERT INTO config.language_map (code, value) VALUES ('per', oils_i18n_gettext('Persian'));
+INSERT INTO config.language_map (code, value) VALUES ('phi', oils_i18n_gettext('Philippine (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('phn', oils_i18n_gettext('Phoenician'));
+INSERT INTO config.language_map (code, value) VALUES ('pli', oils_i18n_gettext('Pali'));
+INSERT INTO config.language_map (code, value) VALUES ('pol', oils_i18n_gettext('Polish'));
+INSERT INTO config.language_map (code, value) VALUES ('pon', oils_i18n_gettext('Ponape'));
+INSERT INTO config.language_map (code, value) VALUES ('por', oils_i18n_gettext('Portuguese'));
+INSERT INTO config.language_map (code, value) VALUES ('pra', oils_i18n_gettext('Prakrit languages'));
+INSERT INTO config.language_map (code, value) VALUES ('pro', oils_i18n_gettext('Provençal (to 1500)'));
+INSERT INTO config.language_map (code, value) VALUES ('pus', oils_i18n_gettext('Pushto'));
+INSERT INTO config.language_map (code, value) VALUES ('que', oils_i18n_gettext('Quechua'));
+INSERT INTO config.language_map (code, value) VALUES ('raj', oils_i18n_gettext('Rajasthani'));
+INSERT INTO config.language_map (code, value) VALUES ('rap', oils_i18n_gettext('Rapanui'));
+INSERT INTO config.language_map (code, value) VALUES ('rar', oils_i18n_gettext('Rarotongan'));
+INSERT INTO config.language_map (code, value) VALUES ('roa', oils_i18n_gettext('Romance (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('roh', oils_i18n_gettext('Raeto-Romance'));
+INSERT INTO config.language_map (code, value) VALUES ('rom', oils_i18n_gettext('Romani'));
+INSERT INTO config.language_map (code, value) VALUES ('rum', oils_i18n_gettext('Romanian'));
+INSERT INTO config.language_map (code, value) VALUES ('run', oils_i18n_gettext('Rundi'));
+INSERT INTO config.language_map (code, value) VALUES ('rus', oils_i18n_gettext('Russian'));
+INSERT INTO config.language_map (code, value) VALUES ('sad', oils_i18n_gettext('Sandawe'));
+INSERT INTO config.language_map (code, value) VALUES ('sag', oils_i18n_gettext('Sango (Ubangi Creole)'));
+INSERT INTO config.language_map (code, value) VALUES ('sah', oils_i18n_gettext('Yakut'));
+INSERT INTO config.language_map (code, value) VALUES ('sai', oils_i18n_gettext('South American Indian (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('sal', oils_i18n_gettext('Salishan languages'));
+INSERT INTO config.language_map (code, value) VALUES ('sam', oils_i18n_gettext('Samaritan Aramaic'));
+INSERT INTO config.language_map (code, value) VALUES ('san', oils_i18n_gettext('Sanskrit'));
+INSERT INTO config.language_map (code, value) VALUES ('-sao', oils_i18n_gettext('Samoan'));
+INSERT INTO config.language_map (code, value) VALUES ('sas', oils_i18n_gettext('Sasak'));
+INSERT INTO config.language_map (code, value) VALUES ('sat', oils_i18n_gettext('Santali'));
+INSERT INTO config.language_map (code, value) VALUES ('scc', oils_i18n_gettext('Serbian'));
+INSERT INTO config.language_map (code, value) VALUES ('sco', oils_i18n_gettext('Scots'));
+INSERT INTO config.language_map (code, value) VALUES ('scr', oils_i18n_gettext('Croatian'));
+INSERT INTO config.language_map (code, value) VALUES ('sel', oils_i18n_gettext('Selkup'));
+INSERT INTO config.language_map (code, value) VALUES ('sem', oils_i18n_gettext('Semitic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('sga', oils_i18n_gettext('Irish, Old (to 1100)'));
+INSERT INTO config.language_map (code, value) VALUES ('sgn', oils_i18n_gettext('Sign languages'));
+INSERT INTO config.language_map (code, value) VALUES ('shn', oils_i18n_gettext('Shan'));
+INSERT INTO config.language_map (code, value) VALUES ('-sho', oils_i18n_gettext('Shona'));
+INSERT INTO config.language_map (code, value) VALUES ('sid', oils_i18n_gettext('Sidamo'));
+INSERT INTO config.language_map (code, value) VALUES ('sin', oils_i18n_gettext('Sinhalese'));
+INSERT INTO config.language_map (code, value) VALUES ('sio', oils_i18n_gettext('Siouan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('sit', oils_i18n_gettext('Sino-Tibetan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('sla', oils_i18n_gettext('Slavic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('slo', oils_i18n_gettext('Slovak'));
+INSERT INTO config.language_map (code, value) VALUES ('slv', oils_i18n_gettext('Slovenian'));
+INSERT INTO config.language_map (code, value) VALUES ('sma', oils_i18n_gettext('Southern Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('sme', oils_i18n_gettext('Northern Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('smi', oils_i18n_gettext('Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('smj', oils_i18n_gettext('Lule Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('smn', oils_i18n_gettext('Inari Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('smo', oils_i18n_gettext('Samoan'));
+INSERT INTO config.language_map (code, value) VALUES ('sms', oils_i18n_gettext('Skolt Sami'));
+INSERT INTO config.language_map (code, value) VALUES ('sna', oils_i18n_gettext('Shona'));
+INSERT INTO config.language_map (code, value) VALUES ('snd', oils_i18n_gettext('Sindhi'));
+INSERT INTO config.language_map (code, value) VALUES ('-snh', oils_i18n_gettext('Sinhalese'));
+INSERT INTO config.language_map (code, value) VALUES ('snk', oils_i18n_gettext('Soninke'));
+INSERT INTO config.language_map (code, value) VALUES ('sog', oils_i18n_gettext('Sogdian'));
+INSERT INTO config.language_map (code, value) VALUES ('som', oils_i18n_gettext('Somali'));
+INSERT INTO config.language_map (code, value) VALUES ('son', oils_i18n_gettext('Songhai'));
+INSERT INTO config.language_map (code, value) VALUES ('sot', oils_i18n_gettext('Sotho'));
+INSERT INTO config.language_map (code, value) VALUES ('spa', oils_i18n_gettext('Spanish'));
+INSERT INTO config.language_map (code, value) VALUES ('srd', oils_i18n_gettext('Sardinian'));
+INSERT INTO config.language_map (code, value) VALUES ('srr', oils_i18n_gettext('Serer'));
+INSERT INTO config.language_map (code, value) VALUES ('ssa', oils_i18n_gettext('Nilo-Saharan (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('-sso', oils_i18n_gettext('Sotho'));
+INSERT INTO config.language_map (code, value) VALUES ('ssw', oils_i18n_gettext('Swazi'));
+INSERT INTO config.language_map (code, value) VALUES ('suk', oils_i18n_gettext('Sukuma'));
+INSERT INTO config.language_map (code, value) VALUES ('sun', oils_i18n_gettext('Sundanese'));
+INSERT INTO config.language_map (code, value) VALUES ('sus', oils_i18n_gettext('Susu'));
+INSERT INTO config.language_map (code, value) VALUES ('sux', oils_i18n_gettext('Sumerian'));
+INSERT INTO config.language_map (code, value) VALUES ('swa', oils_i18n_gettext('Swahili'));
+INSERT INTO config.language_map (code, value) VALUES ('swe', oils_i18n_gettext('Swedish'));
+INSERT INTO config.language_map (code, value) VALUES ('-swz', oils_i18n_gettext('Swazi'));
+INSERT INTO config.language_map (code, value) VALUES ('syr', oils_i18n_gettext('Syriac'));
+INSERT INTO config.language_map (code, value) VALUES ('-tag', oils_i18n_gettext('Tagalog'));
+INSERT INTO config.language_map (code, value) VALUES ('tah', oils_i18n_gettext('Tahitian'));
+INSERT INTO config.language_map (code, value) VALUES ('tai', oils_i18n_gettext('Tai (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('-taj', oils_i18n_gettext('Tajik'));
+INSERT INTO config.language_map (code, value) VALUES ('tam', oils_i18n_gettext('Tamil'));
+INSERT INTO config.language_map (code, value) VALUES ('-tar', oils_i18n_gettext('Tatar'));
+INSERT INTO config.language_map (code, value) VALUES ('tat', oils_i18n_gettext('Tatar'));
+INSERT INTO config.language_map (code, value) VALUES ('tel', oils_i18n_gettext('Telugu'));
+INSERT INTO config.language_map (code, value) VALUES ('tem', oils_i18n_gettext('Temne'));
+INSERT INTO config.language_map (code, value) VALUES ('ter', oils_i18n_gettext('Terena'));
+INSERT INTO config.language_map (code, value) VALUES ('tet', oils_i18n_gettext('Tetum'));
+INSERT INTO config.language_map (code, value) VALUES ('tgk', oils_i18n_gettext('Tajik'));
+INSERT INTO config.language_map (code, value) VALUES ('tgl', oils_i18n_gettext('Tagalog'));
+INSERT INTO config.language_map (code, value) VALUES ('tha', oils_i18n_gettext('Thai'));
+INSERT INTO config.language_map (code, value) VALUES ('tib', oils_i18n_gettext('Tibetan'));
+INSERT INTO config.language_map (code, value) VALUES ('tig', oils_i18n_gettext('Tigré'));
+INSERT INTO config.language_map (code, value) VALUES ('tir', oils_i18n_gettext('Tigrinya'));
+INSERT INTO config.language_map (code, value) VALUES ('tiv', oils_i18n_gettext('Tiv'));
+INSERT INTO config.language_map (code, value) VALUES ('tkl', oils_i18n_gettext('Tokelauan'));
+INSERT INTO config.language_map (code, value) VALUES ('tli', oils_i18n_gettext('Tlingit'));
+INSERT INTO config.language_map (code, value) VALUES ('tmh', oils_i18n_gettext('Tamashek'));
+INSERT INTO config.language_map (code, value) VALUES ('tog', oils_i18n_gettext('Tonga (Nyasa)'));
+INSERT INTO config.language_map (code, value) VALUES ('ton', oils_i18n_gettext('Tongan'));
+INSERT INTO config.language_map (code, value) VALUES ('tpi', oils_i18n_gettext('Tok Pisin'));
+INSERT INTO config.language_map (code, value) VALUES ('-tru', oils_i18n_gettext('Truk'));
+INSERT INTO config.language_map (code, value) VALUES ('tsi', oils_i18n_gettext('Tsimshian'));
+INSERT INTO config.language_map (code, value) VALUES ('tsn', oils_i18n_gettext('Tswana'));
+INSERT INTO config.language_map (code, value) VALUES ('tso', oils_i18n_gettext('Tsonga'));
+INSERT INTO config.language_map (code, value) VALUES ('-tsw', oils_i18n_gettext('Tswana'));
+INSERT INTO config.language_map (code, value) VALUES ('tuk', oils_i18n_gettext('Turkmen'));
+INSERT INTO config.language_map (code, value) VALUES ('tum', oils_i18n_gettext('Tumbuka'));
+INSERT INTO config.language_map (code, value) VALUES ('tup', oils_i18n_gettext('Tupi languages'));
+INSERT INTO config.language_map (code, value) VALUES ('tur', oils_i18n_gettext('Turkish'));
+INSERT INTO config.language_map (code, value) VALUES ('tut', oils_i18n_gettext('Altaic (Other)'));
+INSERT INTO config.language_map (code, value) VALUES ('tvl', oils_i18n_gettext('Tuvaluan'));
+INSERT INTO config.language_map (code, value) VALUES ('twi', oils_i18n_gettext('Twi'));
+INSERT INTO config.language_map (code, value) VALUES ('tyv', oils_i18n_gettext('Tuvinian'));
+INSERT INTO config.language_map (code, value) VALUES ('udm', oils_i18n_gettext('Udmurt'));
+INSERT INTO config.language_map (code, value) VALUES ('uga', oils_i18n_gettext('Ugaritic'));
+INSERT INTO config.language_map (code, value) VALUES ('uig', oils_i18n_gettext('Uighur'));
+INSERT INTO config.language_map (code, value) VALUES ('ukr', oils_i18n_gettext('Ukrainian'));
+INSERT INTO config.language_map (code, value) VALUES ('umb', oils_i18n_gettext('Umbundu'));
+INSERT INTO config.language_map (code, value) VALUES ('und', oils_i18n_gettext('Undetermined'));
+INSERT INTO config.language_map (code, value) VALUES ('urd', oils_i18n_gettext('Urdu'));
+INSERT INTO config.language_map (code, value) VALUES ('uzb', oils_i18n_gettext('Uzbek'));
+INSERT INTO config.language_map (code, value) VALUES ('vai', oils_i18n_gettext('Vai'));
+INSERT INTO config.language_map (code, value) VALUES ('ven', oils_i18n_gettext('Venda'));
+INSERT INTO config.language_map (code, value) VALUES ('vie', oils_i18n_gettext('Vietnamese'));
+INSERT INTO config.language_map (code, value) VALUES ('vol', oils_i18n_gettext('Volapük'));
+INSERT INTO config.language_map (code, value) VALUES ('vot', oils_i18n_gettext('Votic'));
+INSERT INTO config.language_map (code, value) VALUES ('wak', oils_i18n_gettext('Wakashan languages'));
+INSERT INTO config.language_map (code, value) VALUES ('wal', oils_i18n_gettext('Walamo'));
+INSERT INTO config.language_map (code, value) VALUES ('war', oils_i18n_gettext('Waray'));
+INSERT INTO config.language_map (code, value) VALUES ('was', oils_i18n_gettext('Washo'));
+INSERT INTO config.language_map (code, value) VALUES ('wel', oils_i18n_gettext('Welsh'));
+INSERT INTO config.language_map (code, value) VALUES ('wen', oils_i18n_gettext('Sorbian languages'));
+INSERT INTO config.language_map (code, value) VALUES ('wln', oils_i18n_gettext('Walloon'));
+INSERT INTO config.language_map (code, value) VALUES ('wol', oils_i18n_gettext('Wolof'));
+INSERT INTO config.language_map (code, value) VALUES ('xal', oils_i18n_gettext('Kalmyk'));
+INSERT INTO config.language_map (code, value) VALUES ('xho', oils_i18n_gettext('Xhosa'));
+INSERT INTO config.language_map (code, value) VALUES ('yao', oils_i18n_gettext('Yao (Africa)'));
+INSERT INTO config.language_map (code, value) VALUES ('yap', oils_i18n_gettext('Yapese'));
+INSERT INTO config.language_map (code, value) VALUES ('yid', oils_i18n_gettext('Yiddish'));
+INSERT INTO config.language_map (code, value) VALUES ('yor', oils_i18n_gettext('Yoruba'));
+INSERT INTO config.language_map (code, value) VALUES ('ypk', oils_i18n_gettext('Yupik languages'));
+INSERT INTO config.language_map (code, value) VALUES ('zap', oils_i18n_gettext('Zapotec'));
+INSERT INTO config.language_map (code, value) VALUES ('zen', oils_i18n_gettext('Zenaga'));
+INSERT INTO config.language_map (code, value) VALUES ('zha', oils_i18n_gettext('Zhuang'));
+INSERT INTO config.language_map (code, value) VALUES ('znd', oils_i18n_gettext('Zande'));
+INSERT INTO config.language_map (code, value) VALUES ('zul', oils_i18n_gettext('Zulu'));
+INSERT INTO config.language_map (code, value) VALUES ('zun', oils_i18n_gettext('Zuni'));
+
+INSERT INTO config.item_form_map (code, value) VALUES ('a', oils_i18n_gettext('Microfilm'));
+INSERT INTO config.item_form_map (code, value) VALUES ('b', oils_i18n_gettext('Microfiche'));
+INSERT INTO config.item_form_map (code, value) VALUES ('c', oils_i18n_gettext('Microopaque'));
+INSERT INTO config.item_form_map (code, value) VALUES ('d', oils_i18n_gettext('Large print'));
+INSERT INTO config.item_form_map (code, value) VALUES ('f', oils_i18n_gettext('Braille'));
+INSERT INTO config.item_form_map (code, value) VALUES ('r', oils_i18n_gettext('Regular print reproduction'));
+INSERT INTO config.item_form_map (code, value) VALUES ('s', oils_i18n_gettext('Electronic'));
+
+INSERT INTO config.item_type_map (code, value) VALUES ('a', oils_i18n_gettext('Language material'));
+INSERT INTO config.item_type_map (code, value) VALUES ('t', oils_i18n_gettext('Manuscript language material'));
+INSERT INTO config.item_type_map (code, value) VALUES ('g', oils_i18n_gettext('Projected medium'));
+INSERT INTO config.item_type_map (code, value) VALUES ('k', oils_i18n_gettext('Two-dimensional nonprojectable graphic'));
+INSERT INTO config.item_type_map (code, value) VALUES ('r', oils_i18n_gettext('Three-dimensional artifact or naturally occurring object'));
+INSERT INTO config.item_type_map (code, value) VALUES ('o', oils_i18n_gettext('Kit'));
+INSERT INTO config.item_type_map (code, value) VALUES ('p', oils_i18n_gettext('Mixed materials'));
+INSERT INTO config.item_type_map (code, value) VALUES ('e', oils_i18n_gettext('Cartographic material'));
+INSERT INTO config.item_type_map (code, value) VALUES ('f', oils_i18n_gettext('Manuscript cartographic material'));
+INSERT INTO config.item_type_map (code, value) VALUES ('c', oils_i18n_gettext('Notated music'));
+INSERT INTO config.item_type_map (code, value) VALUES ('d', oils_i18n_gettext('Manuscript notated music'));
+INSERT INTO config.item_type_map (code, value) VALUES ('i', oils_i18n_gettext('Nonmusical sound recording'));
+INSERT INTO config.item_type_map (code, value) VALUES ('j', oils_i18n_gettext('Musical sound recording'));
+INSERT INTO config.item_type_map (code, value) VALUES ('m', oils_i18n_gettext('Computer file'));
+
+INSERT INTO config.bib_level_map (code, value) VALUES ('a', oils_i18n_gettext('Monographic component part'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('b', oils_i18n_gettext('Serial component part'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('c', oils_i18n_gettext('Collection'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('d', oils_i18n_gettext('Subunit'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('i', oils_i18n_gettext('Integrating resource'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('m', oils_i18n_gettext('Monograph/Item'));
+INSERT INTO config.bib_level_map (code, value) VALUES ('s', oils_i18n_gettext('Serial'));
 
 --005.schema.actors.sql:
 
 -- The PINES levels
 INSERT INTO actor.org_unit_type (name, opac_label, depth, parent, can_have_users, can_have_vols) VALUES 
-    ( oils_i18n_gettext('Consortium'),oils_i18n_gettext('Everywhere'), 0, NULL, FALSE, FALSE ),
+    ( oils_i18n_gettext('Consortium'),oils_i18n_gettext('Everywhere'), 0, NULL, FALSE, FALSE );
+INSERT INTO actor.org_unit_type (name, opac_label, depth, parent, can_have_users, can_have_vols) VALUES 
     ( oils_i18n_gettext('System'),oils_i18n_gettext('Local Library System'), 1, 1, FALSE, FALSE );
 INSERT INTO actor.org_unit_type (name, opac_label, depth, parent) VALUES 
-    ( oils_i18n_gettext('Branch'),oils_i18n_gettext('This Branch'), 2, 2 ),
-    ( oils_i18n_gettext('Sub-lib'),oils_i18n_gettext('This Specialized Library'), 3, 3 ),
+    ( oils_i18n_gettext('Branch'),oils_i18n_gettext('This Branch'), 2, 2 );
+INSERT INTO actor.org_unit_type (name, opac_label, depth, parent) VALUES 
+    ( oils_i18n_gettext('Sub-lib'),oils_i18n_gettext('This Specialized Library'), 3, 3 );
+INSERT INTO actor.org_unit_type (name, opac_label, depth, parent) VALUES 
     ( oils_i18n_gettext('Bookmobile'),oils_i18n_gettext('Your Bookmobile'), 3, 3 );
 
 INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
-    (NULL, 1, 'CONS', oils_i18n_gettext('Example Consortium')),
-    (1, 2, 'SYS1', oils_i18n_gettext('Example System 1')),
-    (1, 2, 'SYS2', oils_i18n_gettext('Example System 2')),
-    (2, 3, 'BR1', oils_i18n_gettext('Example Branch 1')),
-    (2, 3, 'BR2', oils_i18n_gettext('Example Branch 2')),
-    (3, 3, 'BR3', oils_i18n_gettext('Example Branch 3')),
-    (3, 3, 'BR4', oils_i18n_gettext('Example Branch 4')),
-    (4, 4, 'SL1', oils_i18n_gettext('Example Sub-lib 1')),
+    (NULL, 1, 'CONS', oils_i18n_gettext('Example Consortium'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (1, 2, 'SYS1', oils_i18n_gettext('Example System 1'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (1, 2, 'SYS2', oils_i18n_gettext('Example System 2'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (2, 3, 'BR1', oils_i18n_gettext('Example Branch 1'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (2, 3, 'BR2', oils_i18n_gettext('Example Branch 2'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (3, 3, 'BR3', oils_i18n_gettext('Example Branch 3'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (3, 3, 'BR4', oils_i18n_gettext('Example Branch 4'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
+    (4, 4, 'SL1', oils_i18n_gettext('Example Sub-lib 1'));
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES 
     (6, 5, 'BM1', oils_i18n_gettext('Example Bookmobile 1'));
 
 INSERT INTO actor.org_address VALUES (DEFAULT,DEFAULT,DEFAULT,1,oils_i18n_gettext('123 Main St.'),NULL,oils_i18n_gettext('Anywhere'),NULL,oils_i18n_gettext('GA'),oils_i18n_gettext('US'),oils_i18n_gettext('30303'));
 
 UPDATE actor.org_unit SET holds_address = 1, ill_address = 1, billing_address = 1, mailing_address = 1;
 
--- Just so that there is a user...
-INSERT INTO actor.usr ( profile, card, usrname, passwd, first_given_name, family_name, dob, master_account, super_user, ident_type, ident_value, home_ou ) VALUES ( 1, 1, 'admin', 'open-ils', oils_i18n_gettext('Administrator'), oils_i18n_gettext('System Account'), '1979-01-22', TRUE, TRUE, 1, 'identification', 1 );
-
-INSERT INTO actor.card (usr, barcode) VALUES (1,'101010101010101');
-
-
 --006.data.permissions.sql:
 INSERT INTO permission.perm_list VALUES 
-    (-1, 'EVERYTHING', NULL),
-    (2, 'OPAC_LOGIN', NULL),
-    (4, 'STAFF_LOGIN', NULL),
-    (5, 'MR_HOLDS', NULL),
-    (6, 'TITLE_HOLDS', NULL),
-    (7, 'VOLUME_HOLDS', NULL),
-    (8, 'COPY_HOLDS', oils_i18n_gettext('User is allowed to place a hold on a specific copy')),
-    (9, 'REQUEST_HOLDS', NULL),
-    (10, 'REQUEST_HOLDS_OVERRIDE', NULL),
-    (11, 'VIEW_HOLD', oils_i18n_gettext('Allows a user to view another user''s holds')),
-    (13, 'DELETE_HOLDS', NULL),
-    (14, 'UPDATE_HOLD', oils_i18n_gettext('Allows a user to update another user''s hold')),
-    (15, 'RENEW_CIRC', NULL),
-    (16, 'VIEW_USER_FINES_SUMMARY', NULL),
-    (17, 'VIEW_USER_TRANSACTIONS', NULL),
-    (18, 'UPDATE_MARC', NULL),
-    (19, 'CREATE_MARC', oils_i18n_gettext('User is allowed to create new MARC records')),
-    (20, 'IMPORT_MARC', NULL),
-    (21, 'CREATE_VOLUME', NULL),
-    (22, 'UPDATE_VOLUME', NULL),
-    (23, 'DELETE_VOLUME', NULL),
-    (25, 'UPDATE_COPY', NULL),
-    (26, 'DELETE_COPY', NULL),
-    (27, 'RENEW_HOLD_OVERRIDE', NULL),
-    (28, 'CREATE_USER', NULL),
-    (29, 'UPDATE_USER', NULL),
-    (30, 'DELETE_USER', NULL),
-    (31, 'VIEW_USER', NULL),
-    (32, 'COPY_CHECKIN', NULL),
-    (33, 'CREATE_TRANSIT', NULL),
-    (34, 'VIEW_PERMISSION', NULL),
-    (35, 'CHECKIN_BYPASS_HOLD_FULFILL', NULL),
-    (36, 'CREATE_PAYMENT', NULL),
-    (37, 'SET_CIRC_LOST', NULL),
-    (38, 'SET_CIRC_MISSING', NULL),
-    (39, 'SET_CIRC_CLAIMS_RETURNED', NULL),
-    (41, 'CREATE_TRANSACTION', oils_i18n_gettext('User may create new billable transactions')),
-    (43, 'CREATE_BILL', oils_i18n_gettext('Allows a user to create a new bill on a transaction')),
-    (44, 'VIEW_CONTAINER', oils_i18n_gettext('Allows a user to view another user''s containers (buckets)')),
-    (45, 'CREATE_CONTAINER', oils_i18n_gettext('Allows a user to create a new container for another user')),
-    (24, 'CREATE_COPY', oils_i18n_gettext('User is allowed to create a new copy object')),
-    (47, 'UPDATE_ORG_UNIT', oils_i18n_gettext('Allows a user to change org unit settings')),
-    (48, 'VIEW_CIRCULATIONS', oils_i18n_gettext('Allows a user to see what another use has checked out')),
-    (42, 'VIEW_TRANSACTION', oils_i18n_gettext('User may view another user''s transactions')),
-    (49, 'DELETE_CONTAINER', oils_i18n_gettext('Allows a user to delete another user container')),
-    (50, 'CREATE_CONTAINER_ITEM', oils_i18n_gettext('Create a container item for another user')),
-    (51, 'CREATE_USER_GROUP_LINK', oils_i18n_gettext('User can add other users to permission groups')),
-    (52, 'REMOVE_USER_GROUP_LINK', oils_i18n_gettext('User can remove other users from permission groups')),
-    (53, 'VIEW_PERM_GROUPS', oils_i18n_gettext('Allow user to view others'' permission groups')),
-    (54, 'VIEW_PERMIT_CHECKOUT', oils_i18n_gettext('Allows a user to determine of another user can checkout an item')),
-    (55, 'UPDATE_BATCH_COPY', oils_i18n_gettext('Allows a user to edit copies in batch')),
-    (56, 'CREATE_PATRON_STAT_CAT', oils_i18n_gettext('User may create a new patron statistical category')),
-    (57, 'CREATE_COPY_STAT_CAT', oils_i18n_gettext('User may create a copy stat cat')),
-    (58, 'CREATE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may create a new patron stat cat entry')),
-    (59, 'CREATE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may create a new copy stat cat entry')),
-    (60, 'UPDATE_PATRON_STAT_CAT', oils_i18n_gettext('User may update a patron stat cat')),
-    (61, 'UPDATE_COPY_STAT_CAT', oils_i18n_gettext('User may update a copy stat cat')),
-    (62, 'UPDATE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may update a patron stat cat entry')),
-    (63, 'UPDATE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may update a copy stat cat entry')),
-    (65, 'CREATE_COPY_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may link a copy to a stat cat entry')),
-    (64, 'CREATE_PATRON_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may link another user to a stat cat entry')),
-    (66, 'DELETE_PATRON_STAT_CAT', oils_i18n_gettext('User may delete a patron stat cat')),
-    (67, 'DELETE_COPY_STAT_CAT', oils_i18n_gettext('User may delete a copy stat cat')),
-    (68, 'DELETE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may delete a patron stat cat entry')),
-    (69, 'DELETE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may delete a copy stat cat entry')),
-    (70, 'DELETE_PATRON_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may delete a patron stat cat entry map')),
-    (71, 'DELETE_COPY_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may delete a copy stat cat entry map')),
-    (72, 'CREATE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to create a new non-cataloged item type')),
-    (73, 'UPDATE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to update a non cataloged type')),
-    (74, 'CREATE_IN_HOUSE_USE', oils_i18n_gettext('Allows a user to create a new in-house-use ')),
-    (75, 'COPY_CHECKOUT', oils_i18n_gettext('Allows a user to check out a copy')),
-    (76, 'CREATE_COPY_LOCATION', oils_i18n_gettext('Allows a user to create a new copy location')),
-    (77, 'UPDATE_COPY_LOCATION', oils_i18n_gettext('Allows a user to update a copy location')),
-    (78, 'DELETE_COPY_LOCATION', oils_i18n_gettext('Allows a user to delete a copy location')),
-    (79, 'CREATE_COPY_TRANSIT', oils_i18n_gettext('Allows a user to create a transit_copy object for transiting a copy')),
-    (80, 'COPY_TRANSIT_RECEIVE', oils_i18n_gettext('Allows a user to close out a transit on a copy')),
-    (81, 'VIEW_HOLD_PERMIT', oils_i18n_gettext('Allows a user to see if another user has permission to place a hold on a given copy')),
-    (82, 'VIEW_COPY_CHECKOUT_HISTORY', oils_i18n_gettext('Allows a user to view which users have checked out a given copy')),
-    (83, 'REMOTE_Z3950_QUERY', oils_i18n_gettext('Allows a user to perform z3950 queries against remote servers')),
-    (84, 'REGISTER_WORKSTATION', oils_i18n_gettext('Allows a user to register a new workstation')),
-    (85, 'VIEW_COPY_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a copy')),
-    (86, 'VIEW_VOLUME_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a volume')),
-    (87, 'VIEW_TITLE_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a title')),
-    (89, 'CREATE_VOLUME_NOTE', oils_i18n_gettext('Allows a user to create a new volume note')),
-    (88, 'CREATE_COPY_NOTE', oils_i18n_gettext('Allows a user to create a new copy note')),
-    (90, 'CREATE_TITLE_NOTE', oils_i18n_gettext('Allows a user to create a new title note')),
-    (91, 'DELETE_COPY_NOTE', oils_i18n_gettext('Allows a user to delete someone elses copy notes')),
-    (92, 'DELETE_VOLUME_NOTE', oils_i18n_gettext('Allows a user to delete someone elses volume note')),
-    (93, 'DELETE_TITLE_NOTE', oils_i18n_gettext('Allows a user to delete someone elses title note')),
-    (94, 'UPDATE_CONTAINER', oils_i18n_gettext('Allows a user to update another users container')),
-    (95, 'CREATE_MY_CONTAINER', oils_i18n_gettext('Allows a user to create a container for themselves')),
-    (96, 'VIEW_HOLD_NOTIFICATION', oils_i18n_gettext('Allows a user to view notifications attached to a hold')),
-    (97, 'CREATE_HOLD_NOTIFICATION', oils_i18n_gettext('Allows a user to create new hold notifications')),
-    (98, 'UPDATE_ORG_SETTING', oils_i18n_gettext('Allows a user to update an org unit setting')),
-    (99, 'OFFLINE_UPLOAD', oils_i18n_gettext('Allows a user to upload an offline script')),
-    (100, 'OFFLINE_VIEW', oils_i18n_gettext('Allows a user to view uploaded offline script information')),
-    (101, 'OFFLINE_EXECUTE', oils_i18n_gettext('Allows a user to execute an offline script batch')),
-    (102, 'CIRC_OVERRIDE_DUE_DATE', oils_i18n_gettext('Allows a user to change set the due date on an item to any date')),
-    (103, 'CIRC_PERMIT_OVERRIDE', oils_i18n_gettext('Allows a user to bypass the circ permit call for checkout')),
-    (104, 'COPY_IS_REFERENCE.override', oils_i18n_gettext('Allows a user to override the copy_is_reference event')),
-    (105, 'VOID_BILLING', oils_i18n_gettext('Allows a user to void a bill')),
-    (106, 'CIRC_CLAIMS_RETURNED.override', oils_i18n_gettext('Allows a person to check in/out an item that is claims returned')),
-    (107, 'COPY_BAD_STATUS.override', oils_i18n_gettext('Allows a user to check out an item in a non-circulatable status')),
-    (108, 'COPY_ALERT_MESSAGE.override', oils_i18n_gettext('Allows a user to check in/out an item that has an alert message')),
-    (109, 'COPY_STATUS_LOST.override', oils_i18n_gettext('Allows a user to remove the lost status from a copy')),
-    (110, 'COPY_STATUS_MISSING.override', oils_i18n_gettext('Allows a user to change the missing status on a copy')),
-    (111, 'ABORT_TRANSIT', oils_i18n_gettext('Allows a user to abort a copy transit if the user is at the transit destination or source')),
-    (112, 'ABORT_REMOTE_TRANIST', oils_i18n_gettext('Allows a user to abort a copy transit if the user is not at the transit source or dest')),
-    (113, 'VIEW_ZIP_DATA', oils_i18n_gettext('Allowsa user to query the zip code data method')),
-    (114, 'CANCEL_HOLDS', oils_i18n_gettext('')),
-    (115, 'CREATE_DUPLICATE_HOLDS', oils_i18n_gettext('Allows a user to create duplicate holds (e.g. two holds on the same title)')),
-    (117, 'actor.org_unit.closed_date.update', oils_i18n_gettext('Allows a user to update a closed date interval for a given location')),
-    (116, 'actor.org_unit.closed_date.delete', oils_i18n_gettext('Allows a user to remove a closed date interval for a given location')),
-    (118, 'actor.org_unit.closed_date.create', oils_i18n_gettext('Allows a user to create a new closed date for a location')),
-    (119, 'DELETE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to delete a non cataloged type')),
-    (120, 'money.collections_tracker.create', oils_i18n_gettext('Allows a user to put someone into collections')),
-    (121, 'money.collections_tracker.delete', oils_i18n_gettext('Allows a user to remove someone from collections')),
-    (122, 'BAR_PATRON', oils_i18n_gettext('Allows a user to bar a patron')),
-    (123, 'UNBAR_PATRON', oils_i18n_gettext('Allows a user to un-bar a patron')),
-    (124, 'DELETE_WORKSTATION', oils_i18n_gettext('Allows a user to remove an existing workstation so a new one can replace it')),
-    (125, 'group_application.user', oils_i18n_gettext('Allows a user to add/remove users to/from the "User" group')),
-    (126, 'group_application.user.patron', oils_i18n_gettext('Allows a user to add/remove users to/from the "Patron" group')),
-    (127, 'group_application.user.staff', oils_i18n_gettext('Allows a user to add/remove users to/from the "Staff" group')),
-    (128, 'group_application.user.staff.circ', oils_i18n_gettext('Allows a user to add/remove users to/from the "Circulator" group')),
-    (129, 'group_application.user.staff.cat', oils_i18n_gettext('Allows a user to add/remove users to/from the "Cataloger" group')),
-    (130, 'group_application.user.staff.admin.global_admin', oils_i18n_gettext('Allows a user to add/remove users to/from the "GlobalAdmin" group')),
-    (131, 'group_application.user.staff.admin.local_admin', oils_i18n_gettext('Allows a user to add/remove users to/from the "LocalAdmin" group')),
-    (132, 'group_application.user.staff.admin.lib_manager', oils_i18n_gettext('Allows a user to add/remove users to/from the "LibraryManager" group')),
-    (133, 'group_application.user.staff.cat.cat1', oils_i18n_gettext('Allows a user to add/remove users to/from the "Cat1" group')),
-    (134, 'group_application.user.staff.supercat', oils_i18n_gettext('Allows a user to add/remove users to/from the "Supercat" group')),
-    (135, 'group_application.user.sip_client', oils_i18n_gettext('Allows a user to add/remove users to/from the "SIP-Client" group')),
-    (136, 'group_application.user.vendor', oils_i18n_gettext('Allows a user to add/remove users to/from the "Vendor" group')),
-    (137, 'ITEM_AGE_PROTECTED.override', oils_i18n_gettext('Allows a user to place a hold on an age-protected item')),
-    (138, 'MAX_RENEWALS_REACHED.override', oils_i18n_gettext('Allows a user to renew an item past the maximun renewal count')),
-    (139, 'PATRON_EXCEEDS_CHECKOUT_COUNT.override', oils_i18n_gettext('Allow staff to override checkout count failure')),
-    (140, 'PATRON_EXCEEDS_OVERDUE_COUNT.override', oils_i18n_gettext('Allow staff to override overdue count failure')),
-    (141, 'PATRON_EXCEEDS_FINES.override', oils_i18n_gettext('Allow staff to override fine amount checkout failure')),
-    (142, 'CIRC_EXCEEDS_COPY_RANGE.override', oils_i18n_gettext('')),
-    (143, 'ITEM_ON_HOLDS_SHELF.override', oils_i18n_gettext('')),
-    (144, 'COPY_NOT_AVAILABLE.override', oils_i18n_gettext('Allow staff to force checkout of Missing/Lost type items')),
-    (146, 'HOLD_EXISTS.override', oils_i18n_gettext('allows users to place multiple holds on a single title')),
-    (147, 'RUN_REPORTS', oils_i18n_gettext('Allows a users to run reports')),
-    (148, 'SHARE_REPORT_FOLDER', oils_i18n_gettext('Allows a user to share report his own folders')),
-    (149, 'VIEW_REPORT_OUTPUT', oils_i18n_gettext('Allow user to view report output')),
-    (150, 'COPY_CIRC_NOT_ALLOWED.override', oils_i18n_gettext('Allows a user to checkout an item that is marked as non-circ')),
-    (151, 'DELETE_CONTAINER_ITEM', oils_i18n_gettext('Allows a user to delete an item out of another user''s container')),
+    (-1, 'EVERYTHING', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (2, 'OPAC_LOGIN', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (4, 'STAFF_LOGIN', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (5, 'MR_HOLDS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (6, 'TITLE_HOLDS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (7, 'VOLUME_HOLDS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (8, 'COPY_HOLDS', oils_i18n_gettext('User is allowed to place a hold on a specific copy'));
+INSERT INTO permission.perm_list VALUES 
+    (9, 'REQUEST_HOLDS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (10, 'REQUEST_HOLDS_OVERRIDE', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (11, 'VIEW_HOLD', oils_i18n_gettext('Allows a user to view another user''s holds'));
+INSERT INTO permission.perm_list VALUES 
+    (13, 'DELETE_HOLDS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (14, 'UPDATE_HOLD', oils_i18n_gettext('Allows a user to update another user''s hold'));
+INSERT INTO permission.perm_list VALUES 
+    (15, 'RENEW_CIRC', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (16, 'VIEW_USER_FINES_SUMMARY', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (17, 'VIEW_USER_TRANSACTIONS', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (18, 'UPDATE_MARC', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (19, 'CREATE_MARC', oils_i18n_gettext('User is allowed to create new MARC records'));
+INSERT INTO permission.perm_list VALUES 
+    (20, 'IMPORT_MARC', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (21, 'CREATE_VOLUME', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (22, 'UPDATE_VOLUME', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (23, 'DELETE_VOLUME', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (25, 'UPDATE_COPY', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (26, 'DELETE_COPY', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (27, 'RENEW_HOLD_OVERRIDE', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (28, 'CREATE_USER', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (29, 'UPDATE_USER', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (30, 'DELETE_USER', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (31, 'VIEW_USER', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (32, 'COPY_CHECKIN', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (33, 'CREATE_TRANSIT', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (34, 'VIEW_PERMISSION', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (35, 'CHECKIN_BYPASS_HOLD_FULFILL', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (36, 'CREATE_PAYMENT', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (37, 'SET_CIRC_LOST', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (38, 'SET_CIRC_MISSING', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (39, 'SET_CIRC_CLAIMS_RETURNED', NULL);
+INSERT INTO permission.perm_list VALUES 
+    (41, 'CREATE_TRANSACTION', oils_i18n_gettext('User may create new billable transactions'));
+INSERT INTO permission.perm_list VALUES 
+    (43, 'CREATE_BILL', oils_i18n_gettext('Allows a user to create a new bill on a transaction'));
+INSERT INTO permission.perm_list VALUES 
+    (44, 'VIEW_CONTAINER', oils_i18n_gettext('Allows a user to view another user''s containers (buckets)'));
+INSERT INTO permission.perm_list VALUES 
+    (45, 'CREATE_CONTAINER', oils_i18n_gettext('Allows a user to create a new container for another user'));
+INSERT INTO permission.perm_list VALUES 
+    (24, 'CREATE_COPY', oils_i18n_gettext('User is allowed to create a new copy object'));
+INSERT INTO permission.perm_list VALUES 
+    (47, 'UPDATE_ORG_UNIT', oils_i18n_gettext('Allows a user to change org unit settings'));
+INSERT INTO permission.perm_list VALUES 
+    (48, 'VIEW_CIRCULATIONS', oils_i18n_gettext('Allows a user to see what another use has checked out'));
+INSERT INTO permission.perm_list VALUES 
+    (42, 'VIEW_TRANSACTION', oils_i18n_gettext('User may view another user''s transactions'));
+INSERT INTO permission.perm_list VALUES 
+    (49, 'DELETE_CONTAINER', oils_i18n_gettext('Allows a user to delete another user container'));
+INSERT INTO permission.perm_list VALUES 
+    (50, 'CREATE_CONTAINER_ITEM', oils_i18n_gettext('Create a container item for another user'));
+INSERT INTO permission.perm_list VALUES 
+    (51, 'CREATE_USER_GROUP_LINK', oils_i18n_gettext('User can add other users to permission groups'));
+INSERT INTO permission.perm_list VALUES 
+    (52, 'REMOVE_USER_GROUP_LINK', oils_i18n_gettext('User can remove other users from permission groups'));
+INSERT INTO permission.perm_list VALUES 
+    (53, 'VIEW_PERM_GROUPS', oils_i18n_gettext('Allow user to view others'' permission groups'));
+INSERT INTO permission.perm_list VALUES 
+    (54, 'VIEW_PERMIT_CHECKOUT', oils_i18n_gettext('Allows a user to determine of another user can checkout an item'));
+INSERT INTO permission.perm_list VALUES 
+    (55, 'UPDATE_BATCH_COPY', oils_i18n_gettext('Allows a user to edit copies in batch'));
+INSERT INTO permission.perm_list VALUES 
+    (56, 'CREATE_PATRON_STAT_CAT', oils_i18n_gettext('User may create a new patron statistical category'));
+INSERT INTO permission.perm_list VALUES 
+    (57, 'CREATE_COPY_STAT_CAT', oils_i18n_gettext('User may create a copy stat cat'));
+INSERT INTO permission.perm_list VALUES 
+    (58, 'CREATE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may create a new patron stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (59, 'CREATE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may create a new copy stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (60, 'UPDATE_PATRON_STAT_CAT', oils_i18n_gettext('User may update a patron stat cat'));
+INSERT INTO permission.perm_list VALUES 
+    (61, 'UPDATE_COPY_STAT_CAT', oils_i18n_gettext('User may update a copy stat cat'));
+INSERT INTO permission.perm_list VALUES 
+    (62, 'UPDATE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may update a patron stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (63, 'UPDATE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may update a copy stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (65, 'CREATE_COPY_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may link a copy to a stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (64, 'CREATE_PATRON_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may link another user to a stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (66, 'DELETE_PATRON_STAT_CAT', oils_i18n_gettext('User may delete a patron stat cat'));
+INSERT INTO permission.perm_list VALUES 
+    (67, 'DELETE_COPY_STAT_CAT', oils_i18n_gettext('User may delete a copy stat cat'));
+INSERT INTO permission.perm_list VALUES 
+    (68, 'DELETE_PATRON_STAT_CAT_ENTRY', oils_i18n_gettext('User may delete a patron stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (69, 'DELETE_COPY_STAT_CAT_ENTRY', oils_i18n_gettext('User may delete a copy stat cat entry'));
+INSERT INTO permission.perm_list VALUES 
+    (70, 'DELETE_PATRON_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may delete a patron stat cat entry map'));
+INSERT INTO permission.perm_list VALUES 
+    (71, 'DELETE_COPY_STAT_CAT_ENTRY_MAP', oils_i18n_gettext('User may delete a copy stat cat entry map'));
+INSERT INTO permission.perm_list VALUES 
+    (72, 'CREATE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to create a new non-cataloged item type'));
+INSERT INTO permission.perm_list VALUES 
+    (73, 'UPDATE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to update a non cataloged type'));
+INSERT INTO permission.perm_list VALUES 
+    (74, 'CREATE_IN_HOUSE_USE', oils_i18n_gettext('Allows a user to create a new in-house-use '));
+INSERT INTO permission.perm_list VALUES 
+    (75, 'COPY_CHECKOUT', oils_i18n_gettext('Allows a user to check out a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (76, 'CREATE_COPY_LOCATION', oils_i18n_gettext('Allows a user to create a new copy location'));
+INSERT INTO permission.perm_list VALUES 
+    (77, 'UPDATE_COPY_LOCATION', oils_i18n_gettext('Allows a user to update a copy location'));
+INSERT INTO permission.perm_list VALUES 
+    (78, 'DELETE_COPY_LOCATION', oils_i18n_gettext('Allows a user to delete a copy location'));
+INSERT INTO permission.perm_list VALUES 
+    (79, 'CREATE_COPY_TRANSIT', oils_i18n_gettext('Allows a user to create a transit_copy object for transiting a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (80, 'COPY_TRANSIT_RECEIVE', oils_i18n_gettext('Allows a user to close out a transit on a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (81, 'VIEW_HOLD_PERMIT', oils_i18n_gettext('Allows a user to see if another user has permission to place a hold on a given copy'));
+INSERT INTO permission.perm_list VALUES 
+    (82, 'VIEW_COPY_CHECKOUT_HISTORY', oils_i18n_gettext('Allows a user to view which users have checked out a given copy'));
+INSERT INTO permission.perm_list VALUES 
+    (83, 'REMOTE_Z3950_QUERY', oils_i18n_gettext('Allows a user to perform z3950 queries against remote servers'));
+INSERT INTO permission.perm_list VALUES 
+    (84, 'REGISTER_WORKSTATION', oils_i18n_gettext('Allows a user to register a new workstation'));
+INSERT INTO permission.perm_list VALUES 
+    (85, 'VIEW_COPY_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (86, 'VIEW_VOLUME_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a volume'));
+INSERT INTO permission.perm_list VALUES 
+    (87, 'VIEW_TITLE_NOTES', oils_i18n_gettext('Allows a user to view all notes attached to a title'));
+INSERT INTO permission.perm_list VALUES 
+    (89, 'CREATE_VOLUME_NOTE', oils_i18n_gettext('Allows a user to create a new volume note'));
+INSERT INTO permission.perm_list VALUES 
+    (88, 'CREATE_COPY_NOTE', oils_i18n_gettext('Allows a user to create a new copy note'));
+INSERT INTO permission.perm_list VALUES 
+    (90, 'CREATE_TITLE_NOTE', oils_i18n_gettext('Allows a user to create a new title note'));
+INSERT INTO permission.perm_list VALUES 
+    (91, 'DELETE_COPY_NOTE', oils_i18n_gettext('Allows a user to delete someone elses copy notes'));
+INSERT INTO permission.perm_list VALUES 
+    (92, 'DELETE_VOLUME_NOTE', oils_i18n_gettext('Allows a user to delete someone elses volume note'));
+INSERT INTO permission.perm_list VALUES 
+    (93, 'DELETE_TITLE_NOTE', oils_i18n_gettext('Allows a user to delete someone elses title note'));
+INSERT INTO permission.perm_list VALUES 
+    (94, 'UPDATE_CONTAINER', oils_i18n_gettext('Allows a user to update another users container'));
+INSERT INTO permission.perm_list VALUES 
+    (95, 'CREATE_MY_CONTAINER', oils_i18n_gettext('Allows a user to create a container for themselves'));
+INSERT INTO permission.perm_list VALUES 
+    (96, 'VIEW_HOLD_NOTIFICATION', oils_i18n_gettext('Allows a user to view notifications attached to a hold'));
+INSERT INTO permission.perm_list VALUES 
+    (97, 'CREATE_HOLD_NOTIFICATION', oils_i18n_gettext('Allows a user to create new hold notifications'));
+INSERT INTO permission.perm_list VALUES 
+    (98, 'UPDATE_ORG_SETTING', oils_i18n_gettext('Allows a user to update an org unit setting'));
+INSERT INTO permission.perm_list VALUES 
+    (99, 'OFFLINE_UPLOAD', oils_i18n_gettext('Allows a user to upload an offline script'));
+INSERT INTO permission.perm_list VALUES 
+    (100, 'OFFLINE_VIEW', oils_i18n_gettext('Allows a user to view uploaded offline script information'));
+INSERT INTO permission.perm_list VALUES 
+    (101, 'OFFLINE_EXECUTE', oils_i18n_gettext('Allows a user to execute an offline script batch'));
+INSERT INTO permission.perm_list VALUES 
+    (102, 'CIRC_OVERRIDE_DUE_DATE', oils_i18n_gettext('Allows a user to change set the due date on an item to any date'));
+INSERT INTO permission.perm_list VALUES 
+    (103, 'CIRC_PERMIT_OVERRIDE', oils_i18n_gettext('Allows a user to bypass the circ permit call for checkout'));
+INSERT INTO permission.perm_list VALUES 
+    (104, 'COPY_IS_REFERENCE.override', oils_i18n_gettext('Allows a user to override the copy_is_reference event'));
+INSERT INTO permission.perm_list VALUES 
+    (105, 'VOID_BILLING', oils_i18n_gettext('Allows a user to void a bill'));
+INSERT INTO permission.perm_list VALUES 
+    (106, 'CIRC_CLAIMS_RETURNED.override', oils_i18n_gettext('Allows a person to check in/out an item that is claims returned'));
+INSERT INTO permission.perm_list VALUES 
+    (107, 'COPY_BAD_STATUS.override', oils_i18n_gettext('Allows a user to check out an item in a non-circulatable status'));
+INSERT INTO permission.perm_list VALUES 
+    (108, 'COPY_ALERT_MESSAGE.override', oils_i18n_gettext('Allows a user to check in/out an item that has an alert message'));
+INSERT INTO permission.perm_list VALUES 
+    (109, 'COPY_STATUS_LOST.override', oils_i18n_gettext('Allows a user to remove the lost status from a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (110, 'COPY_STATUS_MISSING.override', oils_i18n_gettext('Allows a user to change the missing status on a copy'));
+INSERT INTO permission.perm_list VALUES 
+    (111, 'ABORT_TRANSIT', oils_i18n_gettext('Allows a user to abort a copy transit if the user is at the transit destination or source'));
+INSERT INTO permission.perm_list VALUES 
+    (112, 'ABORT_REMOTE_TRANIST', oils_i18n_gettext('Allows a user to abort a copy transit if the user is not at the transit source or dest'));
+INSERT INTO permission.perm_list VALUES 
+    (113, 'VIEW_ZIP_DATA', oils_i18n_gettext('Allowsa user to query the zip code data method'));
+INSERT INTO permission.perm_list VALUES 
+    (114, 'CANCEL_HOLDS', oils_i18n_gettext(''));
+INSERT INTO permission.perm_list VALUES 
+    (115, 'CREATE_DUPLICATE_HOLDS', oils_i18n_gettext('Allows a user to create duplicate holds (e.g. two holds on the same title)'));
+INSERT INTO permission.perm_list VALUES 
+    (117, 'actor.org_unit.closed_date.update', oils_i18n_gettext('Allows a user to update a closed date interval for a given location'));
+INSERT INTO permission.perm_list VALUES 
+    (116, 'actor.org_unit.closed_date.delete', oils_i18n_gettext('Allows a user to remove a closed date interval for a given location'));
+INSERT INTO permission.perm_list VALUES 
+    (118, 'actor.org_unit.closed_date.create', oils_i18n_gettext('Allows a user to create a new closed date for a location'));
+INSERT INTO permission.perm_list VALUES 
+    (119, 'DELETE_NON_CAT_TYPE', oils_i18n_gettext('Allows a user to delete a non cataloged type'));
+INSERT INTO permission.perm_list VALUES 
+    (120, 'money.collections_tracker.create', oils_i18n_gettext('Allows a user to put someone into collections'));
+INSERT INTO permission.perm_list VALUES 
+    (121, 'money.collections_tracker.delete', oils_i18n_gettext('Allows a user to remove someone from collections'));
+INSERT INTO permission.perm_list VALUES 
+    (122, 'BAR_PATRON', oils_i18n_gettext('Allows a user to bar a patron'));
+INSERT INTO permission.perm_list VALUES 
+    (123, 'UNBAR_PATRON', oils_i18n_gettext('Allows a user to un-bar a patron'));
+INSERT INTO permission.perm_list VALUES 
+    (124, 'DELETE_WORKSTATION', oils_i18n_gettext('Allows a user to remove an existing workstation so a new one can replace it'));
+INSERT INTO permission.perm_list VALUES 
+    (125, 'group_application.user', oils_i18n_gettext('Allows a user to add/remove users to/from the "User" group'));
+INSERT INTO permission.perm_list VALUES 
+    (126, 'group_application.user.patron', oils_i18n_gettext('Allows a user to add/remove users to/from the "Patron" group'));
+INSERT INTO permission.perm_list VALUES 
+    (127, 'group_application.user.staff', oils_i18n_gettext('Allows a user to add/remove users to/from the "Staff" group'));
+INSERT INTO permission.perm_list VALUES 
+    (128, 'group_application.user.staff.circ', oils_i18n_gettext('Allows a user to add/remove users to/from the "Circulator" group'));
+INSERT INTO permission.perm_list VALUES 
+    (129, 'group_application.user.staff.cat', oils_i18n_gettext('Allows a user to add/remove users to/from the "Cataloger" group'));
+INSERT INTO permission.perm_list VALUES 
+    (130, 'group_application.user.staff.admin.global_admin', oils_i18n_gettext('Allows a user to add/remove users to/from the "GlobalAdmin" group'));
+INSERT INTO permission.perm_list VALUES 
+    (131, 'group_application.user.staff.admin.local_admin', oils_i18n_gettext('Allows a user to add/remove users to/from the "LocalAdmin" group'));
+INSERT INTO permission.perm_list VALUES 
+    (132, 'group_application.user.staff.admin.lib_manager', oils_i18n_gettext('Allows a user to add/remove users to/from the "LibraryManager" group'));
+INSERT INTO permission.perm_list VALUES 
+    (133, 'group_application.user.staff.cat.cat1', oils_i18n_gettext('Allows a user to add/remove users to/from the "Cat1" group'));
+INSERT INTO permission.perm_list VALUES 
+    (134, 'group_application.user.staff.supercat', oils_i18n_gettext('Allows a user to add/remove users to/from the "Supercat" group'));
+INSERT INTO permission.perm_list VALUES 
+    (135, 'group_application.user.sip_client', oils_i18n_gettext('Allows a user to add/remove users to/from the "SIP-Client" group'));
+INSERT INTO permission.perm_list VALUES 
+    (136, 'group_application.user.vendor', oils_i18n_gettext('Allows a user to add/remove users to/from the "Vendor" group'));
+INSERT INTO permission.perm_list VALUES 
+    (137, 'ITEM_AGE_PROTECTED.override', oils_i18n_gettext('Allows a user to place a hold on an age-protected item'));
+INSERT INTO permission.perm_list VALUES 
+    (138, 'MAX_RENEWALS_REACHED.override', oils_i18n_gettext('Allows a user to renew an item past the maximun renewal count'));
+INSERT INTO permission.perm_list VALUES 
+    (139, 'PATRON_EXCEEDS_CHECKOUT_COUNT.override', oils_i18n_gettext('Allow staff to override checkout count failure'));
+INSERT INTO permission.perm_list VALUES 
+    (140, 'PATRON_EXCEEDS_OVERDUE_COUNT.override', oils_i18n_gettext('Allow staff to override overdue count failure'));
+INSERT INTO permission.perm_list VALUES 
+    (141, 'PATRON_EXCEEDS_FINES.override', oils_i18n_gettext('Allow staff to override fine amount checkout failure'));
+INSERT INTO permission.perm_list VALUES 
+    (142, 'CIRC_EXCEEDS_COPY_RANGE.override', oils_i18n_gettext(''));
+INSERT INTO permission.perm_list VALUES 
+    (143, 'ITEM_ON_HOLDS_SHELF.override', oils_i18n_gettext(''));
+INSERT INTO permission.perm_list VALUES 
+    (144, 'COPY_NOT_AVAILABLE.override', oils_i18n_gettext('Allow staff to force checkout of Missing/Lost type items'));
+INSERT INTO permission.perm_list VALUES 
+    (146, 'HOLD_EXISTS.override', oils_i18n_gettext('allows users to place multiple holds on a single title'));
+INSERT INTO permission.perm_list VALUES 
+    (147, 'RUN_REPORTS', oils_i18n_gettext('Allows a users to run reports'));
+INSERT INTO permission.perm_list VALUES 
+    (148, 'SHARE_REPORT_FOLDER', oils_i18n_gettext('Allows a user to share report his own folders'));
+INSERT INTO permission.perm_list VALUES 
+    (149, 'VIEW_REPORT_OUTPUT', oils_i18n_gettext('Allow user to view report output'));
+INSERT INTO permission.perm_list VALUES 
+    (150, 'COPY_CIRC_NOT_ALLOWED.override', oils_i18n_gettext('Allows a user to checkout an item that is marked as non-circ'));
+INSERT INTO permission.perm_list VALUES 
+    (151, 'DELETE_CONTAINER_ITEM', oils_i18n_gettext('Allows a user to delete an item out of another user''s container'));
+INSERT INTO permission.perm_list VALUES 
     (152, 'ASSIGN_WORK_ORG_UNIT', oils_i18n_gettext('Allow a staff member to define where another staff member has their permissions')),
     (153, 'CREATE_FUNDING_SOURCE', oils_i18n_gettext('Allow a user to create a new funding source')),
     (154, 'DELETE_FUNDING_SOURCE', oils_i18n_gettext('Allow a user to delete a funding source')),
@@ -838,128 +1049,222 @@ INSERT INTO permission.perm_list VALUES
     (176, 'MANAGE_PROVIDER', oils_i18n_gettext('Allow a user to view and purchase from a provider')),
     (177, 'VIEW_PICKLIST', oils_i18n_gettext('Allow a user to view another users picklist'));
 
+SELECT SETVAL('permission.perm_list_id_seq'::TEXT, (SELECT MAX(id) FROM permission.perm_list));
+
+INSERT INTO permission.perm_list (code) VALUES ('ASSIGN_GROUP_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_AUDIENCE');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_BIB_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_CIRC_DURATION');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_CIRC_MOD');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_COPY_STATUS');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_HOURS_OF_OPERATION');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ITEM_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ITEM_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_LANGUAGE');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_LASSO');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_LASSO_MAP');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_LIT_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_METABIB_FIELD');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_NET_ACCESS_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ORG_ADDRESS');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ORG_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ORG_UNIT');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_ORG_UNIT_CLOSING');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_RELEVANCE_ADJUSTMENT');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_SURVEY');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_VR_FORMAT');
+INSERT INTO permission.perm_list (code) VALUES ('CREATE_XML_TRANSFORM');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_AUDIENCE');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_BIB_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_CIRC_DURATION');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_CIRC_MOD');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_COPY_STATUS');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_HOURS_OF_OPERATION');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ITEM_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ITEM_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_LANGUAGE');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_LASSO');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_LASSO_MAP');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_LIT_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_METABIB_FIELD');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_NET_ACCESS_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ORG_ADDRESS');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ORG_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ORG_UNIT');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_ORG_UNIT_CLOSING');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_RELEVANCE_ADJUSTMENT');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_SURVEY');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_TRANSIT');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_VR_FORMAT');
+INSERT INTO permission.perm_list (code) VALUES ('DELETE_XML_TRANSFORM');
+INSERT INTO permission.perm_list (code) VALUES ('REMOVE_GROUP_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('TRANSIT_COPY');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_AUDIENCE');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_BIB_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_CIRC_DURATION');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_CIRC_MOD');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_COPY_NOTE');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_COPY_STATUS');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_GROUP_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_HOURS_OF_OPERATION');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_ITEM_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_ITEM_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_LANGUAGE');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_LASSO');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_LASSO_MAP');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_LIT_FORM');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_METABIB_FIELD');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_NET_ACCESS_LEVEL');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_ORG_ADDRESS');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_ORG_TYPE');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_ORG_UNIT_CLOSING');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_PERM');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_RELEVANCE_ADJUSTMENT');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_SURVEY');
+INSERT INTO permission.perm_list (code) VALUES ('UPDATE_TRANSIT');
+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.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
+       (1, 'Users', NULL, NULL, '3 years', FALSE, 'group_application.user');
+INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
+       (2, 'Patrons', 1, NULL, '3 years', TRUE, 'group_application.user.patron');
+INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
+       (3, 'Staff', 1, NULL, '3 years', FALSE, 'group_application.user.staff');
+INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
+       (4, 'Catalogers', 3, NULL, '3 years', TRUE, 'group_application.user.staff.cat');
+INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
+       (5, 'Circulators', 3, NULL, '3 years', TRUE, 'group_application.user.staff.circ');
 INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
-       (1, 'Users', NULL, NULL, '3 years', FALSE, 'group_application.user'),
-       (2, 'Patrons', 1, NULL, '3 years', TRUE, 'group_application.user.patron'),
-       (3, 'Staff', 1, NULL, '3 years', FALSE, 'group_application.user.staff'),
-       (4, 'Catalogers', 3, NULL, '3 years', TRUE, 'group_application.user.staff.cat'),
-       (5, 'Circulators', 3, NULL, '3 years', TRUE, 'group_application.user.staff.circ'),
        (10, 'Local System Administrator', 3, 'System maintenance, configuration, etc.', '3 years', TRUE, 'group_application.user.staff.admin.local_admin');
 
+SELECT SETVAL('permission.grp_tree_id_seq'::TEXT, (SELECT MAX(id) FROM permission.grp_tree));
 
 -- XXX Incomplete base permission setup.  A patch would be appreciated.
-INSERT INTO permission.grp_perm_map VALUES 
-    (57, 2, 15, 0, false),
-    (109, 2, 95, 0, false),
-    (1, 1, 2, 0, false),
-    (12, 1, 5, 0, false),
-    (13, 1, 6, 0, false),
-    (51, 1, 32, 0, false),
-    (111, 1, 95, 0, false),
-    (11, 3, 4, 0, false),
-    (14, 3, 7, 2, false),
-    (16, 3, 9, 0, false),
-    (19, 3, 15, 0, false),
-    (20, 3, 16, 0, false),
-    (21, 3, 17, 0, false),
-    (116, 3, 18, 0, false),
-    (117, 3, 20, 0, false),
-    (118, 3, 21, 2, false),
-    (119, 3, 22, 2, false),
-    (120, 3, 23, 2, false),
-    (121, 3, 25, 2, false),
-    (26, 3, 27, 0, false),
-    (27, 3, 28, 0, false),
-    (28, 3, 29, 0, false),
-    (29, 3, 30, 0, false),
-    (44, 3, 31, 0, false),
-    (31, 3, 33, 0, false),
-    (32, 3, 34, 0, false),
-    (33, 3, 35, 0, false),
-    (41, 3, 36, 0, false),
-    (45, 3, 37, 0, false),
-    (46, 3, 38, 0, false),
-    (47, 3, 39, 0, false),
-    (122, 3, 41, 0, false),
-    (123, 3, 43, 0, false),
-    (60, 3, 44, 0, false),
-    (110, 3, 45, 0, false),
-    (124, 3, 8, 2, false),
-    (125, 3, 24, 2, false),
-    (126, 3, 19, 0, false),
-    (61, 3, 47, 2, false),
-    (95, 3, 48, 0, false),
-    (17, 3, 11, 0, false),
-    (62, 3, 42, 0, false),
-    (63, 3, 49, 0, false),
-    (64, 3, 50, 0, false),
-    (127, 3, 53, 0, false),
-    (65, 3, 54, 0, false),
-    (128, 3, 55, 2, false),
-    (67, 3, 56, 2, false),
-    (68, 3, 57, 2, false),
-    (69, 3, 58, 2, false),
-    (70, 3, 59, 2, false),
-    (71, 3, 60, 2, false),
-    (72, 3, 61, 2, false),
-    (73, 3, 62, 2, false),
-    (74, 3, 63, 2, false),
-    (81, 3, 72, 2, false),
-    (82, 3, 73, 2, false),
-    (83, 3, 74, 2, false),
-    (84, 3, 75, 0, false),
-    (85, 3, 76, 2, false),
-    (86, 3, 77, 2, false),
-    (89, 3, 79, 0, false),
-    (90, 3, 80, 0, false),
-    (91, 3, 81, 0, false),
-    (92, 3, 82, 0, false),
-    (98, 3, 83, 0, false),
-    (115, 3, 84, 0, false),
-    (100, 3, 85, 0, false),
-    (101, 3, 86, 0, false),
-    (102, 3, 87, 0, false),
-    (103, 3, 89, 2, false),
-    (104, 3, 88, 2, false),
-    (108, 3, 94, 0, false),
-    (112, 3, 96, 0, false),
-    (113, 3, 97, 0, false),
-    (130, 3, 99, 1, false),
-    (131, 3, 100, 1, false),
-    (22, 4, 18, 0, false),
-    (24, 4, 20, 0, false),
-    (38, 4, 21, 2, false),
-    (34, 4, 22, 2, false),
-    (39, 4, 23, 2, false),
-    (35, 4, 25, 2, false),
-    (129, 4, 26, 2, false),
-    (15, 4, 8, 2, false),
-    (40, 4, 24, 2, false),
-    (23, 4, 19, 0, false),
-    (66, 4, 55, 2, false),
-    (134, 10, 51, 1, false),
-    (75, 10, 66, 2, false),
-    (76, 10, 67, 2, false),
-    (77, 10, 68, 2, false),
-    (78, 10, 69, 2, false),
-    (79, 10, 70, 2, false),
-    (80, 10, 71, 2, false),
-    (87, 10, 78, 2, false),
-    (105, 10, 91, 1, false),
-    (106, 10, 92, 1, false),
-    (107, 10, 93, 0, false),
-    (114, 10, 98, 1, false),
-    (132, 10, 101, 1, true),
-    (136, 10, 102, 1, false),
-    (137, 10, 103, 1, false),
-    (97, 5, 41, 0, false),
-    (96, 5, 43, 0, false),
-    (93, 5, 48, 0, false),
-    (94, 5, 53, 0, false),
-    (133, 5, 102, 0, false),
-    (138, 5, 104, 1, false);
-
--- Admin user
+INSERT INTO permission.grp_perm_map VALUES (57, 2, 15, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (109, 2, 95, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (1, 1, 2, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (12, 1, 5, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (13, 1, 6, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (51, 1, 32, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (111, 1, 95, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (11, 3, 4, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (14, 3, 7, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (16, 3, 9, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (19, 3, 15, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (20, 3, 16, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (21, 3, 17, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (116, 3, 18, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (117, 3, 20, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (118, 3, 21, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (119, 3, 22, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (120, 3, 23, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (121, 3, 25, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (26, 3, 27, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (27, 3, 28, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (28, 3, 29, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (29, 3, 30, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (44, 3, 31, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (31, 3, 33, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (32, 3, 34, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (33, 3, 35, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (41, 3, 36, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (45, 3, 37, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (46, 3, 38, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (47, 3, 39, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (122, 3, 41, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (123, 3, 43, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (60, 3, 44, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (110, 3, 45, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (124, 3, 8, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (125, 3, 24, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (126, 3, 19, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (61, 3, 47, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (95, 3, 48, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (17, 3, 11, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (62, 3, 42, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (63, 3, 49, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (64, 3, 50, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (127, 3, 53, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (65, 3, 54, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (128, 3, 55, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (67, 3, 56, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (68, 3, 57, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (69, 3, 58, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (70, 3, 59, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (71, 3, 60, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (72, 3, 61, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (73, 3, 62, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (74, 3, 63, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (81, 3, 72, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (82, 3, 73, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (83, 3, 74, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (84, 3, 75, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (85, 3, 76, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (86, 3, 77, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (89, 3, 79, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (90, 3, 80, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (91, 3, 81, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (92, 3, 82, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (98, 3, 83, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (115, 3, 84, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (100, 3, 85, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (101, 3, 86, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (102, 3, 87, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (103, 3, 89, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (104, 3, 88, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (108, 3, 94, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (112, 3, 96, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (113, 3, 97, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (130, 3, 99, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (131, 3, 100, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (22, 4, 18, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (24, 4, 20, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (38, 4, 21, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (34, 4, 22, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (39, 4, 23, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (35, 4, 25, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (129, 4, 26, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (15, 4, 8, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (40, 4, 24, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (23, 4, 19, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (66, 4, 55, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (134, 10, 51, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (75, 10, 66, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (76, 10, 67, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (77, 10, 68, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (78, 10, 69, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (79, 10, 70, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (80, 10, 71, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (87, 10, 78, 2, false);
+INSERT INTO permission.grp_perm_map VALUES (105, 10, 91, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (106, 10, 92, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (107, 10, 93, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (114, 10, 98, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (132, 10, 101, 1, true);
+INSERT INTO permission.grp_perm_map VALUES (136, 10, 102, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (137, 10, 103, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (97, 5, 41, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (96, 5, 43, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (93, 5, 48, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (94, 5, 53, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (133, 5, 102, 0, false);
+INSERT INTO permission.grp_perm_map VALUES (138, 5, 104, 1, false);
+
+SELECT SETVAL('permission.grp_perm_map_id_seq'::TEXT, (SELECT MAX(id) FROM permission.grp_perm_map));
+
+-- Admin user account
+INSERT INTO actor.usr ( profile, card, usrname, passwd, first_given_name, family_name, dob, master_account, super_user, ident_type, ident_value, home_ou ) VALUES ( 1, 1, 'admin', 'open-ils', oils_i18n_gettext('Administrator'), oils_i18n_gettext('System Account'), '1979-01-22', TRUE, TRUE, 1, 'identification', 1 );
+
+-- Admin user barcode
+INSERT INTO actor.card (usr, barcode) VALUES (1,'101010101010101');
+UPDATE actor.usr SET card = (SELECT id FROM actor.card WHERE barcode = '101010101010101') WHERE id = 1;
+
+-- Admin user permissions
 INSERT INTO permission.usr_perm_map (usr,perm,depth) VALUES (1,-1,0);
 
 --010.schema.biblio.sql:
@@ -968,3 +1273,35 @@ INSERT INTO biblio.record_entry VALUES (-1,1,1,1,-1,NOW(),NOW(),FALSE,FALSE,'','
 --040.schema.asset.sql:
 INSERT INTO asset.copy_location (name,owning_lib) VALUES (oils_i18n_gettext('Stacks'),1);
 INSERT INTO asset.call_number VALUES (-1,1,NOW(),1,NOW(),-1,1,'UNCATALOGED');
+
+-- some more from 002.schema.config.sql:
+INSERT INTO config.xml_transform VALUES ( 'marcxml', 'http://www.loc.gov/MARC21/slim', 'marc', '---' );
+INSERT INTO config.xml_transform VALUES ( 'mods', 'http://www.loc.gov/mods/', 'mods', '');
+INSERT INTO config.xml_transform VALUES ( 'mods3', 'http://www.loc.gov/mods/v3', 'mods3', '');
+INSERT INTO config.xml_transform VALUES ( 'mods32', 'http://www.loc.gov/mods/v3', 'mods32', '');
+
+-- circ matrix
+INSERT INTO config.circ_matrix_matchpoint (org_unit,grp) VALUES (1,1);
+INSERT INTO config.circ_matrix_ruleset (matchpoint,duration_rule,recurring_fine_rule,max_fine_rule) VALUES (1,11,1,1);
+
+-- Staged Search (for default matchpoints)
+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);
+
diff --git a/Open-ILS/src/sql/Pg/951.data.MODS-xsl.sql b/Open-ILS/src/sql/Pg/951.data.MODS-xsl.sql
new file mode 100644 (file)
index 0000000..9f610c4
--- /dev/null
@@ -0,0 +1,2143 @@
+UPDATE config.xml_transform SET xslt=$$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xlink="http://www.w3.org/TR/xlink" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns="http://www.loc.gov/mods/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="marc">
+       <xsl:output method="xml" indent="yes"/>
+       <!-- This stylesheet is for MODS Version 2-->
+       
+<!--   trail 1/04 fixes 
+               1 place code/text can't be in same "place" element
+               2 form doesn't have "uncontrolled" subelement
+               3 related items have notes before identifiers
+               4. Title: partnumber/partnames movedoutside title element
+               5. roles: both $e and $4 on X00 allowed, not choice: first of $e, $4.
+               6.  041 tag: datafield, not controlfield
+               7. removed marc:datafield[@tag=775] from related item type=related
+               8. related origininfo/place/code, publisher, edition added for 775f, 76x-78x $b $d
+               9. related language added for 775$e
+               10.  subject authority ind2     fix
+       -->
+       <xsl:template match="/">
+               <xsl:choose>
+                       <xsl:when test="marc:collection">
+                               <modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/ http://www.loc.gov/standards/mods/mods.xsd">
+                                       <xsl:for-each select="marc:collection/marc:record">
+                                               <mods>
+                                                       <xsl:call-template name="marcRecord"/>
+                                               </mods>
+                                       </xsl:for-each>
+                               </modsCollection>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/ http://www.loc.gov/standards/mods/mods.xsd">
+                                       <xsl:for-each select="marc:record">
+                                               <xsl:call-template name="marcRecord"/>
+                                       </xsl:for-each>
+                               </mods>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="marcRecord">
+                       <xsl:variable name="leader" select="marc:leader"/>
+                       <xsl:variable name="leader6" select="substring($leader,7,1)"/>
+                       <xsl:variable name="leader7" select="substring($leader,8,1)"/>
+                       <xsl:variable name="controlField008" select="marc:controlfield[@tag=008]"/>
+
+                       <xsl:variable name="typeOf008">
+                               <xsl:choose>
+                                       <xsl:when test="$leader6='a'">
+                                               <xsl:choose>
+                                                       <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
+                                                       <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
+                                               </xsl:choose>
+                                       </xsl:when>
+                                       <xsl:when test="$leader6='t'">BK</xsl:when>
+                                       <xsl:when test="$leader6='p'">MM</xsl:when>
+                                       <xsl:when test="$leader6='m'">CF</xsl:when>
+                                       <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
+                                       <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
+                                       <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
+                               </xsl:choose>
+                       </xsl:variable>
+
+
+
+
+                       <xsl:for-each select="marc:datafield[@tag=245]">
+                               <titleInfo>
+                                       <xsl:variable name="title">
+                                               <xsl:choose>
+                                                       <xsl:when test="marc:subfield[@code='b']">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="axis">b</xsl:with-param>
+                                                                       <xsl:with-param name="beforeCodes">afghk</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:when>
+                                                       <xsl:otherwise>
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">abfghk</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:otherwise>
+                                               </xsl:choose>
+                                       </xsl:variable>
+                                       <xsl:choose>
+                                               <xsl:when test="@ind2&gt;0">
+                                                       <nonSort>
+                                                               <xsl:value-of select="substring($title,1,@ind2)"/>
+                                                       </nonSort>
+                                                       <title>
+                                                               <xsl:value-of select="substring($title,@ind2+1)"/>
+                                                       </title>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <title>
+                                                               <xsl:value-of select="$title"/>
+                                                       </title>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                                       <xsl:if test="marc:subfield[@code='b']">
+                                               <subTitle>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                                               <xsl:with-param name="axis">b</xsl:with-param>
+                                                                               <xsl:with-param name="anyCodes">b</xsl:with-param>
+                                                                               <xsl:with-param name="afterCodes">afghk</xsl:with-param>
+                                                                       </xsl:call-template>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </subTitle>
+                                       </xsl:if>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=210]">
+                               <titleInfo type="abbreviated">
+                                       <title>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=242]">
+                               <titleInfo type="translated">
+                                       <title>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abh</xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=246]">
+                               <titleInfo type="alternative">
+                                       <xsl:for-each select="marc:subfield[@code='i']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:value-of select="text()"/>
+                                               </xsl:attribute>
+                                       </xsl:for-each>
+                                       <title>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abfh</xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
+                               <titleInfo type="uniform">
+                                       <title>
+                                               <xsl:variable name="str">
+                                                       <xsl:for-each select="marc:subfield">
+                                                               <xsl:if test="(contains('adfkmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
+                                                                       <xsl:value-of select="text()"/>
+                                                                       <xsl:text> </xsl:text>
+                                                               </xsl:if>
+                                                       </xsl:for-each>
+                                               </xsl:variable>
+                                               <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=740][@ind2!=2]">
+                               <titleInfo type="alternative">
+                                       <title>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">ah</xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=100]">
+                               <name type="personal">
+                                       <xsl:call-template name="nameABCDQ"/>
+                                       <xsl:call-template name="affiliation"/>
+                                       <role>
+                                               <text>creator</text>
+                                       </role>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                       </xsl:for-each>
+
+
+                       <xsl:for-each select="marc:datafield[@tag=110]">
+                               <name type="corporate">
+                                       <xsl:call-template name="nameABCDN"/>
+                                       <role>
+                                               <text>creator</text>
+                                       </role>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=111]">
+                               <name type="conference">
+                                       <xsl:call-template name="nameACDEQ"/>
+                                       <role>
+                                               <text>creator</text>
+                                       </role>
+                                       <xsl:for-each select="marc:subfield[@code='4']">
+                                               <role>
+                                                       <code>
+                                                               <xsl:value-of select="."/>
+                                                       </code>
+                                               </role>
+                                       </xsl:for-each>
+                               </name>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=700][not(marc:subfield[@code='t'])]">
+                               <name type="personal">
+                                       <xsl:call-template name="nameABCDQ"/>
+                                       <xsl:call-template name="affiliation"/>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=710][not(marc:subfield[@code='t'])]">
+                               <name type="corporate">
+                                       <xsl:call-template name="nameABCDN"/>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=711][not(marc:subfield[@code='t'])]">
+                               <name type="conference">
+                                       <xsl:call-template name="nameACDEQ"/>
+                                       <xsl:for-each select="marc:subfield[@code='4']">
+                                               <role>
+                                                       <code>
+                                                               <xsl:value-of select="."/>
+                                                       </code>
+                                               </role>
+                                       </xsl:for-each>
+                               </name>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=720][not(marc:subfield[@code='t'])]">
+                               <name>
+                                       <xsl:if test="@ind1=1">
+                                               <xsl:attribute name="type">personal</xsl:attribute>
+                                       </xsl:if>
+                                       <namePart>
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </namePart>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                       </xsl:for-each>
+
+                       <typeOfResource>
+                               <xsl:if test="$leader7='c'">
+                                       <xsl:attribute name="collection">yes</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
+                                       <xsl:attribute name="manuscript">yes</xsl:attribute>
+                               </xsl:if>
+
+                               <xsl:choose>
+                                       <xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
+                                       <xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
+                                       <xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
+                                       <xsl:when test="$leader6='i' or $leader6='j'">sound recording</xsl:when>
+                                       <xsl:when test="$leader6='k'">still image</xsl:when>
+                                       <xsl:when test="$leader6='g'">moving image</xsl:when>
+                                       <xsl:when test="$leader6='r'">three dimensional object</xsl:when>
+                                       <xsl:when test="$leader6='m'">software, multimedia</xsl:when>
+                                       <xsl:when test="$leader6='p'">mixed material</xsl:when>
+                               </xsl:choose>
+                       </typeOfResource>
+
+                       <xsl:if test="substring($controlField008,26,1)='d'">
+                               <genre authority="marc">globe</genre>
+                       </xsl:if>
+
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+                               <genre authority="marc">remote sensing image</genre>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='MP'">
+                               <xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+                                               <genre authority="marc">map</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+                                               <genre authority="marc">atlas</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='SE'">
+                               <xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-21='d'">
+                                               <genre authority="marc">database</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-21='l'">
+                                               <genre authority="marc">loose-leaf</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-21='m'">
+                                               <genre authority="marc">series</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-21='n'">
+                                               <genre authority="marc">newspaper</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-21='p'">
+                                               <genre authority="marc">periodical</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-21='w'">
+                                               <genre authority="marc">web site</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
+                               <xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"/>
+                               <xsl:choose>
+                                       <xsl:when test="contains($controlField008-24,'a')">
+                                               <genre authority="marc">abstract or summary</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'b')">
+                                               <genre authority="marc">bibliography</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'c')">
+                                               <genre authority="marc">catalog</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'d')">
+                                               <genre authority="marc">dictionary</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'e')">
+                                               <genre authority="marc">encyclopedia</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'f')">
+                                               <genre authority="marc">handbook</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'g')">
+                                               <genre authority="marc">legal article</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'i')">
+                                               <genre authority="marc">index</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'k')">
+                                               <genre authority="marc">discography</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'l')">
+                                               <genre authority="marc">legislation</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'m')">
+                                               <genre authority="marc">theses</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'n')">
+                                               <genre authority="marc">survey of literature</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'o')">
+                                               <genre authority="marc">review</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'p')">
+                                               <genre authority="marc">programmed text</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'q')">
+                                               <genre authority="marc">filmography</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'r')">
+                                               <genre authority="marc">directory</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'s')">
+                                               <genre authority="marc">statistics</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'t')">
+                                               <genre authority="marc">technical report</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'v')">
+                                               <genre authority="marc">legal case and case notes</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'w')">
+                                               <genre authority="marc">law report or digest</genre>
+                                       </xsl:when>
+                                       <xsl:when test="contains($controlField008-24,'z')">
+                                               <genre authority="marc">treaty</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                               <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-29='1'">
+                                               <genre authority="marc">conference publication</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='CF'">
+                               <xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-26='a'">
+                                               <genre authority="marc">numeric data</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-26='e'">
+                                               <genre authority="marc">database</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-26='f'">
+                                               <genre authority="marc">font</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-26='g'">
+                                               <genre authority="marc">game</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='BK'">
+                               <xsl:if test="substring($controlField008,25,1)='j'">
+                                       <genre authority="marc">patent</genre>
+                               </xsl:if>
+                               <xsl:if test="substring($controlField008,31,1)='1'">
+                                       <genre authority="marc">festschrift</genre>
+                               </xsl:if>
+
+                               <xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"/>
+                               <xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
+                                       <genre authority="marc">biography</genre>
+                               </xsl:if>
+
+                               <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-33='e'">
+                                               <genre authority="marc">essay</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='d'">
+                                               <genre authority="marc">drama</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='c'">
+                                               <genre authority="marc">comic strip</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='l'">
+                                               <genre authority="marc">fiction</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='h'">
+                                               <genre authority="marc">humor, satire</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='i'">
+                                               <genre authority="marc">letter</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='f'">
+                                               <genre authority="marc">novel</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='j'">
+                                               <genre authority="marc">short story</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='s'">
+                                               <genre authority="marc">speech</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='MU'">
+                               <xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"/>
+                               <xsl:if test="contains($controlField008-30-31,'b')">
+                                       <genre authority="marc">biography</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'c')">
+                                       <genre authority="marc">conference publication</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'d')">
+                                       <genre authority="marc">drama</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'e')">
+                                       <genre authority="marc">essay</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'f')">
+                                       <genre authority="marc">fiction</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'o')">
+                                       <genre authority="marc">folktale</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'h')">
+                                       <genre authority="marc">history</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'k')">
+                                       <genre authority="marc">humor, satire</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'m')">
+                                       <genre authority="marc">memoir</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'p')">
+                                       <genre authority="marc">poetry</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'r')">
+                                       <genre authority="marc">rehersal</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'g')">
+                                       <genre authority="marc">reporting</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'s')">
+                                       <genre authority="marc">sound</genre>
+                               </xsl:if>
+                               <xsl:if test="contains($controlField008-30-31,'l')">
+                                       <genre authority="marc">speech</genre>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$typeOf008='VM'">
+                               <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-33='a'">
+                                               <genre authority="marc">art original</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='b'">
+                                               <genre authority="marc">kit</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='c'">
+                                               <genre authority="marc">art reproduction</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='d'">
+                                               <genre authority="marc">diorama</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='f'">
+                                               <genre authority="marc">filmstrip</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='g'">
+                                               <genre authority="marc">legal article</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='i'">
+                                               <genre authority="marc">picture</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='k'">
+                                               <genre authority="marc">graphic</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='l'">
+                                               <genre authority="marc">technical drawing</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='m'">
+                                               <genre authority="marc">motion picture</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='n'">
+                                               <genre authority="marc">chart</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='o'">
+                                               <genre authority="marc">flash card</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='p'">
+                                               <genre authority="marc">microscope slide</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+                                               <genre authority="marc">model</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='r'">
+                                               <genre authority="marc">realia</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='s'">
+                                               <genre authority="marc">slide</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='t'">
+                                               <genre authority="marc">transparency</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='v'">
+                                               <genre authority="marc">videorecording</genre>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-33='w'">
+                                               <genre authority="marc">toy</genre>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <xsl:for-each select="marc:datafield[@tag=655]">
+                               <genre authority="marc">
+                                       <xsl:attribute name="authority">
+                                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                                       </xsl:attribute>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abvxyz</xsl:with-param>
+                                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                                       </xsl:call-template>
+                               </genre>
+                       </xsl:for-each>
+
+                       <originInfo>
+                               <xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"/>
+                               <!-- 1/04 fix -->                               
+                                       <xsl:if test="translate($MARCpublicationCode,'|','')">
+                                       <place>
+                                               <code authority="marc">
+                                                       <xsl:value-of select="$MARCpublicationCode"/>
+                                               </code>
+                                       </place>
+                                       </xsl:if>
+
+                                       <xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
+                                       <place>
+                                               <code authority="iso3166">
+                                                       <xsl:value-of select="."/>
+                                               </code>
+                                       </place>
+                                       </xsl:for-each>
+
+                                       <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
+                                       <place>
+                                               <text>
+                                                       <xsl:call-template name="chopPunctuationFront">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:call-template name="chopPunctuation">
+                                                                               <xsl:with-param name="chopString" select="."/>
+                                                                       </xsl:call-template>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </text>
+                                       </place>
+                                       </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
+                                       <xsl:choose>
+                                               <xsl:when test="@code='b'">
+                                                       <publisher>
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."/>
+                                                               </xsl:call-template>
+                                                       </publisher>
+                                               </xsl:when>
+                                               <xsl:when test="@code='c'">
+                                                       <dateIssued>
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."/>
+                                                               </xsl:call-template>
+                                                       </dateIssued>
+                                               </xsl:when>
+                                               <xsl:when test="@code='g'">
+                                                       <dateCreated>
+                                                               <xsl:value-of select="."/>
+                                                       </dateCreated>
+                                               </xsl:when>
+                                       </xsl:choose>
+                               </xsl:for-each>
+
+                               <xsl:variable name="dataField260c">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"/>
+                                       </xsl:call-template>
+                               </xsl:variable>
+
+                               <xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"/>
+                               <xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"/>
+                               <xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"/>
+
+                               <xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
+                                       <xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
+                                               <dateIssued encoding="marc">
+                                                       <xsl:value-of select="$controlField008-7-10"/>
+                                               </dateIssued>
+                                       </xsl:if>
+                               </xsl:if>
+
+                               <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                                       <xsl:if test="$controlField008-7-10">
+                                               <dateIssued encoding="marc" point="start">
+                                                       <xsl:value-of select="$controlField008-7-10"/>
+                                               </dateIssued>
+                                       </xsl:if>
+                               </xsl:if>
+
+                               <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                                       <xsl:if test="$controlField008-11-14">
+                                               <dateIssued encoding="marc" point="end">
+                                                       <xsl:value-of select="$controlField008-11-14"/>
+                                               </dateIssued>
+                                       </xsl:if>
+                               </xsl:if>
+
+                               <xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
+                                       <dateCaptured encoding="iso8601">
+                                               <xsl:value-of select="."/>
+                                       </dateCaptured>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
+                                       <dateCaptured encoding="iso8601" point="start">
+                                               <xsl:value-of select="."/>
+                                       </dateCaptured>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
+                                       <dateCaptured encoding="iso8601" point="end">
+                                               <xsl:value-of select="."/>
+                                       </dateCaptured>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
+                                       <edition>
+                                               <xsl:value-of select="."/>
+                                       </edition>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:leader">
+                                       <issuance>
+                                               <xsl:choose>
+                                                       <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
+                                                       <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
+                                               </xsl:choose>
+                                       </issuance>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
+                                       <frequency>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                                               </xsl:call-template>
+                                       </frequency>
+                               </xsl:for-each>
+                       </originInfo>
+
+                       <!-- 1/04 fix -->
+                       <xsl:for-each select="marc:datafield[@tag=041]">
+                               <xsl:for-each select="marc:subfield[@code='a' or @code='d' or @code='e']">
+                                       <language>
+                                               <xsl:choose>
+                                                       <xsl:when test="../marc:subfield[@code='2']">
+                                                               <xsl:attribute name="authority">rfc3066</xsl:attribute>
+                                                       </xsl:when>
+                                                       <xsl:otherwise>
+                                                               <xsl:attribute name="authority">iso639-2b</xsl:attribute>
+                                                       </xsl:otherwise>
+                                               </xsl:choose>
+                                               <xsl:value-of select="text()"/>
+                                       </language>
+                               </xsl:for-each>
+                       </xsl:for-each>
+
+                       <xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"/>
+                       <xsl:if test="$controlField008-35-37">
+                               <language authority="iso639-2b">
+                                       <xsl:value-of select="substring($controlField008,36,3)"/>
+                               </language>
+                       </xsl:if>
+
+                       <xsl:variable name="physicalDescription">
+                               <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a' or substring(.,12,1)='b']">
+                                       <digitalOrigin>reformatted digital</digitalOrigin>
+                               </xsl:if>
+
+                               <xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"/>
+                               <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+
+                               <xsl:variable name="check008-23">
+                                       <xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
+                                               <xsl:value-of select="true()"/>
+                                       </xsl:if>
+                               </xsl:variable>
+
+                               <xsl:variable name="check008-29">
+                                       <xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
+                                               <xsl:value-of select="true()"/>
+                                       </xsl:if>
+                               </xsl:variable>
+
+                               <xsl:choose>
+                                       <xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
+                                               <form authority="marcform">braille</form>
+                                       </xsl:when>
+                                       <xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
+                                               <form authority="marcform">print</form>
+                                       </xsl:when>
+                                       <xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
+                                               <form authority="marcform">electronic</form>
+                                       </xsl:when>
+                                       <xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
+                                               <form authority="marcform">microfiche</form>
+                                       </xsl:when>
+                                       <xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
+                                               <form authority="marcform">microfilm</form>
+                                       </xsl:when>
+                               </xsl:choose>
+
+                               <xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
+                                       <xsl:choose>
+                                               <xsl:when test="substring(text(),14,1)='a'">
+                                                       <reformattingQuality>access</reformattingQuality>
+                                               </xsl:when>
+                                               <xsl:when test="substring(text(),14,1)='p'">
+                                                       <reformattingQuality>preservation</reformattingQuality>
+                                               </xsl:when>
+                                               <xsl:when test="substring(text(),14,1)='r'">
+                                                       <reformattingQuality>replacement</reformattingQuality>
+                                               </xsl:when>
+                                       </xsl:choose>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)&gt;1]">
+                                       <internetMediaType>
+                                               <xsl:value-of select="."/>
+                                       </internetMediaType>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
+                                       <form><xsl:value-of select="."/></form>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=300]">
+                                       <extent>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abce</xsl:with-param>
+                                               </xsl:call-template>
+                                       </extent>
+                               </xsl:for-each>
+                       </xsl:variable>
+
+                       <xsl:if test="string-length(normalize-space($physicalDescription))">
+                               <physicalDescription>
+                                       <xsl:copy-of select="$physicalDescription"/>
+                               </physicalDescription>
+                       </xsl:if>
+
+                       <xsl:for-each select="marc:datafield[@tag=520]">
+                               <abstract>
+                                       <xsl:call-template name="uri"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </abstract>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=505]">
+                               <tableOfContents>
+                                       <xsl:call-template name="uri"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">agrt</xsl:with-param>
+                                       </xsl:call-template>
+                               </tableOfContents>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=521]">
+                               <targetAudience>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </targetAudience>
+                       </xsl:for-each>
+
+                       <xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
+                               <xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"/>
+                               <xsl:choose>
+                                       <xsl:when test="$controlField008-22='d'">
+                                               <targetAudience>adolescent</targetAudience>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-22='e'">
+                                               <targetAudience>adult</targetAudience>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-22='g'">
+                                               <targetAudience>general</targetAudience>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
+                                               <targetAudience>juvenile</targetAudience>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-22='a'">
+                                               <targetAudience>preschool</targetAudience>
+                                       </xsl:when>
+                                       <xsl:when test="$controlField008-22='f'">
+                                               <targetAudience>specialized</targetAudience>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:if>
+
+                       <!-- Not in mapping but in conversion -->
+                       <xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
+                               <note type="statement of responsibility">
+                                       <xsl:value-of select="."/>
+                               </note>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=500]">
+                               <note>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       <xsl:call-template name="uri"/>
+                               </note>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=511]">
+                               <note type="performers">
+                                       <xsl:call-template name="uri"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </note>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=518]">
+                               <note type="venue">
+                                       <xsl:call-template name="uri"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </note>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=506 or @tag=507 or @tag=508 or @tag=510 or @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=530 or @tag=533 or @tag=534 or @tag=535 or @tag=536 or @tag=538 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=583 or @tag=584 or @tag=585 or @tag=586]">
+                               <note>
+                                       <xsl:call-template name="uri"/>
+                                       <xsl:variable name="str">
+                                               <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                                       <xsl:value-of select="."/>
+                                                       <xsl:text> </xsl:text>
+                                               </xsl:for-each>
+                                       </xsl:variable>
+                                       <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                               </note>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
+                               <subject>
+                                       <cartographics>
+                                               <coordinates>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">defg</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </coordinates>
+                                       </cartographics>
+                               </subject>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=255]">
+                               <subject>
+                                       <cartographics>
+                                               <xsl:for-each select="marc:subfield[@code='c']">
+                                                       <coordinates>
+                                                               <xsl:value-of select="."/>
+                                                       </coordinates>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='a']">
+                                                       <scale>
+                                                               <xsl:value-of select="."/>
+                                                       </scale>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <projection>
+                                                               <xsl:value-of select="."/>
+                                                       </projection>
+                                               </xsl:for-each>
+                                       </cartographics>
+                               </subject>
+                       </xsl:for-each>
+
+                       <xsl:apply-templates select="marc:datafield[653 &gt;= @tag and @tag &gt;= 600]"/>
+
+                       <xsl:for-each select="marc:datafield[@tag=752]">
+                               <subject>
+                                       <hierarchicalGeographic>
+                                               <xsl:for-each select="marc:subfield[@code='a']">
+                                                       <country>
+                                                               <xsl:value-of select="."/>
+                                                       </country>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <state>
+                                                               <xsl:value-of select="."/>
+                                                       </state>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='c']">
+                                                       <county>
+                                                               <xsl:value-of select="."/>
+                                                       </county>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='d']">
+                                                       <city>
+                                                               <xsl:value-of select="."/>
+                                                       </city>
+                                               </xsl:for-each>
+                                       </hierarchicalGeographic>
+                               </subject>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=050]">
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <classification authority="lcc">
+                                               <xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"/>
+                                               <xsl:text> </xsl:text>
+                                               <xsl:value-of select="text()"/>
+                                       </classification>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
+                                       <classification authority="lcc">
+                                               <xsl:value-of select="text()"/>
+                                       </classification>
+                               </xsl:for-each>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=082]">
+                               <classification authority="ddc">
+                                       <xsl:if test="marc:subfield[@code='2']">
+                                               <xsl:attribute name="edition">
+                                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=080]">
+                               <classification authority="udc">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abx</xsl:with-param>
+                                       </xsl:call-template>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=060]">
+                               <classification authority="nlm">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
+                               <classification authority="sudocs">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
+                               <classification authority="candoc">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=086]">
+                               <classification>
+                                       <xsl:attribute name="authority">
+                                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                                       </xsl:attribute>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=084]">
+                               <classification>
+                                       <xsl:attribute name="authority">
+                                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                                       </xsl:attribute>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </classification>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=440]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">av</xsl:with-param>
+                                                       </xsl:call-template>                                                                                                            
+                                               </title>
+                                               <!-- 1/04 fix -->
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">av</xsl:with-param>
+                                                       </xsl:call-template>                                                    
+                                               </title>
+                                               <!-- 1/04 fix -->
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=534]">
+                               <relatedItem type="original">
+                                       <xsl:call-template name="relatedTitle"/>
+                                       <xsl:call-template name="relatedName"/>
+                                       <xsl:call-template name="relatedIdentifierISSN"/>
+                                       <xsl:for-each select="marc:subfield[@code='z']">
+                                               <identifier type="isbn">
+                                                       <xsl:value-of select="."/>
+                                               </identifier>
+                                       </xsl:for-each>
+                                       <xsl:call-template name="relatedNote"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
+                               <relatedItem>
+                                       <xsl:call-template name="constituentOrRelatedType"/>
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                                       <name type="personal">
+                                               <namePart>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">abcq</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </namePart>
+                                               <xsl:call-template name="nameDate"/>
+                                               <xsl:for-each select="marc:subfield[@code='e']">
+                                                       <role>
+                                                               <text>
+                                                                       <xsl:value-of select="."/>
+                                                               </text>
+                                                       </role>
+                                               </xsl:for-each>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                                       <xsl:call-template name="relatedIdentifierISSN"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
+                               <relatedItem>
+                                       <xsl:call-template name="constituentOrRelatedType"/>
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="relatedPart"/>
+                                       </titleInfo>
+                                       <name type="corporate">
+                                               <xsl:for-each select="marc:subfield[@code='a']">
+                                                       <namePart>
+                                                               <xsl:value-of select="."/>
+                                                       </namePart>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <namePart>
+                                                               <xsl:value-of select="."/>
+                                                       </namePart>
+                                               </xsl:for-each>
+                                               <xsl:variable name="tempNamePart">
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:variable>
+                                               <xsl:if test="normalize-space($tempNamePart)">
+                                                       <namePart>
+                                                               <xsl:value-of select="$tempNamePart"/>
+                                                       </namePart>
+                                               </xsl:if>
+                                               <xsl:for-each select="marc:subfield[@code='e']">
+                                                       <role>
+                                                               <text>
+                                                                       <xsl:value-of select="."/>
+                                                               </text>
+                                                       </role>
+                                               </xsl:for-each>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                                       <xsl:call-template name="relatedIdentifierISSN"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
+                               <relatedItem>
+                                       <xsl:call-template name="constituentOrRelatedType"/>
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="relatedPart"/>
+                                       </titleInfo>
+                                       <name type="conference">
+                                               <namePart>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </namePart>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                                       <xsl:call-template name="relatedIdentifierISSN"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
+                               <relatedItem>
+                                       <xsl:call-template name="constituentOrRelatedType"/>
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                                       <xsl:call-template name="relatedForm"/>
+                                       <xsl:call-template name="relatedIdentifierISSN"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
+                               <relatedItem>
+                                       <xsl:call-template name="constituentOrRelatedType"/>
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                               </title>
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                                       <xsl:call-template name="relatedForm"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
+                               <relatedItem type="series">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+                       <!-- 1/04  fix removed 775 -->
+                       <xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
+                               <relatedItem type="related">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=775]">
+                               <relatedItem type="otherVersion">
+                                       <xsl:call-template name="relatedItem76X-78X"/>                                  
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
+                               <relatedItem type="constituent">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
+                               <relatedItem type="host">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=776]">
+                               <relatedItem type="otherFormat">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=780]">
+                               <relatedItem type="preceding">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=785]">
+                               <relatedItem type="succeeding">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=786]">
+                               <relatedItem type="original">
+                                       <xsl:call-template name="relatedItem76X-78X"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=800]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                                       <name type="personal">
+                                               <namePart>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                                               <xsl:with-param name="anyCodes">abcq</xsl:with-param>
+                                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                                               <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                                                       </xsl:call-template>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </namePart>
+                                               <xsl:call-template name="nameDate"/>
+                                               <xsl:for-each select="marc:subfield[@code='e']">
+                                                       <role>
+                                                               <text>
+                                                                       <xsl:value-of select="."/>
+                                                               </text>
+                                                       </role>
+                                               </xsl:for-each>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=810]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="relatedPart"/>
+                                       </titleInfo>
+                                       <name type="corporate">
+                                               <xsl:for-each select="marc:subfield[@code='a']">
+                                                       <namePart>
+                                                               <xsl:value-of select="."/>
+                                                       </namePart>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <namePart>
+                                                               <xsl:value-of select="."/>
+                                                       </namePart>
+                                               </xsl:for-each>
+                                               <namePart>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </namePart>
+                                               <xsl:for-each select="marc:subfield[@code='e']">
+                                                       <role>
+                                                               <text>
+                                                                       <xsl:value-of select="."/>
+                                                               </text>
+                                                       </role>
+                                               </xsl:for-each>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=811]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="relatedPart"/>
+                                       </titleInfo>
+                                       <name type="conference">
+                                               <namePart>
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                               <xsl:with-param name="axis">t</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </namePart>
+                                       </name>
+                                       <xsl:call-template name="relatedForm"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=830]">
+                               <relatedItem type="series">
+                                       <titleInfo>
+                                               <title>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </title>
+                                               <xsl:call-template name="part"/>
+                                       </titleInfo>
+                                       <xsl:call-template name="relatedForm"/>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=856][@ind2=2]/marc:subfield[@code='q']">
+                               <relatedItem>
+                                       <internetMediaType>
+                                               <xsl:value-of select="."/>
+                                       </internetMediaType>
+                               </relatedItem>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=020]">
+                               <identifier type="isbn">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=024][@ind1=0]">
+                               <identifier type="isrc">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=024][@ind1=2]">
+                               <identifier type="ismn">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=022]">
+                               <identifier type="issn">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=010]">
+                               <identifier type="lccn">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=028]">
+                               <identifier>
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:attribute name="type">
+                                               <xsl:choose>
+                                                       <xsl:when test="@ind1=0">issue number</xsl:when>
+                                                       <xsl:when test="@ind1=1">matrix number</xsl:when>
+                                                       <xsl:when test="@ind1=2">music plate</xsl:when>
+                                                       <xsl:when test="@ind1=3">music publisher</xsl:when>
+                                                       <xsl:when test="@ind1=4">videorecording identifier</xsl:when>
+                                               </xsl:choose>
+                                       </xsl:attribute>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=024][@ind1=4]">
+                               <identifier type="sici">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=037]">
+                               <identifier type="stock number">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+                               <identifier>
+                                       <xsl:call-template name="displayLabel"/>
+                                       <xsl:attribute name="type">
+                                               <xsl:choose>
+                                                       <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi:')">doi</xsl:when>
+                                                       <xsl:otherwise>uri</xsl:otherwise>
+                                               </xsl:choose>
+                                       </xsl:attribute>
+                                       <xsl:value-of select="marc:subfield[@code='u']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
+                               <identifier type="upc">
+                                       <xsl:call-template name="isInvalid"/>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=852]">
+                               <location>
+                                       <xsl:call-template name="displayLabel"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abj</xsl:with-param>
+                                       </xsl:call-template>
+                               </location>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=506]">
+                               <accessCondition type="restrictionOnAccess">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcd35</xsl:with-param>
+                                       </xsl:call-template>
+                               </accessCondition>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=540]">
+                               <accessCondition type="useAndReproduction">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcde35</xsl:with-param>
+                                       </xsl:call-template>
+                               </accessCondition>
+                       </xsl:for-each>
+
+                       <recordInfo>
+                               <xsl:for-each select="marc:datafield[@tag=040]">
+                                       <recordContentSource>
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </recordContentSource>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:controlfield[@tag=008]">
+                                       <recordCreationDate encoding="marc">
+                                               <xsl:value-of select="substring(.,1,6)"/>
+                                       </recordCreationDate>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:controlfield[@tag=005]">
+                                       <recordChangeDate encoding="iso8601">
+                                               <xsl:value-of select="."/>
+                                       </recordChangeDate>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:controlfield[@tag=001]">
+                                       <recordIdentifier>
+                                               <xsl:if test="../marc:controlfield[@tag=003]">
+                                                       <xsl:attribute name="source">
+                                                               <xsl:value-of select="../marc:controlfield[@tag=003]"/>
+                                                       </xsl:attribute>
+                                               </xsl:if>
+                                               <xsl:value-of select="."/>
+                                       </recordIdentifier>
+                               </xsl:for-each>
+
+                               <xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+                                       <languageOfCataloging>
+                                               <xsl:value-of select="."/>
+                                       </languageOfCataloging>
+                               </xsl:for-each>
+                       </recordInfo>
+       </xsl:template>
+
+       <xsl:template name="displayForm">
+               <xsl:for-each select="marc:subfield[@code='c']">
+                       <displayForm>
+                               <xsl:value-of select="."/>
+                       </displayForm>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="affiliation">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <affiliation>
+                               <xsl:value-of select="."/>
+                       </affiliation>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="uri">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <xsl:attribute name="xlink:href">
+                               <xsl:value-of select="."/>
+                       </xsl:attribute>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="role">
+       <!-- 1/04 fix -->
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <role>
+                               <text>
+                                       <xsl:value-of select="text()"/>
+                               </text>
+                       </role>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='4']">
+                       <role>
+                               <code>
+                               <xsl:value-of select="text()"/>
+                               </code>
+                       </role>
+               </xsl:for-each>                 
+       </xsl:template>
+
+       <xsl:template name="part">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">n</xsl:with-param>
+                               <xsl:with-param name="anyCodes">n</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <partNumber>
+                               <xsl:value-of select="$partNumber"/>
+                       </partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <partName>
+                               <xsl:value-of select="$partName"/>
+                       </partName>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedPart">
+               <xsl:for-each select="marc:subfield[@code='n'][preceding-sibling::marc:subfield[@code='t']]">
+                       <partNumber>
+                               <xsl:value-of select="."/>
+                       </partNumber>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='p']">
+                       <partName>
+                               <xsl:value-of select="."/>
+                       </partName>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedName">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <name>
+                               <namePart>
+                                       <xsl:value-of select="."/>
+                               </namePart>
+                       </name>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedForm">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <form>
+                                       <!--1/04 fix -->
+                       <!--            <unControlled>-->
+                                               <xsl:value-of select="."/>
+       <!--                            </unControlled>-->
+                               </form>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedExtent">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <extent>
+                                       <xsl:value-of select="."/>
+                               </extent>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedNote">
+               <xsl:for-each select="marc:subfield[@code='n']">
+                       <note>
+                               <xsl:value-of select="."/>
+                       </note>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifierISSN">
+               <xsl:for-each select="marc:subfield[@code='x']">
+                       <identifier type="issn">
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifierLocal">
+               <xsl:for-each select="marc:subfield[@code='w']">
+                       <identifier type="local">
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifier">
+               <xsl:for-each select="marc:subfield[@code='o']">
+                       <identifier>
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedItem76X-78X">
+               <xsl:call-template name="relatedTitle76X-78X"/>
+               <xsl:call-template name="relatedName"/>
+               <!-- 1/04 fix -->
+               <xsl:call-template name="relatedOriginInfo"/>
+               <xsl:call-template name="relatedLanguage"/>
+               <xsl:call-template name="relatedExtent"/>
+               <xsl:call-template name="relatedNote"/>
+               <xsl:call-template name="relatedIdentifier"/>
+               <xsl:call-template name="relatedIdentifierISSN"/>
+               <xsl:call-template name="relatedIdentifierLocal"/>
+               
+       </xsl:template>
+
+       <xsl:template name="subjectGeographicZ">
+               <geographic>
+                       <xsl:value-of select="."/>
+               </geographic>
+       </xsl:template>
+
+       <xsl:template name="subjectTemporalY">
+               <temporal>
+                       <xsl:value-of select="."/>
+               </temporal>
+       </xsl:template>
+
+       <xsl:template name="subjectTopic">
+               <topic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."/>
+                       </xsl:call-template>
+               </topic>
+       </xsl:template>
+
+       <xsl:template name="nameABCDN">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <namePart>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='b']">
+                       <namePart>
+                               <xsl:value-of select="."/>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+                       <namePart>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">cdn</xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="nameABCDQ">
+               <namePart>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcq</xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+               <xsl:call-template name="nameDate"/>
+       </xsl:template>
+
+       <xsl:template name="nameACDEQ">
+               <namePart>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">acdeq</xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+       </xsl:template>
+
+       <xsl:template name="constituentOrRelatedType">
+               <xsl:attribute name="type">
+                       <xsl:choose>
+                               <xsl:when test="@ind2=2">constituent</xsl:when>
+                               <xsl:otherwise>related</xsl:otherwise>
+                       </xsl:choose>
+               </xsl:attribute>
+       </xsl:template>
+
+       <xsl:template name="relatedTitle">
+               <xsl:for-each select="marc:subfield[@code='t']">
+                       <titleInfo>
+                               <title>
+                                       <xsl:value-of select="."/>
+                               </title>
+                       </titleInfo>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedTitle76X-78X">
+               <titleInfo>
+                       <xsl:for-each select="marc:subfield[@code='t']">
+                               <title>
+                                       <xsl:value-of select="."/>
+                               </title>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:subfield[@code='g']">
+                               <partNumber>
+                                       <xsl:value-of select="."/>
+                               </partNumber>
+                       </xsl:for-each>
+               </titleInfo>
+       </xsl:template>
+
+       <xsl:template name="nameDate">
+               <xsl:for-each select="marc:subfield[@code='d']">
+                       <namePart type="date">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="subjectAuthority">
+               <xsl:attribute name="authority">
+                       <xsl:choose>
+                               <xsl:when test="@ind2=0">lcsh</xsl:when>
+                               <xsl:when test="@ind2=1">lcshac</xsl:when>
+                               <xsl:when test="@ind2=2">mesh</xsl:when>
+                               <!-- 1/04 fix -->
+                               <xsl:when test="@ind2=3">nal</xsl:when>
+                               <xsl:when test="@ind2=5">csh</xsl:when>
+                               <xsl:when test="@ind2=6">rvm</xsl:when>
+                               <xsl:when test="@ind2=7">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:attribute>
+       </xsl:template>
+
+       <xsl:template name="subjectAnyOrder">
+               <xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
+                       <xsl:choose>
+                               <xsl:when test="@code='v'">
+                                       <xsl:call-template name="subjectTopic"/>
+                               </xsl:when>
+                               <xsl:when test="@code='x'">
+                                       <xsl:call-template name="subjectTopic"/>
+                               </xsl:when>
+                               <xsl:when test="@code='y'">
+                                       <xsl:call-template name="subjectTemporalY"/>
+                               </xsl:when>
+                               <xsl:when test="@code='z'">
+                                       <xsl:call-template name="subjectGeographicZ"/>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="specialSubfieldSelect">
+               <xsl:param name="anyCodes"/>
+               <xsl:param name="axis"/>
+               <xsl:param name="beforeCodes"/>
+               <xsl:param name="afterCodes"/>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($anyCodes, @code) or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+                                       <xsl:value-of select="text()"/>
+                                       <xsl:text> </xsl:text>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=600]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="personal">
+                               <namePart>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">abcq</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:call-template name="nameDate"/>
+                               <xsl:call-template name="affiliation"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=610]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="corporate">
+                               <xsl:for-each select="marc:subfield[@code='a']">
+                                       <namePart>
+                                               <xsl:value-of select="."/>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <namePart>
+                                               <xsl:value-of select="."/>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
+                                       <namePart>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">cdnp</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                               </xsl:if>
+                               <xsl:call-template name="role"/>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=611]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="conference">
+                               <namePart>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcdeqnp</xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:for-each select="marc:subfield[@code='4']">
+                                       <role>
+                                               <code>
+                                                       <xsl:value-of select="."/>
+                                               </code>
+                                       </role>
+                               </xsl:for-each>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=630]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">adfhklor</xsl:with-param>
+                                       </xsl:call-template>                                    
+                               </title>
+                               <!-- 1/04 fix -->
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=650]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <topic>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abcd</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </topic>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+
+       <xsl:template match="marc:datafield[@tag=651]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+                               <geographic>
+                                       <xsl:value-of select="."/>
+                               </geographic>
+                       </xsl:for-each>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=653]">
+               <subject>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+                               <topic>
+                                       <xsl:value-of select="."/>
+                               </topic>
+                       </xsl:for-each>
+               </subject>
+       </xsl:template>
+       <!-- 1/04 fix -->
+       <xsl:template name="relatedOriginInfo">
+               <xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
+                       <originInfo>
+                               <xsl:if test="@tag=775">
+                                       <xsl:for-each select="marc:subfield[@code='f']">                        
+                                               <place>
+                                                       <code>                                                                                                                          
+                                                               <xsl:value-of select="."/>
+                                                       </code>
+                                               </place>
+                                       </xsl:for-each>
+                               </xsl:if>
+                               <xsl:for-each select="marc:subfield[@code='d']">
+                                       <publisher>
+                                               <xsl:value-of select="."/>
+                                       </publisher>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <edition>
+                                               <xsl:value-of select="."/>
+                                       </edition>
+                               </xsl:for-each>
+                       </originInfo>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedLanguage">
+               <xsl:if test="@tag=775 and marc:subfield[@code='e']">
+                       <language authority="iso639-2b">                        
+                               <xsl:value-of select="marc:subfield[@code='e']"/>
+                       </language>
+               </xsl:if>                               
+       </xsl:template>
+
+       <xsl:template name="displayLabel">
+               <xsl:if test="marc:subfield[@code='3']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='3']"/>
+                       </xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="isInvalid">
+               <xsl:if test="marc:subfield[@code='z']">
+                       <xsl:attribute name="invalid">yes</xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="script">
+               <xsl:param name="scriptCode"/>
+               <xsl:attribute name="script">
+                       <xsl:choose>
+                               <xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
+                               <xsl:when test="$scriptCode='(B'">Latin</xsl:when>
+                               <xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
+                               <xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
+                               <xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
+                               <xsl:when test="$scriptCode='(S'">Greek</xsl:when>
+                       </xsl:choose>
+               </xsl:attribute>
+       </xsl:template>
+       <xsl:template name="datafield">
+               <xsl:param name="tag"/>
+               <xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="subfields"/>
+               <xsl:element name="marc:datafield">
+                       <xsl:attribute name="tag">
+                               <xsl:value-of select="$tag"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind1">
+                               <xsl:value-of select="$ind1"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind2">
+                               <xsl:value-of select="$ind2"/>
+                       </xsl:attribute>
+                       <xsl:copy-of select="$subfields"/>
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template name="subfieldSelect">
+               <xsl:param name="codes"/>
+               <xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($codes, @code)">
+                                       <xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+       </xsl:template>
+
+       <xsl:template name="buildSpaces">
+               <xsl:param name="spaces"/>
+               <xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
+               <xsl:if test="$spaces>0">
+                       <xsl:value-of select="$char"/>
+                       <xsl:call-template name="buildSpaces">
+                               <xsl:with-param name="spaces" select="$spaces - 1"/>
+                               <xsl:with-param name="char" select="$char"/>
+                       </xsl:call-template>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuation">
+               <xsl:param name="chopString"/>
+               <xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+                                       <xsl:with-param name="punctuation" select="$punctuation"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuationFront">
+               <xsl:param name="chopString"/>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+                               <xsl:call-template name="chopPunctuationFront">
+                                       <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>
+$$ WHERE name = 'mods';
+
diff --git a/Open-ILS/src/sql/Pg/952.data.MODS3-xsl.sql b/Open-ILS/src/sql/Pg/952.data.MODS3-xsl.sql
new file mode 100644 (file)
index 0000000..ee6d1b7
--- /dev/null
@@ -0,0 +1,2863 @@
+UPDATE config.xml_transform SET xslt=$$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xlink marc">
+       <xsl:include href="MARC21slimUtils.xsl"/>
+       <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+
+<!--
+Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
+
+Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
+
+Revision 1.7 2004/03/25 08:29 jrad
+
+Revision 1.6 various validation fixes 2004/02/20 ntra
+
+Revision 1.5  2003/10/02 16:18:58  ntra
+MODS2 to MODS3 updates, language unstacking and 
+de-duping, chopPunctuation expanded
+
+Revision 1.3  2003/04/03 00:07:19  ntra
+Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
+
+Revision 1.2  2003/03/24 19:37:42  ckeith
+Added Log Comment
+
+-->
+       <xsl:template match="/">
+               <xsl:choose>
+                       <xsl:when test="marc:collection">
+                               <modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd">
+                                       <xsl:for-each select="marc:collection/marc:record">
+                                               <mods version="3.0">
+                                                       <xsl:call-template name="marcRecord"/>
+                                               </mods>
+                                       </xsl:for-each>
+                               </modsCollection>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <mods version="3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd">
+                                       <xsl:for-each select="marc:record">
+                                               <xsl:call-template name="marcRecord"/>
+                                       </xsl:for-each>
+                               </mods>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="marcRecord">
+               <xsl:variable name="leader" select="marc:leader"/>
+               <xsl:variable name="leader6" select="substring($leader,7,1)"/>
+               <xsl:variable name="leader7" select="substring($leader,8,1)"/>
+               <xsl:variable name="controlField008" select="marc:controlfield[@tag=008]"/>
+               <xsl:variable name="typeOf008">
+                       <xsl:choose>
+                               <xsl:when test="$leader6='a'">
+                                       <xsl:choose>
+                                               <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
+                                               <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
+                                       </xsl:choose>
+                               </xsl:when>
+                               <xsl:when test="$leader6='t'">BK</xsl:when>
+                               <xsl:when test="$leader6='p'">MM</xsl:when>
+                               <xsl:when test="$leader6='m'">CF</xsl:when>
+                               <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
+                               <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
+                               <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
+                       </xsl:choose>
+               </xsl:variable>
+
+               <xsl:for-each select="marc:datafield[@tag=245]">
+                       <titleInfo>
+                               <xsl:variable name="title">
+                                       <xsl:choose>
+                                               <xsl:when test="marc:subfield[@code='b']">
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="axis">b</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">afghk</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">abfgk</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:variable>
+
+                               <xsl:variable name="titleChop">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="$title"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:variable>
+                               <xsl:choose>
+                                       <xsl:when test="@ind2&gt;0">
+                                               <nonSort>
+                                                       <xsl:value-of select="substring($titleChop,1,@ind2)"/>
+                                               </nonSort>
+                                               <title>
+                                                       <xsl:value-of select="substring($titleChop,@ind2+1)"/>
+                                               </title>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <title>
+                                                       <xsl:value-of select="$titleChop"/>
+                                               </title>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                               <xsl:if test="marc:subfield[@code='b']">
+                                       <subTitle>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="axis">b</xsl:with-param>
+                                                                       <xsl:with-param name="anyCodes">b</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">afghk</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </subTitle>
+                               </xsl:if>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=210]">
+                       <titleInfo type="abbreviated">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">a</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="subtitle"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=242]">
+                       <titleInfo type="translated">
+                       <!--09/01/04 Added subfield $y-->
+                       <xsl:for-each select="marc:subfield[@code='y']">
+                                       <xsl:attribute name="lang">
+                                               <xsl:value-of select="text()"/>
+                                       </xsl:attribute>
+                                       </xsl:for-each>
+                       <title>
+                       
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <!-- 1/04 removed $h, b -->
+                                                               <xsl:with-param name="codes">a</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                                       
+                               </title>
+                               
+                               
+                               <!-- 1/04 fix -->
+                               <xsl:call-template name="subtitle"/>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=246]">
+                       <titleInfo type="alternative">
+                               <xsl:for-each select="marc:subfield[@code='i']">
+                                       <xsl:attribute name="displayLabel">
+                                               <xsl:value-of select="text()"/>
+                                       </xsl:attribute>
+                               </xsl:for-each>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <!-- 1/04 removed $h, $b -->
+                                                               <xsl:with-param name="codes">af</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="subtitle"/>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
+                       <titleInfo type="uniform">
+                               <title>
+                                       <xsl:variable name="str">
+                                               <xsl:for-each select="marc:subfield">
+                                                       <xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
+                                                               <xsl:value-of select="text()"/>
+                                                               <xsl:text> </xsl:text>
+                                                       </xsl:if>
+                                               </xsl:for-each>
+                                       </xsl:variable>
+
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=740][@ind2!=2]">
+                       <titleInfo type="alternative">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">ah</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=100]">
+                       <name type="personal">
+                               <xsl:call-template name="nameABCDQ"/>
+                               <xsl:call-template name="affiliation"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=110]">
+                       <name type="corporate">
+                               <xsl:call-template name="nameABCDN"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=111]">
+                       <name type="conference">
+                               <xsl:call-template name="nameACDEQ"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=700][not(marc:subfield[@code='t'])]">
+                       <name type="personal">
+                               <xsl:call-template name="nameABCDQ"/>
+                               <xsl:call-template name="affiliation"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=710][not(marc:subfield[@code='t'])]">
+                       <name type="corporate">
+                               <xsl:call-template name="nameABCDN"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=711][not(marc:subfield[@code='t'])]">
+                       <name type="conference">
+                               <xsl:call-template name="nameACDEQ"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=720][not(marc:subfield[@code='t'])]">
+                       <name>
+                               <xsl:if test="@ind1=1">
+                                       <xsl:attribute name="type">
+                                               <xsl:text>personal</xsl:text>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <namePart>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </namePart>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+
+               <typeOfResource>
+                       <xsl:if test="$leader7='c'">
+                               <xsl:attribute name="collection">yes</xsl:attribute>
+                       </xsl:if>
+                       <xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
+                               <xsl:attribute name="manuscript">yes</xsl:attribute>
+                       </xsl:if>
+                       <xsl:choose>
+                               <xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
+                               <xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
+                               <xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
+                               <xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
+                               <xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
+                               <xsl:when test="$leader6='k'">still image</xsl:when>
+                               <xsl:when test="$leader6='g'">moving image</xsl:when>
+                               <xsl:when test="$leader6='r'">three dimensional object</xsl:when>
+                               <xsl:when test="$leader6='m'">software, multimedia</xsl:when>
+                               <xsl:when test="$leader6='p'">mixed material</xsl:when>
+                       </xsl:choose>
+               </typeOfResource>
+
+               <xsl:if test="substring($controlField008,26,1)='d'">
+                       <genre authority="marc">globe</genre>
+               </xsl:if>
+
+               <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+                       <genre authority="marc">remote sensing image</genre>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='MP'">
+                       <xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+                                       <genre authority="marc">map</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+                                       <genre authority="marc">atlas</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='SE'">
+                       <xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-21='d'">
+                                       <genre authority="marc">database</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='l'">
+                                       <genre authority="marc">loose-leaf</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='m'">
+                                       <genre authority="marc">series</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='n'">
+                                       <genre authority="marc">newspaper</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='p'">
+                                       <genre authority="marc">periodical</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='w'">
+                                       <genre authority="marc">web site</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
+                       <xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"/>
+                       <xsl:choose>
+                               <xsl:when test="contains($controlField008-24,'a')">
+                                       <genre authority="marc">abstract or summary</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'b')">
+                                       <genre authority="marc">bibliography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'c')">
+                                       <genre authority="marc">catalog</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'d')">
+                                       <genre authority="marc">dictionary</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'e')">
+                                       <genre authority="marc">encyclopedia</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'f')">
+                                       <genre authority="marc">handbook</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'g')">
+                                       <genre authority="marc">legal article</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'i')">
+                                       <genre authority="marc">index</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'k')">
+                                       <genre authority="marc">discography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'l')">
+                                       <genre authority="marc">legislation</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'m')">
+                                       <genre authority="marc">theses</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'n')">
+                                       <genre authority="marc">survey of literature</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'o')">
+                                       <genre authority="marc">review</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'p')">
+                                       <genre authority="marc">programmed text</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'q')">
+                                       <genre authority="marc">filmography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'r')">
+                                       <genre authority="marc">directory</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'s')">
+                                       <genre authority="marc">statistics</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'t')">
+                                       <genre authority="marc">technical report</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'v')">
+                                       <genre authority="marc">legal case and case notes</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'w')">
+                                       <genre authority="marc">law report or digest</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'z')">
+                                       <genre authority="marc">treaty</genre>
+                               </xsl:when>
+                       </xsl:choose>
+                       <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-29='1'">
+                                       <genre authority="marc">conference publication</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='CF'">
+                       <xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-26='a'">
+                                       <genre authority="marc">numeric data</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='e'">
+                                       <genre authority="marc">database</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='f'">
+                                       <genre authority="marc">font</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='g'">
+                                       <genre authority="marc">game</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='BK'">
+                       <xsl:if test="substring($controlField008,25,1)='j'">
+                               <genre authority="marc">patent</genre>
+                       </xsl:if>
+                       <xsl:if test="substring($controlField008,31,1)='1'">
+                               <genre authority="marc">festschrift</genre>
+                       </xsl:if>
+
+                       <xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"/>
+                       <xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
+                               <genre authority="marc">biography</genre>
+                       </xsl:if>
+
+                       <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-33='e'">
+                                       <genre authority="marc">essay</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='d'">
+                                       <genre authority="marc">drama</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='c'">
+                                       <genre authority="marc">comic strip</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='l'">
+                                       <genre authority="marc">fiction</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='h'">
+                                       <genre authority="marc">humor, satire</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='i'">
+                                       <genre authority="marc">letter</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='f'">
+                                       <genre authority="marc">novel</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='j'">
+                                       <genre authority="marc">short story</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='s'">
+                                       <genre authority="marc">speech</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='MU'">
+                       <xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"/>
+                       <xsl:if test="contains($controlField008-30-31,'b')">
+                               <genre authority="marc">biography</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'c')">
+                               <genre authority="marc">conference publication</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'d')">
+                               <genre authority="marc">drama</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'e')">
+                               <genre authority="marc">essay</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'f')">
+                               <genre authority="marc">fiction</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'o')">
+                               <genre authority="marc">folktale</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'h')">
+                               <genre authority="marc">history</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'k')">
+                               <genre authority="marc">humor, satire</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'m')">
+                               <genre authority="marc">memoir</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'p')">
+                               <genre authority="marc">poetry</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'r')">
+                               <genre authority="marc">rehearsal</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'g')">
+                               <genre authority="marc">reporting</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'s')">
+                               <genre authority="marc">sound</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'l')">
+                               <genre authority="marc">speech</genre>
+                       </xsl:if>
+               </xsl:if>
+
+               <xsl:if test="$typeOf008='VM'">
+                       <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-33='a'">
+                                       <genre authority="marc">art original</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='b'">
+                                       <genre authority="marc">kit</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='c'">
+                                       <genre authority="marc">art reproduction</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='d'">
+                                       <genre authority="marc">diorama</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='f'">
+                                       <genre authority="marc">filmstrip</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='g'">
+                                       <genre authority="marc">legal article</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='i'">
+                                       <genre authority="marc">picture</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='k'">
+                                       <genre authority="marc">graphic</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='l'">
+                                       <genre authority="marc">technical drawing</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='m'">
+                                       <genre authority="marc">motion picture</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='n'">
+                                       <genre authority="marc">chart</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='o'">
+                                       <genre authority="marc">flash card</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='p'">
+                                       <genre authority="marc">microscope slide</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+                                       <genre authority="marc">model</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='r'">
+                                       <genre authority="marc">realia</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='s'">
+                                       <genre authority="marc">slide</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='t'">
+                                       <genre authority="marc">transparency</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='v'">
+                                       <genre authority="marc">videorecording</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='w'">
+                                       <genre authority="marc">toy</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:for-each select="marc:datafield[@tag=655]">
+                       <genre authority="marc">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:attribute>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abvxyz</xsl:with-param>
+                                       <xsl:with-param name="delimeter">-</xsl:with-param>
+                               </xsl:call-template>
+                       </genre>
+               </xsl:for-each>
+
+               <originInfo>
+                       <xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"/>
+
+                       <xsl:if test="translate($MARCpublicationCode,'|','')">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">code</xsl:attribute>
+                                               <xsl:attribute name="authority">marccountry</xsl:attribute>
+                                               <xsl:value-of select="$MARCpublicationCode"/>
+                                       </placeTerm>
+                               </place>
+                       </xsl:if>
+
+                       <xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">code</xsl:attribute>
+                                               <xsl:attribute name="authority">iso3166</xsl:attribute>
+                                               <xsl:value-of select="."/>
+                                       </placeTerm>
+                               </place>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">text</xsl:attribute>
+                                               <xsl:call-template name="chopPunctuationFront">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."/>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </placeTerm>
+                               </place>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
+                               <dateValid point="start">
+                                       <xsl:value-of select="."/>
+                               </dateValid>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
+                               <dateValid point="end">
+                                       <xsl:value-of select="."/>
+                               </dateValid>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
+                               <dateModified>
+                                       <xsl:value-of select="."/>
+                               </dateModified>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
+                               <xsl:choose>
+                                       <xsl:when test="@code='b'">
+                                               <publisher>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                               <xsl:with-param name="punctuation">
+                                                                       <xsl:text>:,;/ </xsl:text>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </publisher>
+                                       </xsl:when>
+                                       <xsl:when test="@code='c'">
+                                               <dateIssued>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </dateIssued>
+                                       </xsl:when>
+                                       <xsl:when test="@code='g'">
+                                               <dateCreated>
+                                                       <xsl:value-of select="."/>
+                                               </dateCreated>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:for-each>
+
+                       <xsl:variable name="dataField260c">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"/>
+                               </xsl:call-template>
+                       </xsl:variable>
+
+                       <xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"/>
+                       <xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"/>
+                       <xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"/>
+
+                       <xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
+                               <xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
+                                       <dateIssued encoding="marc">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                               <xsl:if test="$controlField008-7-10">
+                                       <dateIssued encoding="marc" point="start">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <dateIssued encoding="marc" point="end">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$controlField008-6='q'">
+                               <xsl:if test="$controlField008-7-10">
+                                       <dateIssued encoding="marc" point="start" qualifier="questionable">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$controlField008-6='q'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <dateIssued encoding="marc" point="end" qualifier="questionable">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:if test="$controlField008-6='t'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <copyrightDate encoding="marc">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </copyrightDate>
+                               </xsl:if>
+                       </xsl:if>
+
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
+                               <dateCaptured encoding="iso8601">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
+                               <dateCaptured encoding="iso8601" point="start">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
+                               <dateCaptured encoding="iso8601" point="end">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
+                               <edition>
+                                       <xsl:value-of select="."/>
+                               </edition>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:leader">
+                               <issuance>
+                                       <xsl:choose>
+                                               <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
+                                               <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
+                                       </xsl:choose>
+                               </issuance>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
+                               <frequency>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </frequency>
+                       </xsl:for-each>
+               </originInfo>
+               <xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"/>
+               <xsl:if test="$controlField008-35-37">
+                       <language>
+                               <languageTerm authority="iso639-2b" type="code">
+                                       <xsl:value-of select="substring($controlField008,36,3)"/>
+                               </languageTerm>
+                       </language>
+               </xsl:if>
+
+               <xsl:for-each select="marc:datafield[@tag=041]">
+
+                       <!--                    <xsl:variable name="langCodes">                 
+                               <xsl:copy-of select="marc:subfield[@code='a'or @code='d' or @code='e' or @code='2']"/>
+                       </xsl:variable>
+                       -->
+                       <xsl:variable name="langCodes" select="marc:subfield[@code='a'or @code='d' or @code='e' or @code='2']"/>
+
+                       <xsl:choose>
+                               <xsl:when test="marc:subfield[@code='2']='rfc3066'">
+                                       <!-- not stacked but could be repeated -->
+                                       <xsl:call-template name="rfcLanguages">
+                                               <xsl:with-param name="nodeNum">
+                                                       <xsl:value-of select="1"/>
+                                               </xsl:with-param>
+                                               <xsl:with-param name="usedLanguages">
+                                                       <xsl:text></xsl:text>
+                                               </xsl:with-param>
+                                               <xsl:with-param name="controlField008-35-37">
+                                                       <xsl:value-of select="$controlField008-35-37"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <!-- iso -->
+                                       <xsl:variable name="allLanguages">
+                                               <xsl:copy-of select="$langCodes"/>
+                                       </xsl:variable>
+                                       <xsl:variable name="currentLanguage">
+                                               <xsl:value-of select="substring($allLanguages,1,3)"/>
+                                       </xsl:variable>
+                                       <xsl:call-template name="isoLanguage">
+                                               <xsl:with-param name="currentLanguage">
+                                                       <xsl:value-of select="substring($allLanguages,1,3)"/>
+                                               </xsl:with-param>
+                                               <xsl:with-param name="remainingLanguages">
+                                                       <xsl:value-of select="substring($allLanguages,4,string-length($allLanguages)-3)"/>
+                                               </xsl:with-param>
+                                               <xsl:with-param name="usedLanguages">
+                                                       <xsl:if test="$controlField008-35-37">
+                                                               <xsl:value-of select="$controlField008-35-37"/>
+                                                       </xsl:if>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:for-each>
+
+               <xsl:variable name="physicalDescription">
+                       <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a' or substring(.,12,1)='b']">
+                               <digitalOrigin>reformatted digital</digitalOrigin>
+                       </xsl:if>
+
+                       <xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"/>
+                       <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+
+                       <xsl:variable name="check008-23">
+                               <xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
+                                       <xsl:value-of select="true()"/>
+                               </xsl:if>
+                       </xsl:variable>
+
+                       <xsl:variable name="check008-29">
+                               <xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
+                                       <xsl:value-of select="true()"/>
+                               </xsl:if>
+                       </xsl:variable>
+
+                       <xsl:choose>
+                               <xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
+                                       <form authority="marcform">braille</form>
+                               </xsl:when>
+                               <xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
+                                       <form authority="marcform">print</form>
+                               </xsl:when>
+                               <xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
+                                       <form authority="marcform">electronic</form>
+                               </xsl:when>
+                               <xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
+                                       <form authority="marcform">microfiche</form>
+                               </xsl:when>
+                               <xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
+                                       <form authority="marcform">microfilm</form>
+                               </xsl:when>
+                       </xsl:choose>
+                       <!-- 1/04 fix -->
+                       <xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+
+                       <xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
+                               <form>
+                                       <xsl:value-of select="."/>
+                               </form>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
+                               <xsl:choose>
+                                       <xsl:when test="substring(text(),14,1)='a'">
+                                               <reformattingQuality>access</reformattingQuality>
+                                       </xsl:when>
+                                       <xsl:when test="substring(text(),14,1)='p'">
+                                               <reformattingQuality>preservation</reformattingQuality>
+                                       </xsl:when>
+                                       <xsl:when test="substring(text(),14,1)='r'">
+                                               <reformattingQuality>replacement</reformattingQuality>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)&gt;1]">
+                               <internetMediaType>
+                                       <xsl:value-of select="."/>
+                               </internetMediaType>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=300]">
+                               <extent>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abce</xsl:with-param>
+                                       </xsl:call-template>
+                               </extent>
+                       </xsl:for-each>
+               </xsl:variable>
+
+               <xsl:if test="string-length(normalize-space($physicalDescription))">
+                       <physicalDescription>
+                               <xsl:copy-of select="$physicalDescription"/>
+                       </physicalDescription>
+               </xsl:if>
+
+               <xsl:for-each select="marc:datafield[@tag=520]">
+                       <abstract>
+                               <xsl:call-template name="uri"/>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </abstract>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=505]">
+                       <tableOfContents>
+                               <xsl:call-template name="uri"/>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">agrt</xsl:with-param>
+                               </xsl:call-template>
+                       </tableOfContents>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=521]">
+                       <targetAudience>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </targetAudience>
+               </xsl:for-each>
+
+               <xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
+                       <xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"/>
+                       <xsl:choose>
+                               <!-- 01/04 fix -->
+                               <xsl:when test="$controlField008-22='d'">
+                                       <targetAudience authority="marctarget">adolescent</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='e'">
+                                       <targetAudience authority="marctarget">adult</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='g'">
+                                       <targetAudience authority="marctarget">general</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
+                                       <targetAudience authority="marctarget">juvenile</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='a'">
+                                       <targetAudience authority="marctarget">preschool</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='f'">
+                                       <targetAudience authority="marctarget">specialized</targetAudience>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+
+               <xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
+                       <note type="statement of responsibility">
+                               <xsl:value-of select="."/>
+                       </note>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=500]">
+                       <note>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                               <xsl:call-template name="uri"/>
+                       </note>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=511]">
+                       <note type="performers">
+                               <xsl:call-template name="uri"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </note>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=518]">
+                       <note type="venue">
+                               <xsl:call-template name="uri"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </note>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=506 or @tag=507 or @tag=508 or  @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=530 or @tag=533 or @tag=534 or @tag=535 or @tag=536 or @tag=538 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=583 or @tag=584 or @tag=585 or @tag=586]">
+                       <note>
+                               <xsl:call-template name="uri"/>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."/>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                       </note>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
+                       <subject>
+                               <cartographics>
+                                       <coordinates>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">defg</xsl:with-param>
+                                               </xsl:call-template>
+                                       </coordinates>
+                               </cartographics>
+                       </subject>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=043]">
+                       <subject>
+                               <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+                                       <geographicCode>
+                                               <xsl:attribute name="authority">
+                                                       <xsl:if test="@code='a'">
+                                                               <xsl:text>marcgac</xsl:text>
+                                                       </xsl:if>
+                                                       <xsl:if test="@code='b'">
+                                                               <xsl:value-of select="following-sibling::marc:subfield[@code=2]"/>
+                                                       </xsl:if>
+                                                       <xsl:if test="@code='c'">
+                                                               <xsl:text>iso3166</xsl:text>
+                                                       </xsl:if>
+                                               </xsl:attribute>
+                                               <xsl:value-of select="self::marc:subfield"/>
+                                       </geographicCode>
+                               </xsl:for-each>
+                       </subject>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=255]">
+                       <subject>
+                               <cartographics>
+                                       <xsl:for-each select="marc:subfield[@code='c']">
+                                               <coordinates>
+                                                       <xsl:value-of select="."/>
+                                               </coordinates>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <scale>
+                                                       <xsl:value-of select="."/>
+                                               </scale>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <projection>
+                                                       <xsl:value-of select="."/>
+                                               </projection>
+                                       </xsl:for-each>
+                               </cartographics>
+                       </subject>
+               </xsl:for-each>
+
+               <xsl:apply-templates select="marc:datafield[653 &gt;= @tag and @tag &gt;= 600]"/>
+
+               <xsl:apply-templates select="marc:datafield[@tag=656]"/>
+
+               <xsl:for-each select="marc:datafield[@tag=752]">
+                       <subject>
+                               <hierarchicalGeographic>
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <country>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </country>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <state>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </state>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='c']">
+                                               <county>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </county>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='d']">
+                                               <city>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </city>
+                                       </xsl:for-each>
+                               </hierarchicalGeographic>
+                       </subject>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
+                       <subject>
+
+                               <xsl:choose>
+
+                                       <xsl:when test="@ind1=2">
+
+                                               <temporal encoding="iso8601" point="start">
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:value-of select="marc:subfield[@code='b'][1]"/>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </temporal>
+                                               <temporal encoding="iso8601" point="end">
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+
+
+                                                                       <xsl:value-of select="marc:subfield[@code='b'][2]"/>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </temporal>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <temporal encoding="iso8601">
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."/>
+                                                               </xsl:call-template>
+                                                       </temporal>
+                                               </xsl:for-each>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                       </subject>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=050]">
+                       <xsl:for-each select="marc:subfield[@code='b']">
+                               <classification authority="lcc">
+                                       <xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"/>
+                                       <xsl:text> </xsl:text>
+                                       <xsl:value-of select="text()"/>
+                               </classification>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
+                               <classification authority="lcc">
+                                       <xsl:value-of select="text()"/>
+                               </classification>
+                       </xsl:for-each>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=082]">
+                       <classification authority="ddc">
+                               <xsl:if test="marc:subfield[@code='2']">
+                                       <xsl:attribute name="edition">
+                                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=080]">
+                       <classification authority="udc">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abx</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=060]">
+                       <classification authority="nlm">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
+                       <classification authority="sudocs">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
+                       <classification authority="candoc">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=086]">
+                       <classification>
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:attribute>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=084]">
+                       <classification>
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:attribute>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=440]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">av</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">av</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=510]">
+                       <relatedItem type="isReferencedBy">
+                               <note>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcx3</xsl:with-param>
+                                       </xsl:call-template>
+                               </note>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=534]">
+                       <relatedItem type="original">
+                               <xsl:call-template name="relatedTitle"/>
+                               <xsl:call-template name="relatedName"/>
+                               <xsl:if test="marc:subfield[@code='b' or @code='c']">
+                                       <originInfo>
+                                               <xsl:for-each select="marc:subfield[@code='c']">
+                                                       <publisher>
+                                                               <xsl:value-of select="."/>
+                                                       </publisher>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <edition>
+                                                               <xsl:value-of select="."/>
+                                                       </edition>
+                                               </xsl:for-each>
+                                       </originInfo>
+                               </xsl:if>
+                               <xsl:call-template name="relatedIdentifierISSN"/>
+                               <xsl:for-each select="marc:subfield[@code='z']">
+                                       <identifier type="isbn">
+                                               <xsl:value-of select="."/>
+                                       </identifier>
+                               </xsl:for-each>
+                               <xsl:call-template name="relatedNote"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"/>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <name type="personal">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aq</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="termsOfAddress"/>
+                                       <xsl:call-template name="nameDate"/>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                               <xsl:call-template name="relatedIdentifierISSN"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"/>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </titleInfo>
+                               <name type="corporate">
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <namePart>
+                                                       <xsl:value-of select="."/>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <namePart>
+                                                       <xsl:value-of select="."/>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:variable name="tempNamePart">
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:variable>
+                                       <xsl:if test="normalize-space($tempNamePart)">
+                                               <namePart>
+                                                       <xsl:value-of select="$tempNamePart"/>
+                                               </namePart>
+                                       </xsl:if>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                               <xsl:call-template name="relatedIdentifierISSN"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"/>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </titleInfo>
+                               <name type="conference">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                               <xsl:call-template name="relatedIdentifierISSN"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"/>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"/>
+                               <xsl:call-template name="relatedIdentifierISSN"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"/>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
+                       <relatedItem type="series">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
+                       <relatedItem>
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=775]">
+                       <relatedItem type="otherVersion">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
+                       <relatedItem type="constituent">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
+                       <relatedItem type="host">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=776]">
+                       <relatedItem type="otherFormat">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=780]">
+                       <relatedItem type="preceding">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=785]">
+                       <relatedItem type="succeeding">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=786]">
+                       <relatedItem type="original">
+                               <xsl:call-template name="relatedItem76X-78X"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=800]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <name type="personal">
+                                       <namePart>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">aq</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="termsOfAddress"/>
+                                       <xsl:call-template name="nameDate"/>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=810]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </titleInfo>
+                               <name type="corporate">
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <namePart>
+                                                       <xsl:value-of select="."/>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+
+                                               <namePart>
+                                                       <xsl:value-of select="."/>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=811]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </titleInfo>
+                               <name type="conference">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=830]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=856][@ind2=2]/marc:subfield[@code='q']">
+                       <relatedItem>
+                               <internetMediaType>
+                                       <xsl:value-of select="."/>
+                               </internetMediaType>
+                       </relatedItem>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=020]">
+                       <identifier type="isbn">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=024][@ind1=0]">
+                       <identifier type="isrc">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=024][@ind1=2]">
+                       <identifier type="ismn">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=022]">
+                       <identifier type="issn">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=010]">
+                       <identifier type="lccn">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=028]">
+                       <identifier>
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:attribute name="type">
+                                       <xsl:choose>
+                                               <xsl:when test="@ind1=0">issue number</xsl:when>
+                                               <xsl:when test="@ind1=1">matrix number</xsl:when>
+                                               <xsl:when test="@ind1=2">music plate</xsl:when>
+                                               <xsl:when test="@ind1=3">music publisher</xsl:when>
+                                               <xsl:when test="@ind1=4">videorecording identifier</xsl:when>
+                                       </xsl:choose>
+                               </xsl:attribute>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">
+                                               <xsl:choose>
+                                                       <xsl:when test="@ind1=0">ba</xsl:when>
+                                                       <xsl:otherwise>ab</xsl:otherwise>
+                                               </xsl:choose>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=024][@ind1='4']">
+                       <identifier type="sici">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=037]">
+                       <identifier type="stock number">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+                       <identifier>
+                               <xsl:attribute name="type">
+                                       <xsl:choose>
+                                               <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')">doi</xsl:when>
+                                               <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')">hdl</xsl:when>
+                                               <xsl:otherwise>uri</xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:attribute>
+                               <xsl:choose>
+                                       <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
+                                               <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"/>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <xsl:value-of select="marc:subfield[@code='u']"/>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                       </identifier>
+                       <xsl:if test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
+                               <identifier type="hdl">
+                                       <xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">y3z</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"/>
+                               </identifier>
+                       </xsl:if>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
+                       <identifier type="upc">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+               <!-- 1/04 fix added $y -->
+               <xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+                       <location>
+                               <url>
+                                       <xsl:if test="marc:subfield[@code='y' or @code='3']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">y3</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="marc:subfield[@code='u']"/>
+                               </url>
+                       </location>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=852]">
+                       <location>
+                               <physicalLocation>
+                                       <xsl:call-template name="displayLabel"/>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abje</xsl:with-param>
+                                       </xsl:call-template>
+                               </physicalLocation>
+                       </location>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=506]">
+                       <accessCondition type="restrictionOnAccess">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abcd35</xsl:with-param>
+                               </xsl:call-template>
+                       </accessCondition>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=540]">
+                       <accessCondition type="useAndReproduction">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abcde35</xsl:with-param>
+                               </xsl:call-template>
+                       </accessCondition>
+               </xsl:for-each>
+
+               <recordInfo>
+                       <xsl:for-each select="marc:datafield[@tag=040]">
+                               <recordContentSource authority="marcorg">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </recordContentSource>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:controlfield[@tag=008]">
+                               <recordCreationDate encoding="marc">
+                                       <xsl:value-of select="substring(.,1,6)"/>
+                               </recordCreationDate>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:controlfield[@tag=005]">
+                               <recordChangeDate encoding="iso8601">
+                                       <xsl:value-of select="."/>
+                               </recordChangeDate>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:controlfield[@tag=001]">
+                               <recordIdentifier>
+                                       <xsl:if test="../marc:controlfield[@tag=003]">
+                                               <xsl:attribute name="source">
+                                                       <xsl:value-of select="../marc:controlfield[@tag=003]"/>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="."/>
+                               </recordIdentifier>
+                       </xsl:for-each>
+
+                       <xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+                               <languageOfCataloging>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="."/>
+                                       </languageTerm>
+                               </languageOfCataloging>
+                       </xsl:for-each>
+               </recordInfo>
+       </xsl:template>
+
+       <xsl:template name="displayForm">
+               <xsl:for-each select="marc:subfield[@code='c']">
+                       <displayForm>
+                               <xsl:value-of select="."/>
+                       </displayForm>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="affiliation">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <affiliation>
+                               <xsl:value-of select="."/>
+                       </affiliation>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="uri">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <xsl:attribute name="xlink:href">
+                               <xsl:value-of select="."/>
+                       </xsl:attribute>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="role">
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <role>
+                               <roleTerm type="text">
+                                       <xsl:value-of select="."/>
+                               </roleTerm>
+                       </role>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='4']">
+                       <role>
+                               <roleTerm authority="marcrelator" type="code">
+                                       <xsl:value-of select="."/>
+                               </roleTerm>
+                       </role>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="part">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">n</xsl:with-param>
+                               <xsl:with-param name="anyCodes">n</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <partNumber>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partNumber"/>
+                               </xsl:call-template>
+                       </partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <partName>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partName"/>
+                               </xsl:call-template>
+                       </partName>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedPart">
+               <xsl:if test="@tag=773">
+                       <xsl:for-each select="marc:subfield[@code='g']">
+                               <part>
+                                       <text>
+                                               <xsl:value-of select="."/>
+                                       </text>
+                               </part>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:subfield[@code='q']">
+                               <part>
+                                       <xsl:call-template name="parsePart"/>
+                               </part>
+                       </xsl:for-each>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedPartNumName">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">g</xsl:with-param>
+                               <xsl:with-param name="anyCodes">g</xsl:with-param>
+                               <xsl:with-param name="afterCodes">pst</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <partNumber>
+                               <xsl:value-of select="$partNumber"/>
+                       </partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <partName>
+                               <xsl:value-of select="$partName"/>
+                       </partName>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedName">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <name>
+                               <namePart>
+                                       <xsl:value-of select="."/>
+                               </namePart>
+                       </name>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedForm">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <form>
+                                       <xsl:value-of select="."/>
+                               </form>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedExtent">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <extent>
+                                       <xsl:value-of select="."/>
+                               </extent>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedNote">
+               <xsl:for-each select="marc:subfield[@code='n']">
+                       <note>
+                               <xsl:value-of select="."/>
+                       </note>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedSubject">
+               <xsl:for-each select="marc:subfield[@code='j']">
+                       <subject>
+                               <temporal encoding="iso8601">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString" select="."/>
+                                       </xsl:call-template>
+                               </temporal>
+                       </subject>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifierISSN">
+               <xsl:for-each select="marc:subfield[@code='x']">
+                       <identifier type="issn">
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifierLocal">
+               <xsl:for-each select="marc:subfield[@code='w']">
+                       <identifier type="local">
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedIdentifier">
+               <xsl:for-each select="marc:subfield[@code='o']">
+                       <identifier>
+                               <xsl:value-of select="."/>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedItem76X-78X">
+               <xsl:call-template name="displayLabel"/>
+               <xsl:call-template name="relatedTitle76X-78X"/>
+               <xsl:call-template name="relatedName"/>
+               <xsl:call-template name="relatedOriginInfo"/>
+               <xsl:call-template name="relatedLanguage"/>
+               <xsl:call-template name="relatedExtent"/>
+               <xsl:call-template name="relatedNote"/>
+               <xsl:call-template name="relatedSubject"/>
+               <xsl:call-template name="relatedIdentifier"/>
+               <xsl:call-template name="relatedIdentifierISSN"/>
+               <xsl:call-template name="relatedIdentifierLocal"/>
+               <xsl:call-template name="relatedPart"/>
+       </xsl:template>
+
+       <xsl:template name="subjectGeographicZ">
+               <geographic>
+
+
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."/>
+                       </xsl:call-template>
+               </geographic>
+       </xsl:template>
+
+       <xsl:template name="subjectTemporalY">
+               <temporal>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."/>
+                       </xsl:call-template>
+               </temporal>
+       </xsl:template>
+
+       <xsl:template name="subjectTopic">
+               <topic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."/>
+                       </xsl:call-template>
+               </topic>
+       </xsl:template>
+
+       <xsl:template name="nameABCDN">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <namePart>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='b']">
+                       <namePart>
+                               <xsl:value-of select="."/>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+                       <namePart>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">cdn</xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="nameABCDQ">
+               <namePart>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">aq</xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:with-param>
+                               <xsl:with-param name="punctuation">
+                                       <xsl:text>:,;/ </xsl:text>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+               <xsl:call-template name="termsOfAddress"/>
+               <xsl:call-template name="nameDate"/>
+       </xsl:template>
+
+       <xsl:template name="nameACDEQ">
+               <namePart>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">acdeq</xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+       </xsl:template>
+
+       <xsl:template name="constituentOrRelatedType">
+               <xsl:if test="@ind2=2">
+                       <xsl:attribute name="type">constituent</xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedTitle">
+               <xsl:for-each select="marc:subfield[@code='t']">
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                       </titleInfo>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedTitle76X-78X">
+               <xsl:for-each select="marc:subfield[@code='t']">
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='p']">
+                       <titleInfo type="abbreviated">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='s']">
+                       <titleInfo type="uniform">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="relatedOriginInfo">
+               <xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
+                       <originInfo>
+                               <xsl:if test="@tag=775">
+                                       <xsl:for-each select="marc:subfield[@code='f']">
+                                               <place>
+                                                       <placeTerm>
+                                                               <xsl:attribute name="type">code</xsl:attribute>
+                                                               <xsl:attribute name="authority">marcgac</xsl:attribute>
+                                                               <xsl:value-of select="."/>
+                                                       </placeTerm>
+                                               </place>
+                                       </xsl:for-each>
+                               </xsl:if>
+                               <xsl:for-each select="marc:subfield[@code='d']">
+                                       <publisher>
+                                               <xsl:value-of select="."/>
+                                       </publisher>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <edition>
+                                               <xsl:value-of select="."/>
+                                       </edition>
+                               </xsl:for-each>
+                       </originInfo>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="relatedLanguage">
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <xsl:call-template name="getLanguage">
+                               <xsl:with-param name="langString">
+                                       <xsl:value-of select="."/>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="nameDate">
+               <xsl:for-each select="marc:subfield[@code='d']">
+                       <namePart type="date">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="subjectAuthority">
+
+               <xsl:if test="@ind2!=4">
+                       <xsl:if test="@ind2!=' '">
+                               <xsl:if test="@ind2!=8">
+                                       <xsl:if test="@ind2!=9">
+                                               <xsl:attribute name="authority">
+                                                       <xsl:choose>
+
+                                                               <xsl:when test="@ind2=0">lcsh</xsl:when>
+                                                               <xsl:when test="@ind2=1">lcshac</xsl:when>
+                                                               <xsl:when test="@ind2=2">mesh</xsl:when>
+                                                               <!-- 1/04 fix -->
+                                                               <xsl:when test="@ind2=3">nal</xsl:when>
+                                                               <xsl:when test="@ind2=5">csh</xsl:when>
+                                                               <xsl:when test="@ind2=6">rvm</xsl:when>
+                                                               <xsl:when test="@ind2=7">
+                                                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                                                               </xsl:when>
+                                                       </xsl:choose>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                               </xsl:if>
+                       </xsl:if>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="subjectAnyOrder">
+               <xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
+                       <xsl:choose>
+                               <xsl:when test="@code='v'">
+                                       <xsl:call-template name="subjectTopic"/>
+                               </xsl:when>
+                               <xsl:when test="@code='x'">
+                                       <xsl:call-template name="subjectTopic"/>
+                               </xsl:when>
+                               <xsl:when test="@code='y'">
+                                       <xsl:call-template name="subjectTemporalY"/>
+                               </xsl:when>
+                               <xsl:when test="@code='z'">
+                                       <xsl:call-template name="subjectGeographicZ"/>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="specialSubfieldSelect">
+               <xsl:param name="anyCodes"/>
+               <xsl:param name="axis"/>
+               <xsl:param name="beforeCodes"/>
+               <xsl:param name="afterCodes"/>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($anyCodes, @code)      or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+                                       <xsl:value-of select="text()"/>
+                                       <xsl:text> </xsl:text>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=600]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="personal">
+                               <xsl:call-template name="termsOfAddress"/>
+                               <namePart>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">aq</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:call-template name="nameDate"/>
+                               <xsl:call-template name="affiliation"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=610]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="corporate">
+                               <xsl:for-each select="marc:subfield[@code='a']">
+                                       <namePart>
+                                               <xsl:value-of select="."/>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <namePart>
+                                               <xsl:value-of select="."/>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
+                                       <namePart>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">cdnp</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                               </xsl:if>
+                               <xsl:call-template name="role"/>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=611]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <name type="conference">
+                               <namePart>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcdeqnp</xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:for-each select="marc:subfield[@code='4']">
+                                       <role>
+                                               <roleTerm authority="marcrelator" type="code">
+                                                       <xsl:value-of select="."/>
+                                               </roleTerm>
+                                       </role>
+                               </xsl:for-each>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=630]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">adfhklor</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                                       <xsl:call-template name="part"/>
+                               </title>
+                       </titleInfo>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=650]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <topic>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abcd</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </topic>
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=651]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"/>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+
+                               <geographic>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString" select="."/>
+                                       </xsl:call-template>
+                               </geographic>
+                       </xsl:for-each>
+
+                       <xsl:call-template name="subjectAnyOrder"/>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=653]">
+               <subject>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+                               <topic>
+                                       <xsl:value-of select="."/>
+                               </topic>
+                       </xsl:for-each>
+               </subject>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=656]">
+               <subject>
+                       <xsl:if test="marc:subfield[@code=2]">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code=2]"/>
+                               </xsl:attribute>
+                       </xsl:if>
+                       <occupation>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </occupation>
+               </subject>
+       </xsl:template>
+
+       <xsl:template name="termsOfAddress">
+               <xsl:if test="marc:subfield[@code='b' or @code='c']">
+                       <namePart type="termsOfAddress">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">bc</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="displayLabel">
+               <xsl:if test="marc:subfield[@code='i']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='i']"/>
+                       </xsl:attribute>
+               </xsl:if>
+               <xsl:if test="marc:subfield[@code='3']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='3']"/>
+                       </xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="isInvalid">
+               <xsl:if test="marc:subfield[@code='z']">
+                       <xsl:attribute name="invalid">yes</xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="subtitle">
+               <xsl:if test="marc:subfield[@code='b']">
+                       <subTitle>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:value-of select="marc:subfield[@code='b']"/>
+
+                                               <!--<xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">b</xsl:with-param>                                                                 
+                                               </xsl:call-template>-->
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </subTitle>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="script">
+               <xsl:param name="scriptCode"/>
+               <xsl:attribute name="script">
+                       <xsl:choose>
+                               <xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
+                               <xsl:when test="$scriptCode='(B'">Latin</xsl:when>
+                               <xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
+                               <xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
+                               <xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
+                               <xsl:when test="$scriptCode='(S'">Greek</xsl:when>
+                       </xsl:choose>
+               </xsl:attribute>
+       </xsl:template>
+
+       <xsl:template name="parsePart">
+               <!-- assumes 773$q= 1:2:3<4
+                    with up to 3 levels and one optional start page
+               -->
+               <xsl:variable name="level1">
+                       <xsl:choose>
+                               <xsl:when test="contains(text(),':')">
+                                       <!-- 1:2 -->
+                                       <xsl:value-of select="substring-before(text(),':')"/>
+                               </xsl:when>
+                               <xsl:when test="not(contains(text(),':'))">
+                                       <!-- 1 or 1<3 -->
+                                       <xsl:if test="contains(text(),'&lt;')">
+                                               <!-- 1<3 -->
+                                               <xsl:value-of select="substring-before(text(),'&lt;')"/>
+                                       </xsl:if>
+                                       <xsl:if test="not(contains(text(),'&lt;'))">
+                                               <!-- 1 -->
+                                               <xsl:value-of select="text()"/>
+                                       </xsl:if>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="sici2">
+                       <xsl:choose>
+                               <xsl:when test="starts-with(substring-after(text(),$level1),':')">
+                                       <xsl:value-of select="substring(substring-after(text(),$level1),2)"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="substring-after(text(),$level1)"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="level2">
+                       <xsl:choose>
+                               <xsl:when test="contains($sici2,':')">
+                                       <!--  2:3<4  -->
+                                       <xsl:value-of select="substring-before($sici2,':')"/>
+                               </xsl:when>
+                               <xsl:when test="contains($sici2,'&lt;')">
+                                       <!-- 1: 2<4 -->
+                                       <xsl:value-of select="substring-before($sici2,'&lt;')"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="$sici2"/>
+                                       <!-- 1:2 -->
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="sici3">
+                       <xsl:choose>
+                               <xsl:when test="starts-with(substring-after($sici2,$level2),':')">
+                                       <xsl:value-of select="substring(substring-after($sici2,$level2),2)"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="substring-after($sici2,$level2)"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="level3">
+                       <xsl:choose>
+                               <xsl:when test="contains($sici3,'&lt;')">
+                                       <!-- 2<4 -->
+                                       <xsl:value-of select="substring-before($sici3,'&lt;')"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="$sici3"/>
+                                       <!-- 3 -->
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="page">
+                       <xsl:if test="contains(text(),'&lt;')">
+                               <xsl:value-of select="substring-after(text(),'&lt;')"/>
+                       </xsl:if>
+               </xsl:variable>
+               <xsl:if test="$level1">
+                       <detail level="1">
+                               <number>
+                                       <xsl:value-of select="$level1"/>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$level2">
+                       <detail level="2">
+                               <number>
+                                       <xsl:value-of select="$level2"/>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$level3">
+                       <detail level="3">
+                               <number>
+                                       <xsl:value-of select="$level3"/>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$page">
+                       <extent unit="page">
+                               <start>
+                                       <xsl:value-of select="$page"/>
+                               </start>
+                       </extent>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="getLanguage">
+               <xsl:param name="langString"/>
+               <xsl:param name="controlField008-35-37"/>
+               <xsl:variable name="length" select="string-length($langString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="$controlField008-35-37=substring($langString,1,3)">
+                               <xsl:call-template name="getLanguage">
+                                       <xsl:with-param name="langString" select="substring($langString,4,$length)"/>
+                                       <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <language>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="substring($langString,1,3)"/>
+                                       </languageTerm>
+                               </language>
+                               <xsl:call-template name="getLanguage">
+                                       <xsl:with-param name="langString" select="substring($langString,4,$length)"/>
+                                       <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="isoLanguage">
+               <xsl:param name="currentLanguage"/>
+               <xsl:param name="usedLanguages"/>
+               <xsl:param name="remainingLanguages"/>
+               <xsl:choose>
+                       <xsl:when test="string-length($currentLanguage)=0"/>
+                       <xsl:when test="not(contains($usedLanguages, $currentLanguage))">
+                               <language>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="$currentLanguage"/>
+                                       </languageTerm>
+                               </language>
+                               <xsl:call-template name="isoLanguage">
+                                       <xsl:with-param name="currentLanguage">
+                                               <xsl:value-of select="substring($remainingLanguages,1,3)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="remainingLanguages">
+                                               <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:call-template name="isoLanguage">
+                                       <xsl:with-param name="currentLanguage">
+                                               <xsl:value-of select="substring($remainingLanguages,1,3)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="remainingLanguages">
+                                               <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopBrackets">
+               <xsl:param name="chopString"/>
+               <xsl:variable name="string">
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="$chopString"/>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="substring($string, 1,1)='['">
+                       <xsl:value-of select="substring($string,2, string-length($string)-2)"/>
+               </xsl:if>
+               <xsl:if test="substring($string, 1,1)!='['">
+                       <xsl:value-of select="$string"/>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="rfcLanguages">
+               <xsl:param name="nodeNum"/>
+               <xsl:param name="usedLanguages"/>
+               <xsl:param name="controlField008-35-37"/>
+               <!-- ??? xalan -->
+
+               <xsl:variable name="currentLanguage" select="marc:subfield[position()=$nodeNum]/text()"/>
+               <xsl:choose>
+                       <xsl:when test="not($currentLanguage)"/>
+                       <xsl:when test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
+                               <xsl:if test="not(contains($usedLanguages,$currentLanguage))">
+                                       <language>
+                                               <languageTerm authority="rfc3066" type="code">
+                                                       <xsl:value-of select="$currentLanguage"/>
+                                               </languageTerm>
+                                       </language>
+                               </xsl:if>
+                               <xsl:call-template name="rfcLanguages">
+                                       <!-- ??? xalan -->
+                                       <xsl:with-param name="nodeNum">
+                                               <xsl:value-of select="$nodeNum+1"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,'|',$currentLanguage)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="controlField008-35-37">
+                                               <xsl:value-of select="$controlField008-35-37"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:call-template name="rfcLanguages">
+                                       <xsl:with-param name="nodeNum">
+                                               <xsl:value-of select="$nodeNum+1"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="controlField008-35-37">
+                                               <xsl:value-of select="$controlField008-35-37"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template name="datafield">
+               <xsl:param name="tag"/>
+               <xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="subfields"/>
+               <xsl:element name="marc:datafield">
+                       <xsl:attribute name="tag">
+                               <xsl:value-of select="$tag"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind1">
+                               <xsl:value-of select="$ind1"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind2">
+                               <xsl:value-of select="$ind2"/>
+                       </xsl:attribute>
+                       <xsl:copy-of select="$subfields"/>
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template name="subfieldSelect">
+               <xsl:param name="codes"/>
+               <xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($codes, @code)">
+                                       <xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+       </xsl:template>
+
+       <xsl:template name="buildSpaces">
+               <xsl:param name="spaces"/>
+               <xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
+               <xsl:if test="$spaces>0">
+                       <xsl:value-of select="$char"/>
+                       <xsl:call-template name="buildSpaces">
+                               <xsl:with-param name="spaces" select="$spaces - 1"/>
+                               <xsl:with-param name="char" select="$char"/>
+                       </xsl:call-template>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuation">
+               <xsl:param name="chopString"/>
+               <xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+                                       <xsl:with-param name="punctuation" select="$punctuation"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuationFront">
+               <xsl:param name="chopString"/>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+                               <xsl:call-template name="chopPunctuationFront">
+                                       <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>$$ WHERE name = 'mods3';
diff --git a/Open-ILS/src/sql/Pg/953.data.MODS32-xsl.sql b/Open-ILS/src/sql/Pg/953.data.MODS32-xsl.sql
new file mode 100644 (file)
index 0000000..b0f3e4e
--- /dev/null
@@ -0,0 +1,3082 @@
+UPDATE config.xml_transform SET xslt=$$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns="http://www.loc.gov/mods/v3" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xlink marc" version="1.0">
+       <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
+<!--
+Revision 1.14 - Fixed template isValid and fields 010, 020, 022, 024, 028, and 037 to output additional identifier elements 
+  with corresponding @type and @invalid eq 'yes' when subfields z or y (in the case of 022) exist in the MARCXML ::: 2007/01/04 17:35:20 cred
+
+Revision 1.13 - Changed order of output under cartographics to reflect schema  2006/11/28 tmee
+       
+Revision 1.12 - Updated to reflect MODS 3.2 Mapping  2006/10/11 tmee
+               
+Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language>
+      2006/04/08  jrad
+
+Revision 1.10 MODS 3.1 revisions to language and classification elements  
+                               (plus ability to find marc:collection embedded in wrapper elements such as SRU zs: wrappers)
+                               2006/02/06  ggar
+
+Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
+
+Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
+
+Revision 1.7 2004/03/25 08:29 jrad
+
+Revision 1.6 various validation fixes 2004/02/20 ntra
+
+Revision 1.5  2003/10/02 16:18:58  ntra
+MODS2 to MODS3 updates, language unstacking and 
+de-duping, chopPunctuation expanded
+
+Revision 1.3  2003/04/03 00:07:19  ntra
+Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
+
+Revision 1.2  2003/03/24 19:37:42  ckeith
+Added Log Comment
+
+-->
+       <xsl:template match="/">
+               <xsl:choose>
+                       <xsl:when test="//marc:collection">
+                               <modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+                                       <xsl:for-each select="//marc:collection/marc:record">
+                                               <mods version="3.2">
+                                                       <xsl:call-template name="marcRecord"/>
+                                               </mods>
+                                       </xsl:for-each>
+                               </modsCollection>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+                                       <xsl:for-each select="//marc:record">
+                                               <xsl:call-template name="marcRecord"/>
+                                       </xsl:for-each>
+                               </mods>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template name="marcRecord">
+               <xsl:variable name="leader" select="marc:leader"/>
+               <xsl:variable name="leader6" select="substring($leader,7,1)"/>
+               <xsl:variable name="leader7" select="substring($leader,8,1)"/>
+               <xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+               <xsl:variable name="typeOf008">
+                       <xsl:choose>
+                               <xsl:when test="$leader6='a'">
+                                       <xsl:choose>
+                                               <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
+                                               <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
+                                       </xsl:choose>
+                               </xsl:when>
+                               <xsl:when test="$leader6='t'">BK</xsl:when>
+                               <xsl:when test="$leader6='p'">MM</xsl:when>
+                               <xsl:when test="$leader6='m'">CF</xsl:when>
+                               <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
+                               <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
+                               <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:for-each select="marc:datafield[@tag='245']">
+                       <titleInfo>
+                               <xsl:variable name="title">
+                                       <xsl:choose>
+                                               <xsl:when test="marc:subfield[@code='b']">
+                                                       <xsl:call-template name="specialSubfieldSelect">
+                                                               <xsl:with-param name="axis">b</xsl:with-param>
+                                                               <xsl:with-param name="beforeCodes">afgk</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">abfgk</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:variable>
+                               <xsl:variable name="titleChop">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="$title"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:variable>
+                               <xsl:choose>
+                                       <xsl:when test="@ind2>0">
+                                               <nonSort>
+                                                       <xsl:value-of select="substring($titleChop,1,@ind2)"/>
+                                               </nonSort>
+                                               <title>
+                                                       <xsl:value-of select="substring($titleChop,@ind2+1)"/>
+                                               </title>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <title>
+                                                       <xsl:value-of select="$titleChop"/>
+                                               </title>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                               <xsl:if test="marc:subfield[@code='b']">
+                                       <subTitle>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="axis">b</xsl:with-param>
+                                                                       <xsl:with-param name="anyCodes">b</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">afgk</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </subTitle>
+                               </xsl:if>
+                               <xsl:call-template name="part"></xsl:call-template>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='210']">
+                       <titleInfo type="abbreviated">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">a</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="subtitle"/>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='242']">
+                       <titleInfo type="translated">
+                               <!--09/01/04 Added subfield $y-->
+                               <xsl:for-each select="marc:subfield[@code='y']">
+                                       <xsl:attribute name="lang">
+                                               <xsl:value-of select="text()"/>
+                                       </xsl:attribute>
+                               </xsl:for-each>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <!-- 1/04 removed $h, b -->
+                                                               <xsl:with-param name="codes">a</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <!-- 1/04 fix -->
+                               <xsl:call-template name="subtitle"/>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='246']">
+                       <titleInfo type="alternative">
+                               <xsl:for-each select="marc:subfield[@code='i']">
+                                       <xsl:attribute name="displayLabel">
+                                               <xsl:value-of select="text()"/>
+                                       </xsl:attribute>
+                               </xsl:for-each>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <!-- 1/04 removed $h, $b -->
+                                                               <xsl:with-param name="codes">af</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="subtitle"/>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
+                       <titleInfo type="uniform">
+                               <title>
+                                       <xsl:variable name="str">
+                                               <xsl:for-each select="marc:subfield">
+                                                       <xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
+                                                               <xsl:value-of select="text()"/>
+                                                               <xsl:text> </xsl:text>
+                                                       </xsl:if>
+                                               </xsl:for-each>
+                                       </xsl:variable>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
+                       <titleInfo type="alternative">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">ah</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:call-template name="part"/>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='100']">
+                       <name type="personal">
+                               <xsl:call-template name="nameABCDQ"/>
+                               <xsl:call-template name="affiliation"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='110']">
+                       <name type="corporate">
+                               <xsl:call-template name="nameABCDN"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='111']">
+                       <name type="conference">
+                               <xsl:call-template name="nameACDEQ"/>
+                               <role>
+                                       <roleTerm authority="marcrelator" type="text">creator</roleTerm>
+                               </role>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
+                       <name type="personal">
+                               <xsl:call-template name="nameABCDQ"/>
+                               <xsl:call-template name="affiliation"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
+                       <name type="corporate">
+                               <xsl:call-template name="nameABCDN"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
+                       <name type="conference">
+                               <xsl:call-template name="nameACDEQ"/>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
+                       <name>
+                               <xsl:if test="@ind1=1">
+                                       <xsl:attribute name="type">
+                                               <xsl:text>personal</xsl:text>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <namePart>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </namePart>
+                               <xsl:call-template name="role"/>
+                       </name>
+               </xsl:for-each>
+               <typeOfResource>
+                       <xsl:if test="$leader7='c'">
+                               <xsl:attribute name="collection">yes</xsl:attribute>
+                       </xsl:if>
+                       <xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
+                               <xsl:attribute name="manuscript">yes</xsl:attribute>
+                       </xsl:if>
+                       <xsl:choose>
+                               <xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
+                               <xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
+                               <xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
+                               <xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
+                               <xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
+                               <xsl:when test="$leader6='k'">still image</xsl:when>
+                               <xsl:when test="$leader6='g'">moving image</xsl:when>
+                               <xsl:when test="$leader6='r'">three dimensional object</xsl:when>
+                               <xsl:when test="$leader6='m'">software, multimedia</xsl:when>
+                               <xsl:when test="$leader6='p'">mixed material</xsl:when>
+                       </xsl:choose>
+               </typeOfResource>
+               <xsl:if test="substring($controlField008,26,1)='d'">
+                       <genre authority="marc">globe</genre>
+               </xsl:if>
+               <xsl:if test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+                       <genre authority="marc">remote sensing image</genre>
+               </xsl:if>
+               <xsl:if test="$typeOf008='MP'">
+                       <xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+                                       <genre authority="marc">map</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+                                       <genre authority="marc">atlas</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:if test="$typeOf008='SE'">
+                       <xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-21='d'">
+                                       <genre authority="marc">database</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='l'">
+                                       <genre authority="marc">loose-leaf</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='m'">
+                                       <genre authority="marc">series</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='n'">
+                                       <genre authority="marc">newspaper</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='p'">
+                                       <genre authority="marc">periodical</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-21='w'">
+                                       <genre authority="marc">web site</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
+                       <xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="contains($controlField008-24,'a')">
+                                       <genre authority="marc">abstract or summary</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'b')">
+                                       <genre authority="marc">bibliography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'c')">
+                                       <genre authority="marc">catalog</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'d')">
+                                       <genre authority="marc">dictionary</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'e')">
+                                       <genre authority="marc">encyclopedia</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'f')">
+                                       <genre authority="marc">handbook</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'g')">
+                                       <genre authority="marc">legal article</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'i')">
+                                       <genre authority="marc">index</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'k')">
+                                       <genre authority="marc">discography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'l')">
+                                       <genre authority="marc">legislation</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'m')">
+                                       <genre authority="marc">theses</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'n')">
+                                       <genre authority="marc">survey of literature</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'o')">
+                                       <genre authority="marc">review</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'p')">
+                                       <genre authority="marc">programmed text</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'q')">
+                                       <genre authority="marc">filmography</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'r')">
+                                       <genre authority="marc">directory</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'s')">
+                                       <genre authority="marc">statistics</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'t')">
+                                       <genre authority="marc">technical report</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'v')">
+                                       <genre authority="marc">legal case and case notes</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'w')">
+                                       <genre authority="marc">law report or digest</genre>
+                               </xsl:when>
+                               <xsl:when test="contains($controlField008-24,'z')">
+                                       <genre authority="marc">treaty</genre>
+                               </xsl:when>
+                       </xsl:choose>
+                       <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-29='1'">
+                                       <genre authority="marc">conference publication</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:if test="$typeOf008='CF'">
+                       <xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-26='a'">
+                                       <genre authority="marc">numeric data</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='e'">
+                                       <genre authority="marc">database</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='f'">
+                                       <genre authority="marc">font</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-26='g'">
+                                       <genre authority="marc">game</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:if test="$typeOf008='BK'">
+                       <xsl:if test="substring($controlField008,25,1)='j'">
+                               <genre authority="marc">patent</genre>
+                       </xsl:if>
+                       <xsl:if test="substring($controlField008,31,1)='1'">
+                               <genre authority="marc">festschrift</genre>
+                       </xsl:if>
+                       <xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"></xsl:variable>
+                       <xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
+                               <genre authority="marc">biography</genre>
+                       </xsl:if>
+                       <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-33='e'">
+                                       <genre authority="marc">essay</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='d'">
+                                       <genre authority="marc">drama</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='c'">
+                                       <genre authority="marc">comic strip</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='l'">
+                                       <genre authority="marc">fiction</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='h'">
+                                       <genre authority="marc">humor, satire</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='i'">
+                                       <genre authority="marc">letter</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='f'">
+                                       <genre authority="marc">novel</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='j'">
+                                       <genre authority="marc">short story</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='s'">
+                                       <genre authority="marc">speech</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:if test="$typeOf008='MU'">
+                       <xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"></xsl:variable>
+                       <xsl:if test="contains($controlField008-30-31,'b')">
+                               <genre authority="marc">biography</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'c')">
+                               <genre authority="marc">conference publication</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'d')">
+                               <genre authority="marc">drama</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'e')">
+                               <genre authority="marc">essay</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'f')">
+                               <genre authority="marc">fiction</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'o')">
+                               <genre authority="marc">folktale</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'h')">
+                               <genre authority="marc">history</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'k')">
+                               <genre authority="marc">humor, satire</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'m')">
+                               <genre authority="marc">memoir</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'p')">
+                               <genre authority="marc">poetry</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'r')">
+                               <genre authority="marc">rehearsal</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'g')">
+                               <genre authority="marc">reporting</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'s')">
+                               <genre authority="marc">sound</genre>
+                       </xsl:if>
+                       <xsl:if test="contains($controlField008-30-31,'l')">
+                               <genre authority="marc">speech</genre>
+                       </xsl:if>
+               </xsl:if>
+               <xsl:if test="$typeOf008='VM'">
+                       <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-33='a'">
+                                       <genre authority="marc">art original</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='b'">
+                                       <genre authority="marc">kit</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='c'">
+                                       <genre authority="marc">art reproduction</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='d'">
+                                       <genre authority="marc">diorama</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='f'">
+                                       <genre authority="marc">filmstrip</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='g'">
+                                       <genre authority="marc">legal article</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='i'">
+                                       <genre authority="marc">picture</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='k'">
+                                       <genre authority="marc">graphic</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='l'">
+                                       <genre authority="marc">technical drawing</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='m'">
+                                       <genre authority="marc">motion picture</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='n'">
+                                       <genre authority="marc">chart</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='o'">
+                                       <genre authority="marc">flash card</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='p'">
+                                       <genre authority="marc">microscope slide</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+                                       <genre authority="marc">model</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='r'">
+                                       <genre authority="marc">realia</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='s'">
+                                       <genre authority="marc">slide</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='t'">
+                                       <genre authority="marc">transparency</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='v'">
+                                       <genre authority="marc">videorecording</genre>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-33='w'">
+                                       <genre authority="marc">toy</genre>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:for-each select="marc:datafield[@tag=655]">
+                       <genre authority="marc">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:attribute>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abvxyz</xsl:with-param>
+                                       <xsl:with-param name="delimeter">-</xsl:with-param>
+                               </xsl:call-template>
+                       </genre>
+               </xsl:for-each>
+               <originInfo>
+                       <xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"></xsl:variable>
+                       <xsl:if test="translate($MARCpublicationCode,'|','')">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">code</xsl:attribute>
+                                               <xsl:attribute name="authority">marccountry</xsl:attribute>
+                                               <xsl:value-of select="$MARCpublicationCode"/>
+                                       </placeTerm>
+                               </place>
+                       </xsl:if>
+                       <xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">code</xsl:attribute>
+                                               <xsl:attribute name="authority">iso3166</xsl:attribute>
+                                               <xsl:value-of select="."/>
+                                       </placeTerm>
+                               </place>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
+                               <place>
+                                       <placeTerm>
+                                               <xsl:attribute name="type">text</xsl:attribute>
+                                               <xsl:call-template name="chopPunctuationFront">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."/>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </placeTerm>
+                               </place>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
+                               <dateValid point="start">
+                                       <xsl:value-of select="."/>
+                               </dateValid>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
+                               <dateValid point="end">
+                                       <xsl:value-of select="."/>
+                               </dateValid>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
+                               <dateModified>
+                                       <xsl:value-of select="."/>
+                               </dateModified>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
+                               <xsl:choose>
+                                       <xsl:when test="@code='b'">
+                                               <publisher>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                               <xsl:with-param name="punctuation">
+                                                                       <xsl:text>:,;/ </xsl:text>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </publisher>
+                                       </xsl:when>
+                                       <xsl:when test="@code='c'">
+                                               <dateIssued>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."/>
+                                                       </xsl:call-template>
+                                               </dateIssued>
+                                       </xsl:when>
+                                       <xsl:when test="@code='g'">
+                                               <dateCreated>
+                                                       <xsl:value-of select="."/>
+                                               </dateCreated>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:for-each>
+                       <xsl:variable name="dataField260c">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"></xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:variable>
+                       <xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"></xsl:variable>
+                       <xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"></xsl:variable>
+                       <xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"></xsl:variable>
+                       <xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
+                               <xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
+                                       <dateIssued encoding="marc">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                               <xsl:if test="$controlField008-7-10">
+                                       <dateIssued encoding="marc" point="start">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <dateIssued encoding="marc" point="end">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:if test="$controlField008-6='q'">
+                               <xsl:if test="$controlField008-7-10">
+                                       <dateIssued encoding="marc" point="start" qualifier="questionable">
+                                               <xsl:value-of select="$controlField008-7-10"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:if test="$controlField008-6='q'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <dateIssued encoding="marc" point="end" qualifier="questionable">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </dateIssued>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:if test="$controlField008-6='t'">
+                               <xsl:if test="$controlField008-11-14">
+                                       <copyrightDate encoding="marc">
+                                               <xsl:value-of select="$controlField008-11-14"/>
+                                       </copyrightDate>
+                               </xsl:if>
+                       </xsl:if>
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
+                               <dateCaptured encoding="iso8601">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
+                               <dateCaptured encoding="iso8601" point="start">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
+                               <dateCaptured encoding="iso8601" point="end">
+                                       <xsl:value-of select="."/>
+                               </dateCaptured>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
+                               <edition>
+                                       <xsl:value-of select="."/>
+                               </edition>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:leader">
+                               <issuance>
+                                       <xsl:choose>
+                                               <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
+                                               <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
+                                       </xsl:choose>
+                               </issuance>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
+                               <frequency>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                       </xsl:call-template>
+                               </frequency>
+                       </xsl:for-each>
+               </originInfo>
+               <xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"></xsl:variable>
+               <xsl:if test="$controlField008-35-37">
+                       <language>
+                               <languageTerm authority="iso639-2b" type="code">
+                                       <xsl:value-of select="substring($controlField008,36,3)"/>
+                               </languageTerm>
+                       </language>
+               </xsl:if>
+               <xsl:for-each select="marc:datafield[@tag=041]">
+                       <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='d' or @code='e' or @code='f' or @code='g' or @code='h']">
+                               <xsl:variable name="langCodes" select="."/>
+                               <xsl:choose>
+                                       <xsl:when test="../marc:subfield[@code='2']='rfc3066'">
+                                               <!-- not stacked but could be repeated -->
+                                               <xsl:call-template name="rfcLanguages">
+                                                       <xsl:with-param name="nodeNum">
+                                                               <xsl:value-of select="1"/>
+                                                       </xsl:with-param>
+                                                       <xsl:with-param name="usedLanguages">
+                                                               <xsl:text></xsl:text>
+                                                       </xsl:with-param>
+                                                       <xsl:with-param name="controlField008-35-37">
+                                                               <xsl:value-of select="$controlField008-35-37"></xsl:value-of>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <!-- iso -->
+                                               <xsl:variable name="allLanguages">
+                                                       <xsl:copy-of select="$langCodes"></xsl:copy-of>
+                                               </xsl:variable>
+                                               <xsl:variable name="currentLanguage">
+                                                       <xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
+                                               </xsl:variable>
+                                               <xsl:call-template name="isoLanguage">
+                                                       <xsl:with-param name="currentLanguage">
+                                                               <xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
+                                                       </xsl:with-param>
+                                                       <xsl:with-param name="remainingLanguages">
+                                                               <xsl:value-of select="substring($allLanguages,4,string-length($allLanguages)-3)"></xsl:value-of>
+                                                       </xsl:with-param>
+                                                       <xsl:with-param name="usedLanguages">
+                                                               <xsl:if test="$controlField008-35-37">
+                                                                       <xsl:value-of select="$controlField008-35-37"></xsl:value-of>
+                                                               </xsl:if>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                       </xsl:for-each>
+               </xsl:for-each>
+               <xsl:variable name="physicalDescription">
+                       <!--3.2 change tmee 007/11 -->
+                       <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
+                               <digitalOrigin>reformatted digital</digitalOrigin>
+                       </xsl:if>
+                       <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
+                               <digitalOrigin>digitized microfilm</digitalOrigin>
+                       </xsl:if>
+                       <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
+                               <digitalOrigin>digitized other analog</digitalOrigin>
+                       </xsl:if>
+                       <xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"></xsl:variable>
+                       <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
+                       <xsl:variable name="check008-23">
+                               <xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
+                                       <xsl:value-of select="true()"></xsl:value-of>
+                               </xsl:if>
+                       </xsl:variable>
+                       <xsl:variable name="check008-29">
+                               <xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
+                                       <xsl:value-of select="true()"></xsl:value-of>
+                               </xsl:if>
+                       </xsl:variable>
+                       <xsl:choose>
+                               <xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
+                                       <form authority="marcform">braille</form>
+                               </xsl:when>
+                               <xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
+                                       <form authority="marcform">print</form>
+                               </xsl:when>
+                               <xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
+                                       <form authority="marcform">electronic</form>
+                               </xsl:when>
+                               <xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
+                                       <form authority="marcform">microfiche</form>
+                               </xsl:when>
+                               <xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
+                                       <form authority="marcform">microfilm</form>
+                               </xsl:when>
+                       </xsl:choose>
+                       <!-- 1/04 fix -->
+                       <xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
+                               <form authority="gmd">
+                                       <xsl:call-template name="chopBrackets">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </form>
+                       </xsl:if>
+                       <xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
+                               <form>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </form>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
+                               <xsl:choose>
+                                       <xsl:when test="substring(text(),14,1)='a'">
+                                               <reformattingQuality>access</reformattingQuality>
+                                       </xsl:when>
+                                       <xsl:when test="substring(text(),14,1)='p'">
+                                               <reformattingQuality>preservation</reformattingQuality>
+                                       </xsl:when>
+                                       <xsl:when test="substring(text(),14,1)='r'">
+                                               <reformattingQuality>replacement</reformattingQuality>
+                                       </xsl:when>
+                               </xsl:choose>
+                       </xsl:for-each>
+                       <!--3.2 change tmee 007/01 -->
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
+                               <form authority="smd">chip cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
+                               <form authority="smd">computer optical disc cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
+                               <form authority="smd">magnetic disc</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
+                               <form authority="smd">magneto-optical disc</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
+                               <form authority="smd">optical disc</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
+                               <form authority="smd">remote</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
+                               <form authority="smd">tape cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
+                               <form authority="smd">tape cassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
+                               <form authority="smd">tape reel</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
+                               <form authority="smd">celestial globe</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
+                               <form authority="smd">earth moon globe</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
+                               <form authority="smd">planetary or lunar globe</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
+                               <form authority="smd">terrestrial globe</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
+                               <form authority="smd">kit</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+                               <form authority="smd">atlas</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
+                               <form authority="smd">diagram</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+                               <form authority="smd">map</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+                               <form authority="smd">model</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
+                               <form authority="smd">profile</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+                               <form authority="smd">remote-sensing image</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
+                               <form authority="smd">section</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
+                               <form authority="smd">view</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
+                               <form authority="smd">aperture card</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
+                               <form authority="smd">microfiche</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
+                               <form authority="smd">microfiche cassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
+                               <form authority="smd">microfilm cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
+                               <form authority="smd">microfilm cassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
+                               <form authority="smd">microfilm reel</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
+                               <form authority="smd">microopaque</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
+                               <form authority="smd">film cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
+                               <form authority="smd">film cassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
+                               <form authority="smd">film reel</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
+                               <form authority="smd">chart</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
+                               <form authority="smd">collage</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
+                               <form authority="smd">drawing</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
+                               <form authority="smd">flash card</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
+                               <form authority="smd">painting</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
+                               <form authority="smd">photomechanical print</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
+                               <form authority="smd">photonegative</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
+                               <form authority="smd">photoprint</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
+                               <form authority="smd">picture</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
+                               <form authority="smd">print</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
+                               <form authority="smd">technical drawing</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
+                               <form authority="smd">notated music</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
+                               <form authority="smd">filmslip</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
+                               <form authority="smd">filmstrip cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
+                               <form authority="smd">filmstrip roll</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
+                               <form authority="smd">other filmstrip type</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
+                               <form authority="smd">slide</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
+                               <form authority="smd">transparency</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
+                               <form authority="smd">remote-sensing image</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
+                               <form authority="smd">cylinder</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
+                               <form authority="smd">roll</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
+                               <form authority="smd">sound cartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
+                               <form authority="smd">sound cassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
+                               <form authority="smd">sound disc</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
+                               <form authority="smd">sound-tape reel</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
+                               <form authority="smd">sound-track film</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
+                               <form authority="smd">wire recording</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
+                               <form authority="smd">braille</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
+                               <form authority="smd">combination</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
+                               <form authority="smd">moon</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
+                               <form authority="smd">tactile, with no writing system</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
+                               <form authority="smd">braille</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
+                               <form authority="smd">large print</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
+                               <form authority="smd">regular print</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
+                               <form authority="smd">text in looseleaf binder</form>
+                       </xsl:if>
+                       
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
+                               <form authority="smd">videocartridge</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
+                               <form authority="smd">videocassette</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
+                               <form authority="smd">videodisc</form>
+                       </xsl:if>
+                       <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
+                               <form authority="smd">videoreel</form>
+                       </xsl:if>
+                       
+                       <xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
+                               <internetMediaType>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </internetMediaType>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=300]">
+                               <extent>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abce</xsl:with-param>
+                                       </xsl:call-template>
+                               </extent>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($physicalDescription))">
+                       <physicalDescription>
+                               <xsl:copy-of select="$physicalDescription"></xsl:copy-of>
+                       </physicalDescription>
+               </xsl:if>
+               <xsl:for-each select="marc:datafield[@tag=520]">
+                       <abstract>
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </abstract>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=505]">
+                       <tableOfContents>
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">agrt</xsl:with-param>
+                               </xsl:call-template>
+                       </tableOfContents>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=521]">
+                       <targetAudience>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </targetAudience>
+               </xsl:for-each>
+               <xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
+                       <xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"></xsl:variable>
+                       <xsl:choose>
+                               <!-- 01/04 fix -->
+                               <xsl:when test="$controlField008-22='d'">
+                                       <targetAudience authority="marctarget">adolescent</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='e'">
+                                       <targetAudience authority="marctarget">adult</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='g'">
+                                       <targetAudience authority="marctarget">general</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
+                                       <targetAudience authority="marctarget">juvenile</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='a'">
+                                       <targetAudience authority="marctarget">preschool</targetAudience>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-22='f'">
+                                       <targetAudience authority="marctarget">specialized</targetAudience>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:if>
+               <xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
+                       <note type="statement of responsibility">
+                               <xsl:value-of select="."></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=500]">
+                       <note>
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                               <xsl:call-template name="uri"></xsl:call-template>
+                       </note>
+               </xsl:for-each>
+               
+               <!--3.2 change tmee additional note fields-->
+               
+               <xsl:for-each select="marc:datafield[@tag=506]">
+                       <note type="restrictions">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=510]">
+                       <note  type="citation/reference">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+                       
+               <xsl:for-each select="marc:datafield[@tag=511]">
+                       <note type="performers">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=518]">
+                       <note type="venue">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=530]">
+                       <note  type="additional physical form">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=533]">
+                       <note  type="reproduction">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=534]">
+                       <note  type="original version">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=538]">
+                       <note  type="system details">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=583]">
+                       <note type="action">
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               
+
+               
+               
+               
+               <xsl:for-each select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=507 or @tag=508 or  @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
+                       <note>
+                               <xsl:call-template name="uri"></xsl:call-template>
+                               <xsl:variable name="str">
+                                       <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                               <xsl:text> </xsl:text>
+                                       </xsl:for-each>
+                               </xsl:variable>
+                               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
+                       <subject>
+                               <cartographics>
+                                       <coordinates>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">defg</xsl:with-param>
+                                               </xsl:call-template>
+                                       </coordinates>
+                               </cartographics>
+                       </subject>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=043]">
+                       <subject>
+                               <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+                                       <geographicCode>
+                                               <xsl:attribute name="authority">
+                                                       <xsl:if test="@code='a'">
+                                                               <xsl:text>marcgac</xsl:text>
+                                                       </xsl:if>
+                                                       <xsl:if test="@code='b'">
+                                                               <xsl:value-of select="following-sibling::marc:subfield[@code=2]"></xsl:value-of>
+                                                       </xsl:if>
+                                                       <xsl:if test="@code='c'">
+                                                               <xsl:text>iso3166</xsl:text>
+                                                       </xsl:if>
+                                               </xsl:attribute>
+                                               <xsl:value-of select="self::marc:subfield"></xsl:value-of>
+                                       </geographicCode>
+                               </xsl:for-each>
+                       </subject>
+               </xsl:for-each>
+               <!-- tmee 2006/11/27 -->
+               <xsl:for-each select="marc:datafield[@tag=255]">
+                       <subject>
+                               <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+                               <cartographics>
+                                       <xsl:if test="@code='a'">
+                                               <scale>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </scale>
+                                       </xsl:if>
+                                       <xsl:if test="@code='b'">
+                                               <projection>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </projection>
+                                       </xsl:if>
+                                       <xsl:if test="@code='c'">
+                                               <coordinates>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </coordinates>
+                                       </xsl:if>
+                               </cartographics>
+                               </xsl:for-each>
+                       </subject>
+               </xsl:for-each>
+                               
+               <xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"></xsl:apply-templates>
+               <xsl:apply-templates select="marc:datafield[@tag=656]"></xsl:apply-templates>
+               <xsl:for-each select="marc:datafield[@tag=752]">
+                       <subject>
+                               <hierarchicalGeographic>
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <country>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                                       </xsl:call-template>
+                                               </country>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <state>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                                       </xsl:call-template>
+                                               </state>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='c']">
+                                               <county>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                                       </xsl:call-template>
+                                               </county>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='d']">
+                                               <city>
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                                       </xsl:call-template>
+                                               </city>
+                                       </xsl:for-each>
+                               </hierarchicalGeographic>
+                       </subject>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
+                       <subject>
+                               <xsl:choose>
+                                       <xsl:when test="@ind1=2">
+                                               <temporal encoding="iso8601" point="start">
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:value-of select="marc:subfield[@code='b'][1]"></xsl:value-of>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </temporal>
+                                               <temporal encoding="iso8601" point="end">
+                                                       <xsl:call-template name="chopPunctuation">
+                                                               <xsl:with-param name="chopString">
+                                                                       <xsl:value-of select="marc:subfield[@code='b'][2]"></xsl:value-of>
+                                                               </xsl:with-param>
+                                                       </xsl:call-template>
+                                               </temporal>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <temporal encoding="iso8601">
+                                                               <xsl:call-template name="chopPunctuation">
+                                                                       <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </temporal>
+                                               </xsl:for-each>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                       </subject>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=050]">
+                       <xsl:for-each select="marc:subfield[@code='b']">
+                               <classification authority="lcc">
+                                       <xsl:if test="../marc:subfield[@code='3']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"></xsl:value-of>
+                                       <xsl:text> </xsl:text>
+                                       <xsl:value-of select="text()"></xsl:value-of>
+                               </classification>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
+                               <classification authority="lcc">
+                                       <xsl:if test="../marc:subfield[@code='3']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="text()"></xsl:value-of>
+                               </classification>
+                       </xsl:for-each>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=082]">
+                       <classification authority="ddc">
+                               <xsl:if test="marc:subfield[@code='2']">
+                                       <xsl:attribute name="edition">
+                                               <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=080]">
+                       <classification authority="udc">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abx</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=060]">
+                       <classification authority="nlm">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
+                       <classification authority="sudocs">
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
+                       <classification authority="candoc">
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=086]">
+                       <classification>
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+                               </xsl:attribute>
+                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=084]">
+                       <classification>
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+                               </xsl:attribute>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </classification>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=440]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">av</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">av</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=510]">
+                       <relatedItem type="isReferencedBy">
+                               <note>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcx3</xsl:with-param>
+                                       </xsl:call-template>
+                               </note>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=534]">
+                       <relatedItem type="original">
+                               <xsl:call-template name="relatedTitle"></xsl:call-template>
+                               <xsl:call-template name="relatedName"></xsl:call-template>
+                               <xsl:if test="marc:subfield[@code='b' or @code='c']">
+                                       <originInfo>
+                                               <xsl:for-each select="marc:subfield[@code='c']">
+                                                       <publisher>
+                                                               <xsl:value-of select="."></xsl:value-of>
+                                                       </publisher>
+                                               </xsl:for-each>
+                                               <xsl:for-each select="marc:subfield[@code='b']">
+                                                       <edition>
+                                                               <xsl:value-of select="."></xsl:value-of>
+                                                       </edition>
+                                               </xsl:for-each>
+                                       </originInfo>
+                               </xsl:if>
+                               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+                               <xsl:for-each select="marc:subfield[@code='z']">
+                                       <identifier type="isbn">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </identifier>
+                               </xsl:for-each>
+                               <xsl:call-template name="relatedNote"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                               <name type="personal">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aq</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="termsOfAddress"></xsl:call-template>
+                                       <xsl:call-template name="nameDate"></xsl:call-template>
+                                       <xsl:call-template name="role"></xsl:call-template>
+                               </name>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </titleInfo>
+                               <name type="corporate">
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <namePart>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <namePart>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:variable name="tempNamePart">
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:variable>
+                                       <xsl:if test="normalize-space($tempNamePart)">
+                                               <namePart>
+                                                       <xsl:value-of select="$tempNamePart"></xsl:value-of>
+                                               </namePart>
+                                       </xsl:if>
+                                       <xsl:call-template name="role"></xsl:call-template>
+                               </name>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </titleInfo>
+                               <name type="conference">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                               </name>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
+                       <relatedItem>
+                               <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
+                       <relatedItem type="series">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
+                       <relatedItem>
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=775]">
+                       <relatedItem type="otherVersion">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
+                       <relatedItem type="constituent">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
+                       <relatedItem type="host">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=776]">
+                       <relatedItem type="otherFormat">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=780]">
+                       <relatedItem type="preceding">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=785]">
+                       <relatedItem type="succeeding">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=786]">
+                       <relatedItem type="original">
+                               <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=800]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </titleInfo>
+                               <name type="personal">
+                                       <namePart>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">aq</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="beforeCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="termsOfAddress"></xsl:call-template>
+                                       <xsl:call-template name="nameDate"></xsl:call-template>
+                                       <xsl:call-template name="role"></xsl:call-template>
+                               </name>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=810]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">dg</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </titleInfo>
+                               <name type="corporate">
+                                       <xsl:for-each select="marc:subfield[@code='a']">
+                                               <namePart>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <xsl:for-each select="marc:subfield[@code='b']">
+                                               <namePart>
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </namePart>
+                                       </xsl:for-each>
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">c</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="role"></xsl:call-template>
+                               </name>
+                               <xsl:call-template name="relatedForm"></xsl:call-template>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=811]">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="specialSubfieldSelect">
+                                                                       <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+                                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                                       <xsl:with-param name="afterCodes">g</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="relatedPartNumName"/>
+                               </titleInfo>
+                               <name type="conference">
+                                       <namePart>
+                                               <xsl:call-template name="specialSubfieldSelect">
+                                                       <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+                                                       <xsl:with-param name="axis">t</xsl:with-param>
+                                                       <xsl:with-param name="beforeCodes">gn</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                                       <xsl:call-template name="role"/>
+                               </name>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='830']">
+                       <relatedItem type="series">
+                               <titleInfo>
+                                       <title>
+                                               <xsl:call-template name="chopPunctuation">
+                                                       <xsl:with-param name="chopString">
+                                                               <xsl:call-template name="subfieldSelect">
+                                                                       <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+                                                               </xsl:call-template>
+                                                       </xsl:with-param>
+                                               </xsl:call-template>
+                                       </title>
+                                       <xsl:call-template name="part"/>
+                               </titleInfo>
+                               <xsl:call-template name="relatedForm"/>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
+                       <relatedItem>
+                               <internetMediaType>
+                                       <xsl:value-of select="."/>
+                               </internetMediaType>
+                       </relatedItem>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='020']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">isbn</xsl:with-param>
+                       </xsl:call-template>
+                       <xsl:if test="marc:subfield[@code='a']">
+                               <identifier type="isbn">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:if>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">isrc</xsl:with-param>
+                       </xsl:call-template>
+                       <xsl:if test="marc:subfield[@code='a']">
+                               <identifier type="isrc">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:if>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">ismn</xsl:with-param>
+                       </xsl:call-template>
+                       <xsl:if test="marc:subfield[@code='a']">
+                               <identifier type="ismn">
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </identifier>
+                       </xsl:if>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">sici</xsl:with-param>
+                       </xsl:call-template>
+                       <identifier type="sici">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='022']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">issn</xsl:with-param>
+                       </xsl:call-template>
+                       <identifier type="issn">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='010']">
+                       <xsl:call-template name="isInvalid">
+                               <xsl:with-param name="type">lccn</xsl:with-param>
+                       </xsl:call-template>
+                       <identifier type="lccn">
+                               <xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
+                       </identifier>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='028']">
+                       <identifier>
+                               <xsl:attribute name="type">
+                                       <xsl:choose>
+                                               <xsl:when test="@ind1='0'">issue number</xsl:when>
+                                               <xsl:when test="@ind1='1'">matrix number</xsl:when>
+                                               <xsl:when test="@ind1='2'">music plate</xsl:when>
+                                               <xsl:when test="@ind1='3'">music publisher</xsl:when>
+                                               <xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
+                                       </xsl:choose>
+                               </xsl:attribute>
+                               <!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 028 -->
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">
+                                               <xsl:choose>
+                                                       <xsl:when test="@ind1='0'">ba</xsl:when>
+                                                       <xsl:otherwise>ab</xsl:otherwise>
+                                               </xsl:choose>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='037']">
+                       <identifier type="stock number">
+                               <!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 037 -->
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </identifier>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
+                       <identifier>
+                               <xsl:attribute name="type">
+                                       <xsl:choose>
+                                               <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')">doi</xsl:when>
+                                               <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')">hdl</xsl:when>
+                                               <xsl:otherwise>uri</xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:attribute>
+                               <xsl:choose>
+                                       <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
+                                               <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
+                                       </xsl:when>
+                                       <xsl:otherwise>
+                                               <xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+                       </identifier>
+                       <xsl:if test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
+                               <identifier type="hdl">
+                                       <xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">y3z</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
+                               </identifier>
+                       </xsl:if>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
+                       <identifier type="upc">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </identifier>
+               </xsl:for-each>
+               <!-- 1/04 fix added $y -->
+               <xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+                       <location>
+                               <url>
+                                       <xsl:if test="marc:subfield[@code='y' or @code='3']">
+                                               <xsl:attribute name="displayLabel">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">y3</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:if test="marc:subfield[@code='z' ]">
+                                               <xsl:attribute name="note">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">z</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
+
+                               </url>
+                       </location>
+               </xsl:for-each>
+                       
+                       <!-- 3.2 change tmee 856z  -->
+
+               
+               <xsl:for-each select="marc:datafield[@tag=852]">
+                       <location>
+                               <physicalLocation>
+                                       <xsl:call-template name="displayLabel"></xsl:call-template>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abje</xsl:with-param>
+                                       </xsl:call-template>
+                               </physicalLocation>
+                       </location>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=506]">
+                       <accessCondition type="restrictionOnAccess">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abcd35</xsl:with-param>
+                               </xsl:call-template>
+                       </accessCondition>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=540]">
+                       <accessCondition type="useAndReproduction">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">abcde35</xsl:with-param>
+                               </xsl:call-template>
+                       </accessCondition>
+               </xsl:for-each>
+               <recordInfo>
+                       <xsl:for-each select="marc:datafield[@tag=040]">
+                               <recordContentSource authority="marcorg">
+                                       <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                               </recordContentSource>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:controlfield[@tag=008]">
+                               <recordCreationDate encoding="marc">
+                                       <xsl:value-of select="substring(.,1,6)"></xsl:value-of>
+                               </recordCreationDate>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:controlfield[@tag=005]">
+                               <recordChangeDate encoding="iso8601">
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </recordChangeDate>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:controlfield[@tag=001]">
+                               <recordIdentifier>
+                                       <xsl:if test="../marc:controlfield[@tag=003]">
+                                               <xsl:attribute name="source">
+                                                       <xsl:value-of select="../marc:controlfield[@tag=003]"></xsl:value-of>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </recordIdentifier>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+                               <languageOfCataloging>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </languageTerm>
+                               </languageOfCataloging>
+                       </xsl:for-each>
+               </recordInfo>
+       </xsl:template>
+       <xsl:template name="displayForm">
+               <xsl:for-each select="marc:subfield[@code='c']">
+                       <displayForm>
+                               <xsl:value-of select="."></xsl:value-of>
+                       </displayForm>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="affiliation">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <affiliation>
+                               <xsl:value-of select="."></xsl:value-of>
+                       </affiliation>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="uri">
+               <xsl:for-each select="marc:subfield[@code='u']">
+                       <xsl:attribute name="xlink:href">
+                               <xsl:value-of select="."></xsl:value-of>
+                       </xsl:attribute>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="role">
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <role>
+                               <roleTerm type="text">
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </roleTerm>
+                       </role>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='4']">
+                       <role>
+                               <roleTerm authority="marcrelator" type="code">
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </roleTerm>
+                       </role>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="part">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">n</xsl:with-param>
+                               <xsl:with-param name="anyCodes">n</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <partNumber>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partNumber"></xsl:with-param>
+                               </xsl:call-template>
+                       </partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <partName>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partName"></xsl:with-param>
+                               </xsl:call-template>
+                       </partName>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="relatedPart">
+               <xsl:if test="@tag=773">
+                       <xsl:for-each select="marc:subfield[@code='g']">
+                               <part>
+                                       <text>
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </text>
+                               </part>
+                       </xsl:for-each>
+                       <xsl:for-each select="marc:subfield[@code='q']">
+                               <part>
+                                       <xsl:call-template name="parsePart"></xsl:call-template>
+                               </part>
+                       </xsl:for-each>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="relatedPartNumName">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">g</xsl:with-param>
+                               <xsl:with-param name="anyCodes">g</xsl:with-param>
+                               <xsl:with-param name="afterCodes">pst</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <partNumber>
+                               <xsl:value-of select="$partNumber"></xsl:value-of>
+                       </partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <partName>
+                               <xsl:value-of select="$partName"></xsl:value-of>
+                       </partName>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="relatedName">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <name>
+                               <namePart>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </namePart>
+                       </name>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedForm">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <form>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </form>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedExtent">
+               <xsl:for-each select="marc:subfield[@code='h']">
+                       <physicalDescription>
+                               <extent>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </extent>
+                       </physicalDescription>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedNote">
+               <xsl:for-each select="marc:subfield[@code='n']">
+                       <note>
+                               <xsl:value-of select="."></xsl:value-of>
+                       </note>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedSubject">
+               <xsl:for-each select="marc:subfield[@code='j']">
+                       <subject>
+                               <temporal encoding="iso8601">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                       </xsl:call-template>
+                               </temporal>
+                       </subject>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedIdentifierISSN">
+               <xsl:for-each select="marc:subfield[@code='x']">
+                       <identifier type="issn">
+                               <xsl:value-of select="."></xsl:value-of>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedIdentifierLocal">
+               <xsl:for-each select="marc:subfield[@code='w']">
+                       <identifier type="local">
+                               <xsl:value-of select="."></xsl:value-of>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedIdentifier">
+               <xsl:for-each select="marc:subfield[@code='o']">
+                       <identifier>
+                               <xsl:value-of select="."></xsl:value-of>
+                       </identifier>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedItem76X-78X">
+               <xsl:call-template name="displayLabel"></xsl:call-template>
+               <xsl:call-template name="relatedTitle76X-78X"></xsl:call-template>
+               <xsl:call-template name="relatedName"></xsl:call-template>
+               <xsl:call-template name="relatedOriginInfo"></xsl:call-template>
+               <xsl:call-template name="relatedLanguage"></xsl:call-template>
+               <xsl:call-template name="relatedExtent"></xsl:call-template>
+               <xsl:call-template name="relatedNote"></xsl:call-template>
+               <xsl:call-template name="relatedSubject"></xsl:call-template>
+               <xsl:call-template name="relatedIdentifier"></xsl:call-template>
+               <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+               <xsl:call-template name="relatedIdentifierLocal"></xsl:call-template>
+               <xsl:call-template name="relatedPart"></xsl:call-template>
+       </xsl:template>
+       <xsl:template name="subjectGeographicZ">
+               <geographic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                       </xsl:call-template>
+               </geographic>
+       </xsl:template>
+       <xsl:template name="subjectTemporalY">
+               <temporal>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                       </xsl:call-template>
+               </temporal>
+       </xsl:template>
+       <xsl:template name="subjectTopic">
+               <topic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                       </xsl:call-template>
+               </topic>
+       </xsl:template> 
+       <!-- 3.2 change tmee 6xx $v genre -->
+       <xsl:template name="subjectGenre">
+               <genre>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                       </xsl:call-template>
+               </genre>
+       </xsl:template>
+       
+       <xsl:template name="nameABCDN">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <namePart>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."></xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='b']">
+                       <namePart>
+                               <xsl:value-of select="."></xsl:value-of>
+                       </namePart>
+               </xsl:for-each>
+               <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+                       <namePart>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">cdn</xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="nameABCDQ">
+               <namePart>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">aq</xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:with-param>
+                               <xsl:with-param name="punctuation">
+                                       <xsl:text>:,;/ </xsl:text>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+               <xsl:call-template name="termsOfAddress"></xsl:call-template>
+               <xsl:call-template name="nameDate"></xsl:call-template>
+       </xsl:template>
+       <xsl:template name="nameACDEQ">
+               <namePart>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">acdeq</xsl:with-param>
+                       </xsl:call-template>
+               </namePart>
+       </xsl:template>
+       <xsl:template name="constituentOrRelatedType">
+               <xsl:if test="@ind2=2">
+                       <xsl:attribute name="type">constituent</xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="relatedTitle">
+               <xsl:for-each select="marc:subfield[@code='t']">
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                       </titleInfo>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedTitle76X-78X">
+               <xsl:for-each select="marc:subfield[@code='t']">
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='p']">
+                       <titleInfo type="abbreviated">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='s']">
+                       <titleInfo type="uniform">
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </title>
+                               <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+                                       <xsl:call-template name="relatedPartNumName"></xsl:call-template>
+                               </xsl:if>
+                       </titleInfo>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="relatedOriginInfo">
+               <xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
+                       <originInfo>
+                               <xsl:if test="@tag=775">
+                                       <xsl:for-each select="marc:subfield[@code='f']">
+                                               <place>
+                                                       <placeTerm>
+                                                               <xsl:attribute name="type">code</xsl:attribute>
+                                                               <xsl:attribute name="authority">marcgac</xsl:attribute>
+                                                               <xsl:value-of select="."></xsl:value-of>
+                                                       </placeTerm>
+                                               </place>
+                                       </xsl:for-each>
+                               </xsl:if>
+                               <xsl:for-each select="marc:subfield[@code='d']">
+                                       <publisher>
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </publisher>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <edition>
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </edition>
+                               </xsl:for-each>
+                       </originInfo>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="relatedLanguage">
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <xsl:call-template name="getLanguage">
+                               <xsl:with-param name="langString">
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="nameDate">
+               <xsl:for-each select="marc:subfield[@code='d']">
+                       <namePart type="date">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."></xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="subjectAuthority">
+               <xsl:if test="@ind2!=4">
+                       <xsl:if test="@ind2!=' '">
+                               <xsl:if test="@ind2!=8">
+                                       <xsl:if test="@ind2!=9">
+                                               <xsl:attribute name="authority">
+                                                       <xsl:choose>
+                                                               <xsl:when test="@ind2=0">lcsh</xsl:when>
+                                                               <xsl:when test="@ind2=1">lcshac</xsl:when>
+                                                               <xsl:when test="@ind2=2">mesh</xsl:when>
+                                                               <!-- 1/04 fix -->
+                                                               <xsl:when test="@ind2=3">nal</xsl:when>
+                                                               <xsl:when test="@ind2=5">csh</xsl:when>
+                                                               <xsl:when test="@ind2=6">rvm</xsl:when>
+                                                               <xsl:when test="@ind2=7">
+                                                                       <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+                                                               </xsl:when>
+                                                       </xsl:choose>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                               </xsl:if>
+                       </xsl:if>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="subjectAnyOrder">
+               <xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
+                       <xsl:choose>
+                               <xsl:when test="@code='v'">
+                                       <xsl:call-template name="subjectGenre"></xsl:call-template>
+                               </xsl:when>
+                               <xsl:when test="@code='x'">
+                                       <xsl:call-template name="subjectTopic"></xsl:call-template>
+                               </xsl:when>
+                               <xsl:when test="@code='y'">
+                                       <xsl:call-template name="subjectTemporalY"></xsl:call-template>
+                               </xsl:when>
+                               <xsl:when test="@code='z'">
+                                       <xsl:call-template name="subjectGeographicZ"></xsl:call-template>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:for-each>
+       </xsl:template>
+       <xsl:template name="specialSubfieldSelect">
+               <xsl:param name="anyCodes"></xsl:param>
+               <xsl:param name="axis"></xsl:param>
+               <xsl:param name="beforeCodes"></xsl:param>
+               <xsl:param name="afterCodes"></xsl:param>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($anyCodes, @code)      or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+                                       <xsl:value-of select="text()"></xsl:value-of>
+                                       <xsl:text> </xsl:text>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+       </xsl:template>
+       
+       <!-- 3.2 change tmee 6xx $v genre -->
+       <xsl:template match="marc:datafield[@tag=600]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <name type="personal">
+                               <xsl:call-template name="termsOfAddress"></xsl:call-template>
+                               <namePart>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">aq</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:call-template name="nameDate"></xsl:call-template>
+                               <xsl:call-template name="affiliation"></xsl:call-template>
+                               <xsl:call-template name="role"></xsl:call-template>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=610]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <name type="corporate">
+                               <xsl:for-each select="marc:subfield[@code='a']">
+                                       <namePart>
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:for-each select="marc:subfield[@code='b']">
+                                       <namePart>
+                                               <xsl:value-of select="."></xsl:value-of>
+                                       </namePart>
+                               </xsl:for-each>
+                               <xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
+                                       <namePart>
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">cdnp</xsl:with-param>
+                                               </xsl:call-template>
+                                       </namePart>
+                               </xsl:if>
+                               <xsl:call-template name="role"></xsl:call-template>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=611]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <name type="conference">
+                               <namePart>
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">abcdeqnp</xsl:with-param>
+                                       </xsl:call-template>
+                               </namePart>
+                               <xsl:for-each select="marc:subfield[@code='4']">
+                                       <role>
+                                               <roleTerm authority="marcrelator" type="code">
+                                                       <xsl:value-of select="."></xsl:value-of>
+                                               </roleTerm>
+                                       </role>
+                               </xsl:for-each>
+                       </name>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=630]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <titleInfo>
+                               <title>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">adfhklor</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                                       <xsl:call-template name="part"></xsl:call-template>
+                               </title>
+                       </titleInfo>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=650]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <topic>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">abcd</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </topic>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=651]">
+               <subject>
+                       <xsl:call-template name="subjectAuthority"></xsl:call-template>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+                               <geographic>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString" select="."></xsl:with-param>
+                                       </xsl:call-template>
+                               </geographic>
+                       </xsl:for-each>
+                       <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=653]">
+               <subject>
+                       <xsl:for-each select="marc:subfield[@code='a']">
+                               <topic>
+                                       <xsl:value-of select="."></xsl:value-of>
+                               </topic>
+                       </xsl:for-each>
+               </subject>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=656]">
+               <subject>
+                       <xsl:if test="marc:subfield[@code=2]">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code=2]"></xsl:value-of>
+                               </xsl:attribute>
+                       </xsl:if>
+                       <occupation>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </occupation>
+               </subject>
+       </xsl:template>
+       <xsl:template name="termsOfAddress">
+               <xsl:if test="marc:subfield[@code='b' or @code='c']">
+                       <namePart type="termsOfAddress">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">bc</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </namePart>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="displayLabel">
+               <xsl:if test="marc:subfield[@code='i']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='i']"></xsl:value-of>
+                       </xsl:attribute>
+               </xsl:if>
+               <xsl:if test="marc:subfield[@code='3']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='3']"></xsl:value-of>
+                       </xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="isInvalid">
+               <xsl:param name="type"/>
+               <xsl:if test="marc:subfield[@code='z'] or marc:subfield[@code='y']">
+                       <identifier>
+                               <xsl:attribute name="type">
+                                       <xsl:value-of select="$type"/>
+                               </xsl:attribute>
+                               <xsl:attribute name="invalid">
+                                       <xsl:text>yes</xsl:text>
+                               </xsl:attribute>
+                               <xsl:if test="marc:subfield[@code='z']">
+                                       <xsl:value-of select="marc:subfield[@code='z']"/>
+                               </xsl:if>
+                               <xsl:if test="marc:subfield[@code='y']">
+                                       <xsl:value-of select="marc:subfield[@code='y']"/>
+                               </xsl:if>
+                       </identifier>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="subtitle">
+               <xsl:if test="marc:subfield[@code='b']">
+                       <subTitle>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:value-of select="marc:subfield[@code='b']"/>
+                                               <!--<xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">b</xsl:with-param>                                                                 
+                                               </xsl:call-template>-->
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </subTitle>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="script">
+               <xsl:param name="scriptCode"></xsl:param>
+               <xsl:attribute name="script">
+                       <xsl:choose>
+                               <xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
+                               <xsl:when test="$scriptCode='(B'">Latin</xsl:when>
+                               <xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
+                               <xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
+                               <xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
+                               <xsl:when test="$scriptCode='(S'">Greek</xsl:when>
+                       </xsl:choose>
+               </xsl:attribute>
+       </xsl:template>
+       <xsl:template name="parsePart">
+               <!-- assumes 773$q= 1:2:3<4
+                    with up to 3 levels and one optional start page
+               -->
+               <xsl:variable name="level1">
+                       <xsl:choose>
+                               <xsl:when test="contains(text(),':')">
+                                       <!-- 1:2 -->
+                                       <xsl:value-of select="substring-before(text(),':')"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:when test="not(contains(text(),':'))">
+                                       <!-- 1 or 1<3 -->
+                                       <xsl:if test="contains(text(),'&lt;')">
+                                               <!-- 1<3 -->
+                                               <xsl:value-of select="substring-before(text(),'&lt;')"></xsl:value-of>
+                                       </xsl:if>
+                                       <xsl:if test="not(contains(text(),'&lt;'))">
+                                               <!-- 1 -->
+                                               <xsl:value-of select="text()"></xsl:value-of>
+                                       </xsl:if>
+                               </xsl:when>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="sici2">
+                       <xsl:choose>
+                               <xsl:when test="starts-with(substring-after(text(),$level1),':')">
+                                       <xsl:value-of select="substring(substring-after(text(),$level1),2)"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="substring-after(text(),$level1)"></xsl:value-of>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="level2">
+                       <xsl:choose>
+                               <xsl:when test="contains($sici2,':')">
+                                       <!--  2:3<4  -->
+                                       <xsl:value-of select="substring-before($sici2,':')"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:when test="contains($sici2,'&lt;')">
+                                       <!-- 1: 2<4 -->
+                                       <xsl:value-of select="substring-before($sici2,'&lt;')"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="$sici2"></xsl:value-of>
+                                       <!-- 1:2 -->
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="sici3">
+                       <xsl:choose>
+                               <xsl:when test="starts-with(substring-after($sici2,$level2),':')">
+                                       <xsl:value-of select="substring(substring-after($sici2,$level2),2)"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="substring-after($sici2,$level2)"></xsl:value-of>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="level3">
+                       <xsl:choose>
+                               <xsl:when test="contains($sici3,'&lt;')">
+                                       <!-- 2<4 -->
+                                       <xsl:value-of select="substring-before($sici3,'&lt;')"></xsl:value-of>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of select="$sici3"></xsl:value-of>
+                                       <!-- 3 -->
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:variable name="page">
+                       <xsl:if test="contains(text(),'&lt;')">
+                               <xsl:value-of select="substring-after(text(),'&lt;')"></xsl:value-of>
+                       </xsl:if>
+               </xsl:variable>
+               <xsl:if test="$level1">
+                       <detail level="1">
+                               <number>
+                                       <xsl:value-of select="$level1"></xsl:value-of>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$level2">
+                       <detail level="2">
+                               <number>
+                                       <xsl:value-of select="$level2"></xsl:value-of>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$level3">
+                       <detail level="3">
+                               <number>
+                                       <xsl:value-of select="$level3"></xsl:value-of>
+                               </number>
+                       </detail>
+               </xsl:if>
+               <xsl:if test="$page">
+                       <extent unit="page">
+                               <start>
+                                       <xsl:value-of select="$page"></xsl:value-of>
+                               </start>
+                       </extent>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="getLanguage">
+               <xsl:param name="langString"></xsl:param>
+               <xsl:param name="controlField008-35-37"></xsl:param>
+               <xsl:variable name="length" select="string-length($langString)"></xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="$length=0"></xsl:when>
+                       <xsl:when test="$controlField008-35-37=substring($langString,1,3)">
+                               <xsl:call-template name="getLanguage">
+                                       <xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
+                                       <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <language>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="substring($langString,1,3)"></xsl:value-of>
+                                       </languageTerm>
+                               </language>
+                               <xsl:call-template name="getLanguage">
+                                       <xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
+                                       <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template name="isoLanguage">
+               <xsl:param name="currentLanguage"></xsl:param>
+               <xsl:param name="usedLanguages"></xsl:param>
+               <xsl:param name="remainingLanguages"></xsl:param>
+               <xsl:choose>
+                       <xsl:when test="string-length($currentLanguage)=0"></xsl:when>
+                       <xsl:when test="not(contains($usedLanguages, $currentLanguage))">
+                               <language>
+                                       <xsl:if test="@code!='a'">
+                                               <xsl:attribute name="objectPart">
+                                                       <xsl:choose>
+                                                               <xsl:when test="@code='b'">summary or subtitle</xsl:when>
+                                                               <xsl:when test="@code='d'">sung or spoken text</xsl:when>
+                                                               <xsl:when test="@code='e'">libretto</xsl:when>
+                                                               <xsl:when test="@code='f'">table of contents</xsl:when>
+                                                               <xsl:when test="@code='g'">accompanying material</xsl:when>
+                                                               <xsl:when test="@code='h'">translation</xsl:when>
+                                                       </xsl:choose>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <languageTerm authority="iso639-2b" type="code">
+                                               <xsl:value-of select="$currentLanguage"></xsl:value-of>
+                                       </languageTerm>
+                               </language>
+                               <xsl:call-template name="isoLanguage">
+                                       <xsl:with-param name="currentLanguage">
+                                               <xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="remainingLanguages">
+                                               <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:call-template name="isoLanguage">
+                                       <xsl:with-param name="currentLanguage">
+                                               <xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="usedLanguages">
+                                               <xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
+                                       </xsl:with-param>
+                                       <xsl:with-param name="remainingLanguages">
+                                               <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template name="chopBrackets">
+               <xsl:param name="chopString"></xsl:param>
+               <xsl:variable name="string">
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString" select="$chopString"></xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="substring($string, 1,1)='['">
+                       <xsl:value-of select="substring($string,2, string-length($string)-2)"></xsl:value-of>
+               </xsl:if>
+               <xsl:if test="substring($string, 1,1)!='['">
+                       <xsl:value-of select="$string"></xsl:value-of>
+               </xsl:if>
+       </xsl:template>
+       <xsl:template name="rfcLanguages">
+               <xsl:param name="nodeNum"></xsl:param>
+               <xsl:param name="usedLanguages"></xsl:param>
+               <xsl:param name="controlField008-35-37"></xsl:param>
+               <xsl:variable name="currentLanguage" select="."></xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="not($currentLanguage)"></xsl:when>
+                       <xsl:when test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
+                               <xsl:if test="not(contains($usedLanguages,$currentLanguage))">
+                                       <language>
+                                               <xsl:if test="@code!='a'">
+                                                       <xsl:attribute name="objectPart">
+                                                               <xsl:choose>
+                                                                       <xsl:when test="@code='b'">summary or subtitle</xsl:when>
+                                                                       <xsl:when test="@code='d'">sung or spoken text</xsl:when>
+                                                                       <xsl:when test="@code='e'">libretto</xsl:when>
+                                                                       <xsl:when test="@code='f'">table of contents</xsl:when>
+                                                                       <xsl:when test="@code='g'">accompanying material</xsl:when>
+                                                                       <xsl:when test="@code='h'">translation</xsl:when>
+                                                               </xsl:choose>
+                                                       </xsl:attribute>
+                                               </xsl:if>
+                                               <languageTerm authority="rfc3066" type="code">
+                                                       <xsl:value-of select="$currentLanguage"/>
+                                               </languageTerm>
+                                       </language>
+                               </xsl:if>
+                       </xsl:when>
+                       <xsl:otherwise>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template name="datafield">
+               <xsl:param name="tag"/>
+               <xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
+               <xsl:param name="subfields"/>
+               <xsl:element name="marc:datafield">
+                       <xsl:attribute name="tag">
+                               <xsl:value-of select="$tag"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind1">
+                               <xsl:value-of select="$ind1"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind2">
+                               <xsl:value-of select="$ind2"/>
+                       </xsl:attribute>
+                       <xsl:copy-of select="$subfields"/>
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template name="subfieldSelect">
+               <xsl:param name="codes"/>
+               <xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($codes, @code)">
+                                       <xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+       </xsl:template>
+
+       <xsl:template name="buildSpaces">
+               <xsl:param name="spaces"/>
+               <xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
+               <xsl:if test="$spaces>0">
+                       <xsl:value-of select="$char"/>
+                       <xsl:call-template name="buildSpaces">
+                               <xsl:with-param name="spaces" select="$spaces - 1"/>
+                               <xsl:with-param name="char" select="$char"/>
+                       </xsl:call-template>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuation">
+               <xsl:param name="chopString"/>
+               <xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+                                       <xsl:with-param name="punctuation" select="$punctuation"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuationFront">
+               <xsl:param name="chopString"/>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+                               <xsl:call-template name="chopPunctuationFront">
+                                       <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>$$ WHERE name = 'mods32';
index 276b3f1..cf738be 100755 (executable)
@@ -19,11 +19,19 @@ PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 080.schema.mon
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 090.schema.action.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 200.schema.acq.sql
 
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 100.circ_matrix.sql
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 110.hold_matrix.sql
+
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 300.schema.staged_search.sql
+
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 500.view.cross-schema.sql
 
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 800.fkeys.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 900.audit-functions.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 901.audit-tables.sql
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 950.data.seed-values.sql
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 951.data.MODS-xsl.sql
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 952.data.MODS3-xsl.sql
+PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f 953.data.MODS32-xsl.sql
 
 PGPASSWORD=$5 PGUSER=$4 PGHOST=$1 PGPORT=$2 PGDATABASE=$3 psql -f reporter-schema.sql
index 88d310e..c359d91 100644 (file)
@@ -154,6 +154,75 @@ SELECT     x.id AS id,
        JOIN reporter.demographic dem ON (dem.id = u.id)
        JOIN actor.usr_address paddr ON (paddr.id = u.billing_address);
 
+CREATE OR REPLACE VIEW reporter.classic_item_list AS
+SELECT  t.value as title,
+    a.value as author,
+    p.value as pubdate,
+    cp.id,
+    cp.price,
+    cp.barcode,
+    cn.label as call_number_label,
+    CASE
+        WHEN call_number_dewey(cn.label) ~  E'^[0-9.]+$'
+            THEN
+                btrim(
+                    to_char(
+                        10 * floor((call_number_dewey(cn.label)::float) / 10), '000'
+                    )
+                )
+        ELSE NULL
+    END AS dewey_block_tens,
+    CASE
+        WHEN call_number_dewey(cn.label) ~  E'^[0-9.]+$'
+            THEN
+                btrim(
+                    to_char(
+                        100 * floor((call_number_dewey(cn.label)::float) / 100), '000'
+                    )
+                )
+        ELSE NULL
+    END AS dewey_block_hundreds,
+    (SELECT COUNT(*) FROM action.circulation WHERE target_copy = cp.id) as use_count,
+    cp.circ_modifier,
+    sl.name AS shelving_location,
+    sc1.stat_cat_entry AS stat_cat_1,
+    sc2.stat_cat_entry AS stat_cat_2,
+    sce1.value AS stat_cat_1_value,
+    sce2.value AS stat_cat_2_value,
+    cp.edit_date,
+    cp.create_date,
+    ol.shortname AS owning_lib_name,
+    cn.owning_lib,
+    cl.shortname AS circ_lib_name,
+    cl.id AS circ_lib,
+    cp.creator,
+    cp.age_protect,
+    cp.opac_visible,
+    cp.ref,
+    cp.deposit_amount,
+    cp.deleted,
+    b.tcn_value,
+    cp.status,
+    circ.stop_fines,
+    circ.due_date,
+    circ_card.barcode as patron_barcode,
+    circ_u.first_given_name || ' ' || circ_u.family_name as patron_name
+  FROM  asset.copy cp
+    JOIN asset.copy_location sl ON (cp.location = sl.id)
+    JOIN asset.call_number cn ON (cp.call_number = cn.id)
+    JOIN biblio.record_entry b ON (cn.record = b.id)
+    JOIN actor.org_unit ol ON (cn.owning_lib = ol.id)
+    JOIN actor.org_unit cl ON (cp.circ_lib = cl.id)
+    LEFT JOIN metabib.full_rec t ON (cn.record = t.record AND t.tag = '245' and t.subfield = 'a')
+    LEFT JOIN metabib.full_rec a ON (cn.record = a.record AND a.tag = '100' and a.subfield = 'a')
+    LEFT JOIN metabib.full_rec p ON (cn.record = p.record AND p.tag = '260' and p.subfield = 'c')
+    LEFT JOIN action.circulation circ ON (circ.target_copy = cp .id AND circ.checkin_time IS NULL)
+    LEFT JOIN actor.usr circ_u ON (circ_u.id = circ.usr)
+    LEFT JOIN actor.card circ_card ON (circ_u.id = circ_card.usr)
+    LEFT JOIN asset.stat_cat_entry_copy_map sc1 ON (sc1.owning_copy = cp.id AND sc1.stat_cat = 1)
+    LEFT JOIN asset.stat_cat_entry sce1 ON (sce1.id = sc1.stat_cat_entry)
+    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);
 
 COMMIT;
 
index e64674b..f42c7a3 100755 (executable)
@@ -1,42 +1,32 @@
 #!/bin/bash
-# -------------------------------------------------------------------
-#
-# XXX This probably only works on Linux for now...
+# ---------------------------------------------------------------
+# Copyright (C) 2007-2008  Georgia Public Library Service
 #
+# 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.
+# ---------------------------------------------------------------
+
+# -------------------------------------------------------------------
 # This script is used to manage "bricks", which are collections of
 # servers all serving a single OpenSRF domain.  There will be 1
-# lead machine, which will typcically run this script, and 1 or more
+# master machine, which will typcically run this script, and 1 or more
 # drones, which respond to this script.
-#
-# XXX The fetching and build commands need to be updated to work
-# with the now-separated OpenSRF 0.9 and Evergreen 1.2 
 # -------------------------------------------------------------------
-[ -f /etc/profile ] && . /etc/profile
-[ -f ~/.bashrc ] && . ~/.bashrc
-
-DRONE_COUNT=2; # how many drones are in this brick
-ETH_DEV="eth0" # ethernet device 
-PREFIX="/openils" # the installed ILS files prefix
 
-# this is useful if you are using ldirector.  we can
-# "detach" a brick by removing the ldirector ping file
-LDIRECTOR_FILE="/$PREFIX/var/web/ldirectorping.txt"
+# TODO finish the download and build functionality
 
-# XXX needs work
-SRC_DIR="/home/opensrf/ILS";
 
-STAFF_CLIENT_BUILD_ID="sc_v100_rc2";
-XUL_BASE="/$PREFIX/var/web/xul";
-
-IP_PREFIX=$(/sbin/ifconfig | grep -A1 $ETH_DEV | grep inet | cut -d'.' -f1,2,3 | cut -d':' -f2);
-IP=$(/sbin/ifconfig | grep -A1 $ETH_DEV | grep inet | cut -d'.' -f 4 | cut -d' ' -f1);
-FIRST=$(expr $IP + 1);
-LAST=$(expr $IP + $DRONE_COUNT);
+[ -f /etc/profile ] && . /etc/profile
+[ -f ~/.bashrc ] && . ~/.bashrc
 
-OSRF_PID_DIR="/tmp/";
-OSRF_CONFIG="/$PREFIX/conf/opensrf_core.xml";
-LOCAL_BASE="osrf_ctl.sh -d $OSRF_PID_DIR -c $OSRF_CONFIG";
-DRONE_BASE=". /etc/profile && osrf_ctl.sh -d $OSRF_PID_DIR -c $OSRF_CONFIG";
+DEFAULT_CONFIG=~/.oils_brick.cfg
 
 
 # -------------------------------------------------------------------
@@ -44,175 +34,188 @@ DRONE_BASE=". /etc/profile && osrf_ctl.sh -d $OSRF_PID_DIR -c $OSRF_CONFIG";
 # -------------------------------------------------------------------
 [ $(whoami) != 'opensrf' ] && echo 'Must run as user "opensrf"' && exit;
 
+
 function usage {
-       echo "";        
-       echo "usage: $0 -a <action>"
-       echo "  -u <base_url> : host + path URL where the download file lives";
-       echo "  -f <build_file> : the name of the bundle to fetch";
-       echo "  -x <xul_dir> : the destination xul directory";
-       echo "Actions:";        
-       echo "  fetch";
-       echo "  start_perl";
-       echo "  start_c";
-       echo "  start_perl_c";
-       echo "  start_all";
-       echo "  stop_perl";
-       echo "  stop_c";
-       echo "  stop_perl_c";
-       echo "  stop_all";
-       echo "  restart_perl";
-       echo "  restart_c";
-       echo "  restart_perl_c";
-       echo "  restart_all";
-       echo "  build";
-       echo "  build_xul";
-       echo "  detach_brick";
-       echo "  attach_brick";
-       exit 0;
+    echo "";    
+    echo "usage: $0 -a <action>"
+    echo "  -u <base_url> : host + path URL where the download file lives";
+    echo "  -f <build_file> : the name of the bundle to fetch";
+    echo "  -x <xul_dir> : staff client build directory";
+    echo "  -i <xul_build_id> : staff client build ID";
+    echo "Actions:";    
+    echo "  fetch";
+    echo "  start_perl";
+    echo "  start_c";
+    echo "  start_osrf";
+    echo "  start_all";
+    echo "  stop_perl";
+    echo "  stop_c";
+    echo "  stop_osrf";
+    echo "  stop_all";
+    echo "  restart_perl";
+    echo "  restart_c";
+    echo "  restart_osrf";
+    echo "  restart_all";
+    echo "  build";
+    echo "  build_xul";
+    echo "  detach_brick";
+    echo "  attach_brick";
+    exit 0;
 }
 
 
 # -------------------------------------------------------------------
 # Load the config opts
 # -------------------------------------------------------------------
-while getopts  "a:x:bf:hu:" flag; do
-       case $flag in   
-               "a") OPT_ACTION="$OPTARG";;
-               "x") OPT_XUL_DIR="$OPTARG";;
-               "u") OPT_FETCH_BASE_URL="$OPTARG";;
-               "f") OPT_FETCH_FILE="$OPTARG";;
-               "h"|*) usage;;
-       esac;
+while getopts  "a:x:bf:hu:c:i:" flag; do
+    case $flag in   
+        "a") OPT_ACTION="$OPTARG";;
+        "u") OPT_FETCH_BASE_URL="$OPTARG";;
+        "f") OPT_FETCH_FILE="$OPTARG";;
+        "x") OPT_XUL_BUILD_DIR="$OPTARG";;
+        "i") OPT_XUL_BUILD_ID="$OPTARG";;
+        "c") OPT_CONFIG_FILE="$OPTARG";;
+        "h"|*) usage;;
+    esac;
 done
 
-
-
+# -------------------------------------------------------------------
+# Load the config file
+# -------------------------------------------------------------------
+if [ -e "$OPT_CONFIG_FILE" ]; then
+    . $OPT_CONFIG_FILE;
+else
+    if [ -e ~/.oils_brick.cfg ]; then
+        . $DEFAULT_CONFIG; 
+    else
+        echo "Please specify a valid config file or create one at $DEFAULT_CONFIG";
+    fi;
+fi;
+
+
+# make sure an action was specified
 [ -z "$OPT_ACTION" ] && usage;
 
+LOCAL_BASE="osrf_ctl.sh -d $OSRF_PID_DIR -c $OSRF_CONFIG";
+DRONE_BASE=". /etc/profile && osrf_ctl.sh -d $OSRF_PID_DIR -c $OSRF_CONFIG";
 
 # -------------------------------------------------------------------
-# Runs DRONE_ACT on the drones, the LOCAL_ACT on the local machine
+# Runs DRONE_ACT on the drones, then LOCAL_ACT on the local machine
 # -------------------------------------------------------------------
 function drone_first {
-       LOCAL_ACT=$1
-       DRONE_ACT=$2
-       SLEEP=$3;
-       echo -e "\ndrone_first() $LOCAL_ACT\n";
-       for(( i = $FIRST; i <= $LAST; i++ )) {
-               echo -e "\n$IP_PREFIX.$i\n"
-               ssh $OPT_SSH_BACKGROUND "$IP_PREFIX.$i" "$DRONE_ACT";
-               [ -n "$SLEEP" -a -n "$OPT_SSH_BACKGROUND" ] && sleep $SLEEP;
-       }
-       $LOCAL_ACT;
+    LOCAL_ACT=$1
+    DRONE_ACT=$2
+    echo "drone_first(): $LOCAL_ACT";
+    for drone in ${DRONES[@]:0}; do
+        echo "* $drone"
+        ssh "$drone" "$DRONE_ACT";
+    done;   
+    $LOCAL_ACT;
 }
 
 # -------------------------------------------------------------------
-# Runs LOCAL_ACT on the local machine and DRONE_ACT on the drones
+# Runs LOCAL_ACT on the local machine then DRONE_ACT on the drones
 # -------------------------------------------------------------------
 function local_first {
-       LOCAL_ACT=$1
-       DRONE_ACT=$2
-       SLEEP=$3;
-       echo -e "\nlocal_first() $LOCAL_ACT\n";
-       $LOCAL_ACT;
-       for(( i = $FIRST; i <= $LAST; i++ )) {
-               echo -e "\n$IP_PREFIX.$i\n"
-               ssh $OPT_SSH_BACKGROUND "$IP_PREFIX.$i" "$DRONE_ACT";
-               [ -n "$SLEEP" -a -n "$OPT_SSH_BACKGROUND" ] && sleep $SLEEP;
-       }
+    LOCAL_ACT=$1
+    DRONE_ACT=$2
+    echo  "local_first(): $LOCAL_ACT";
+    $LOCAL_ACT;
+    for drone in ${DRONES[@]:0}; do
+        echo "* $drone"
+        ssh "$drone" "$DRONE_ACT";
+    done;   
 }
 
 function make_xul {
-       [ -z "$OPT_XUL_DIR" ] && echo "Try again with -x to specify xul directory" && exit;
-       DIR="$XUL_BASE/$OPT_XUL_DIR";
-       echo "Building XUL and copying to $DIR";
-       cd "$SRC_DIR/Open-ILS/xul/staff_client" 
-       make clean;
-       make STAFF_CLIENT_BUILD_ID="$STAFF_CLIENT_BUILD_ID";
-       cd /$PREFIX/var/web/xul/
-       mkdir -p "$DIR";
-       cd "$DIR";
-       cp -r "$SRC_DIR/Open-ILS/xul/staff_client/build/server" "$DIR";
-       #cp /$PREFIX/var/web/xul/*.jpg "$DIR/server/";
-       #cp /$PREFIX/var/web/xul/index.html "$DIR/server/";
-       #cd /$PREFIX/var/web/xul/;
-       echo -e "\n[pwd=$PWD] Linking to new build directory: $STAFF_CLIENT_BUILD_ID -> $DIR\n";
-       rm "$STAFF_CLIENT_BUILD_ID";
-       ln -s "$OPT_XUL_DIR" "$STAFF_CLIENT_BUILD_ID";
+    DIR="$XUL_BASE/$OPT_XUL_BUILD_DIR";
+    echo "Building XUL and copying to $DIR";
+    cd "$OILS_SRC_DIR/Open-ILS/xul/staff_client" 
+    make clean;
+    make STAFF_CLIENT_BUILD_ID="$OPT_XUL_BUILD_ID";
+    cd "$XUL_BASE";
+    mkdir -p "$DIR";
+    cd "$DIR/..";
+    cp -r "$OILS_SRC_DIR/Open-ILS/xul/staff_client/build/server" "$DIR";
+    echo -e "\nLinking to new build directory: $OPT_XUL_BUILD_ID -> $DIR\n";
+    rm -f "$OPT_XUL_BUILD_ID";
+    rm -f current;
+    ln -s "$OPT_XUL_BUILD_DIR" current;
+    ln -s current "$OPT_XUL_BUILD_ID";
 }
 
 function detach_brick {
-       echo -n "Detaching brick...";
-
-       [ ! -f "$LDIRECTOR_FILE" ] && \
-               echo "ping file already moved, skipping ..." && return 0;
-
-       mv -f "$LDIRECTOR_FILE" "$LDIRECTOR_FILE.x"
-       x=10;
-       while(sleep 1); do
-               x=$(expr $x - 1);
-               echo -n " $x ";
-               [ $x == 0 ] && break;
-       done;
-       echo "";
+    echo -n "Detaching brick...";
+
+    [ ! -f "$LDIRECTOR_FILE" ] && \
+        echo "ping file already moved, skipping ..." && return 0;
+
+    mv -f "$LDIRECTOR_FILE" "$LDIRECTOR_FILE-"
+    x=10;
+    while(sleep 1); do
+        x=$(expr $x - 1);
+        echo -n " $x ";
+        [ $x == 0 ] && break;
+    done;
+    echo "";
 }
 
 function fetch_build {
 
-       [ -z "$OPT_FETCH_BASE_URL" -o -z "$OPT_FETCH_FILE" ] && \
-               echo "I need a build URL and a bundle file..." && exit;
-       
-       NEW_DIR=${OPT_FETCH_FILE:0:$(expr ${#OPT_FETCH_FILE} - 7)};
-
-       if [ ! -d "$NEW_DIR" ]; then
-       
-               echo "Fetching archive...  $OPT_FETCH_BASE_URL$OPT_FETCH_FILE";
-               wget -q "$OPT_FETCH_BASE_URL$OPT_FETCH_FILE";
-       
-               [ ! -f "$OPT_FETCH_FILE" ] && \
-                       echo "Unable to fetch $OPT_FETCH_FILE!" && exit;
-               
-               # unpack the new build
-               echo "Unpacking archive..."
-               tar -zxf $OPT_FETCH_FILE;
-               cp "ILS/install.conf" "$NEW_DIR/"
-               rm $OPT_FETCH_FILE;
-       fi;
-
-       rm ILS;
-       ln -s $NEW_DIR ILS
+    [ -z "$OPT_FETCH_BASE_URL" -o -z "$OPT_FETCH_FILE" ] && \
+        echo "I need a build URL and a bundle file..." && exit;
+    
+    NEW_DIR=${OPT_FETCH_FILE:0:$(expr ${#OPT_FETCH_FILE} - 7)};
+
+    if [ ! -d "$NEW_DIR" ]; then
+    
+        echo "Fetching archive...  $OPT_FETCH_BASE_URL$OPT_FETCH_FILE";
+        wget -q "$OPT_FETCH_BASE_URL$OPT_FETCH_FILE";
+    
+        [ ! -f "$OPT_FETCH_FILE" ] && \
+            echo "Unable to fetch $OPT_FETCH_FILE!" && exit;
+        
+        # unpack the new build
+        echo "Unpacking archive..."
+        tar -zxf $OPT_FETCH_FILE;
+        cp "current/install.conf" "$NEW_DIR/"
+        rm $OPT_FETCH_FILE;
+    fi;
+
+    rm current;
+    ln -s $NEW_DIR current;
 }
 
 case $OPT_ACTION in
 
-       "start_perl_c") local_first "$LOCAL_BASE -a start_perl && $LOCAL_BASE -a start_c" \
-               "$DRONE_BASE -a start_perl && $DRONE_BASE -a start_c" 4;;
+    "start_osrf") local_first "$LOCAL_BASE -a start_perl && $LOCAL_BASE -a start_c" \
+        "$DRONE_BASE -a start_perl && $DRONE_BASE -a start_c";;
 
-       "stop_perl_c") drone_first "$LOCAL_BASE -a stop_perl && $LOCAL_BASE -a stop_c" \
-               "$DRONE_BASE -a stop_perl && $DRONE_BASE -a stop_c" 2;;
+    "stop_osrf") drone_first "$LOCAL_BASE -a stop_perl && $LOCAL_BASE -a stop_c" \
+        "$DRONE_BASE -a stop_perl && $DRONE_BASE -a stop_c";;
 
-       "restart_perl_c") local_first "$LOCAL_BASE -a restart_perl && $LOCAL_BASE -a restart_c" \
-               "$DRONE_BASE -a restart_perl && $DRONE_BASE -a restart_c" 4;;
+    "restart_osrf") local_first "$LOCAL_BASE -a restart_perl && $LOCAL_BASE -a restart_c" \
+        "$DRONE_BASE -a restart_perl && $DRONE_BASE -a restart_c";;
 
-       "start_perl") local_first "$LOCAL_BASE -a start_perl" "$DRONE_BASE -a start_perl" 4;;
-       "stop_perl") drone_first "$LOCAL_BASE -a stop_perl" "$DRONE_BASE -a stop_perl" 2;;
-       "restart_perl") local_first "$LOCAL_BASE -a restart_perl" "$DRONE_BASE -a restart_perl" 4;;
-       "start_c") local_first "$LOCAL_BASE -a start_c" "$DRONE_BASE -a start_c" 2;;
-       "stop_c") drone_first "$LOCAL_BASE -a stop_c" "$DRONE_BASE -a stop_c" 2;;
-       "restart_c") local_first "$LOCAL_BASE -a restart_c" "$DRONE_BASE -a restart_c" 2;;
+    "start_perl") local_first "$LOCAL_BASE -a start_perl" "$DRONE_BASE -a start_perl";;
+    "stop_perl") drone_first "$LOCAL_BASE -a stop_perl" "$DRONE_BASE -a stop_perl";;
+    "restart_perl") local_first "$LOCAL_BASE -a restart_perl" "$DRONE_BASE -a restart_perl";;
+    "start_c") local_first "$LOCAL_BASE -a start_c" "$DRONE_BASE -a start_c";;
+    "stop_c") drone_first "$LOCAL_BASE -a stop_c" "$DRONE_BASE -a stop_c";;
+    "restart_c") local_first "$LOCAL_BASE -a restart_c" "$DRONE_BASE -a restart_c";;
 
-       "start_all") local_first "$LOCAL_BASE -a start_all" \
-               "$DRONE_BASE -a start_perl && $DRONE_BASE -a start_c" 4;;
+    "start_all") local_first "$LOCAL_BASE -a start_all" \
+        "$DRONE_BASE -a start_perl && $DRONE_BASE -a start_c";;
 
-       "stop_all") drone_first "$LOCAL_BASE -a stop_all" \
-               "$DRONE_BASE -a stop_perl && $DRONE_BASE -a stop_c" 2;;
+    "stop_all") drone_first "$LOCAL_BASE -a stop_all" \
+        "$DRONE_BASE -a stop_perl && $DRONE_BASE -a stop_c";;
 
-       "restart_all") $0 -a stop_all; $0 -a start_all;;
-       "build") cd ~/ILS/ && make clean default_config all;;
-       "build_xul") make_xul;;
-       "detach_brick") detach_brick;;
-       "attach_brick") mv "$LDIRECTOR_FILE.x" "$LDIRECTOR_FILE";;
-       "fetch") fetch_build;;
+    "restart_all") $0 -a stop_all; $0 -a start_all;;
+    "build") cd ~/ILS/ && make clean default_config all;;
+    "build_xul") make_xul;;
+    "detach_brick") detach_brick;;
+    "attach_brick") mv "$LDIRECTOR_FILE-" "$LDIRECTOR_FILE";;
+    "fetch") fetch_build;;
 esac;
 
 
index e2714e3..42327d0 100755 (executable)
@@ -16,11 +16,13 @@ if(1) { # XXX command line param
 
     use OpenSRF::Utils::JSON;
     use IPC::Open2 qw/open2/;
+    use Net::Domain qw/hostfqdn/;
 
     sub runmethod {
         my $method = shift;
         my $flag = shift;
-        my $command = "echo \"open-ils.storage $method\" | $oils_reqr -f $config -c $context";
+        my $hostname = hostfqdn();
+        my $command = "echo \"open-ils.storage $method\" | $oils_reqr -f $config -c $context -h $hostname";
         warn "-> $command\n";
 
         my ($child_stdout, $child_stdin);
diff --git a/Open-ILS/src/support-scripts/oils_brick.cfg.example b/Open-ILS/src/support-scripts/oils_brick.cfg.example
new file mode 100644 (file)
index 0000000..68c69e5
--- /dev/null
@@ -0,0 +1,18 @@
+# install prefix
+export PREFIX=/openils
+# this is the lead machine
+export MASTER="10.1.0.10"
+# array of drone machines
+export DRONES=("10.1.0.11" "10.1.0.12" "10.1.0.13" "10.1.0.14")
+# if you use ldirector (or similar), this is the ping file
+export LDIRECTOR_FILE="/$PREFIX/var/web/ldirectorping.txt"
+# ILS sources directory
+export OILS_SRC_DIR=/home/opensrf/current
+# OpenSRF sources directory
+export OSRF_SRC_DIR=/home/opensrf/OpenSRF-0.9
+# XUL install prefix
+export XUL_BASE="/$PREFIX/var/web/xul"
+# OpenSRF bootstrap config
+export OSRF_CONFIG="/$PREFIX/conf/opensrf_core.xml"
+# ILS PID directory
+export OSRF_PID_DIR=/var/run/evergreen
index 90c4e53..7b9d8aa 100755 (executable)
@@ -306,6 +306,7 @@ sub get_debug_info {
 __DATA__
 LWP::UserAgent
 XML::LibXML
+XML::LibXML::XPathContext
 XML::LibXSLT
 Net::Server::PreFork
 Cache::Memcached
@@ -331,3 +332,5 @@ Text::CSV
 Text::CSV_XS
 Spreadsheet::WriteExcel::Big
 Tie::IxHash
+Parse::RecDescent
+SRU
diff --git a/Open-ILS/web/conify/global/actor/org_unit.html b/Open-ILS/web/conify/global/actor/org_unit.html
new file mode 100644 (file)
index 0000000..7077479
--- /dev/null
@@ -0,0 +1,815 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title>Confiy :: Global :: Actor :: Org Units</title>
+
+               <style type="text/css">
+                       @import url("/js/dojo/dojo/resources/dojo.css");
+                       @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+                       @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+               </style>
+
+               <style>
+                       html, body
+                       {
+                               height: 100%;
+                               width: 100%;
+                               margin: 0px 0px 0px 0px;
+                               padding: 0px 0px 0px 0px;
+                               overflow: hidden;
+                       }
+
+                       th
+                       {
+                               text-align: right;
+                               font-weight: bold;
+                               padding-left: 20px;
+                               padding-right: 5px;
+                       }
+               </style>
+
+               <!-- The OpenSRF API writ JS -->
+               <script language='javascript' src='/opac/common/js/utils.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/Cookies.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/CGI.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/JSON_v1.js' type='text/javascript'></script>
+
+               <!-- Dojo goodness -->
+               <script type="text/javascript" src="../admin.js"></script>
+
+               <script type="text/javascript" src="/js/dojo/dojo/dojo.js"></script>
+               <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+               <script type="text/javascript" src="org_unit.js"></script>
+
+       </head>
+
+       <body class="tundra" id='pagebody'>
+
+               <div dojoType="dijit.layout.SplitContainer" orientation="horizontal" style="height: 100%">
+
+                       <div dojoType="dijit.layout.ContentPane" sizeShare="100">
+                               <script type="dojo/method">
+
+                                       var ou_list_data = { label : 'shortname', identifier : 'id' };
+                                       window.dirtyStore = [];
+               
+                                       pCRUD.request({
+                                               method : 'open-ils.permacrud.search.aou.atomic',
+                                               timeout : 15,
+                                               params : [ ses, { id : { "!=" : null } }, { order_by : { aou : 'shortname' } } ],
+                                               onerror : function (r) { throw 'Problem fetching org units';},
+                                               oncomplete : function (r) {
+                                                       window._ou_list = r.recv().content();
+                                                       window._ou_data = aou.toStoreData( window._ou_list );
+                                                       window.ou_list_store = new dojo.data.ItemFileWriteStore({ data : window._ou_data });
+
+                                                       window.ou_list_store.onSet = function (item, attr, o, n) {
+                                                               if (attr == 'ischanged') return;
+                                                               if (n == o) return;
+                                                               this.setValue( item, 'ischanged', 1);
+                                                       };
+
+                                                       dojo.addOnUnload( function (event) {
+
+                                                               ou_list_store.fetch({
+                                                                       query : { ischanged : 1 },
+                                                                       queryOptions : { deep : true },
+                                                                       onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+                                                                       scope : ou_list_store
+                                                               });
+
+                                                               if (dirtyStore.length > 0) {
+                                                                       var confirmation = confirm(
+                                                                               'There are unsaved modified Organizational Units!  '+
+                                                                               'OK to save these changes, Cancel to abandon them.'
+                                                                       );
+
+                                                                       if (confirmation) {
+                                                                               for (var i in window.dirtyStore) {
+                                                                                       window.current_ou = window.dirtyStore[i];
+                                                                                       save_org(true);
+                                                                               }
+                                                                       }
+                                                               }
+
+                                                       });
+                                               }
+                                       }).send();
+
+                    pCRUD.request({
+                        method : 'open-ils.permacrud.search.aout.atomic',
+                        timeout : 10,
+                        params : [ ses, { id : { "!=" : null } }, { order_by : { aout : 'depth' } } ],
+                        onerror : function (r) { status_update('Problem fetching types') },
+                        oncomplete : function (r) {
+                            window._ou_type_list = r.recv().content();
+                            window._ou_type_data = aout.toStoreData( window._ou_type_list );
+                            window.ou_type_store = new dojo.data.ItemFileReadStore({ data : window._ou_type_data });
+                        }
+                    }).send();
+
+                                       highlighter.ou_tree = {};
+                                       highlighter.editor_pane = {};
+                                       highlighter.hoo_pane = {};
+                                       highlighter.addresses_pane = {};
+
+                                       highlighter.ou_tree.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'ou_tree', duration : 500 } );
+                                       highlighter.ou_tree.red = dojox.fx.highlight( { color : '#FF2018', node : 'ou_tree', duration : 500 } );
+
+                                       highlighter.editor_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'editor_pane', duration : 500 } );
+                                       highlighter.editor_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'editor_pane', duration : 500 } );
+
+                                       highlighter.hoo_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'hoo_pane', duration : 500 } );
+                                       highlighter.hoo_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'hoo_pane', duration : 500 } );
+
+                                       highlighter.addresses_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'addresses_pane', duration : 500 } );
+                                       highlighter.addresses_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'addresses_pane', duration : 500 } );
+                               </script>
+                               <div
+                                 id="ou_tree"
+                                 label="Organizational Units"
+                                 query="{'_top':'true'}"
+                                 dojoType="dijit.Tree"
+                                 store="ou_list_store"
+                                 minSize="200"
+                                 jsId="ou_tree"
+                               >
+
+                                       <script type="dojo/method" event="onClick" args="item,node">
+
+                                               right_pane_toggler.show();
+
+                                               current_ou = item;
+                                               window.current_fm_ou = new aou().fromStoreItem(item);
+
+                                               highlighter.editor_pane.green.play();
+                                               status_update( 'Now editing ' + this.store.getValue( item, 'name' ) );
+
+                                               new_kid_button.disabled = false;
+                                               save_ou_button.disabled = false;
+                                               delete_ou_button.disabled = false;
+
+                                               dojo.byId('current_ou_name').innerHTML = this.store.getValue( current_ou, 'name' );
+
+                                               var main_settings_fields = [ 'name', 'shortname', 'email', 'phone', 'ou_type' ];
+                                               for ( var i in main_settings_fields ) {
+                                                       var field = main_settings_fields[i];
+                                                       var value = this.store.getValue( current_ou, field );
+
+                                                       if (!value) {
+                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                       } else window["editor_pane_" + field].setValue( value );
+                                               }
+
+                                               if ( this.store.getValue( current_ou, '_trueRoot' ) == 'true' ) {
+                                                       editor_pane_parent_ou.disabled = true;
+                                                       editor_pane_parent_ou.setValue(null);
+                                                       editor_pane_parent_ou.setDisplayedValue('');
+                                                       editor_pane_parent_ou.validate(false);
+                                               } else {
+                                                       editor_pane_parent_ou.disabled = false;
+                                                       editor_pane_parent_ou.validate(true);
+                                                       editor_pane_parent_ou.setValue( this.store.getValue( current_ou, 'parent_ou' ) );
+                                               }
+
+                                               editor_pane_opac_visible.setChecked( this.store.getValue( current_ou, 'opac_visible' ) == 't' ? true : false );
+
+                                               hoo_load();
+                                               addr_load();
+
+                                       </script>
+
+                                       <script type="dojo/method" event="getLabel" args="item,pI">
+                                               var label = this.store.getValue(item,'shortname') + ' : ' + this.store.getValue(item,'name');
+                                               if (this.store.getValue(item,'ischanged') == 1) label = '* ' + label;
+                                               return label;
+                                       </script>
+
+                               </div>
+                       </div>
+
+                       <div jsId="right_pane" id="right_pane" dojoType="dijit.layout.ContentPane"  sizeShare="200">
+                               <script type="dojo/method">
+                                       window.right_pane_toggler = new dojo.fx.Toggler({ node: 'right_pane'});
+                                       window.right_pane_toggler.hide();
+                               </script>
+
+                               <div id="right_tabpane" dojoType="dijit.layout.TabContainer">
+       
+                                       <div id="editor_pane" dojoType="dijit.layout.ContentPane" title="Main Settings">
+
+                                               <table class="tundra" style="margin:10px;">
+                                                       <tr>
+                                                               <th>Org Unit Name</th>
+                                                               <td>
+                                                                       <span id="editor_pane_name" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_name" regExp=".+" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_ou) ou_list_store.setValue( current_ou, "name", this.getValue() );
+                                                                               </script>
+                                                                       </span>
+                                                                       <span dojoType="openils.I18N.translationWidget" targetObject="current_fm_ou" field="name"></span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Org Unit Policy Code</th>
+                                                               <td>
+                                                                       <span id="editor_pane_shortname" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_shortname" uppercase="true" regExp=".+" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_ou) ou_list_store.setValue( current_ou, "shortname", this.getValue() );
+                                                                               </script>
+                                                                       </span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Main Email Address</th>
+                                                               <td>
+                                                                       <span id="editor_pane_email" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_email" regExp="^\w+\@\w+(?:\.\w+)+$">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_ou) ou_list_store.setValue( current_ou, "email", this.getValue() );
+                                                                               </script>
+                                                                       </span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Main Phone Number</th>
+                                                               <td>
+                                                                       <span id="editor_pane_phone" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_phone" regExp="^(?:(?:\d{1}[ -\.])?\(?\d{3}\)?[ -\.]{1})?\d{3}[ -\.]{1}\d{4}(| \S+.*)$">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_ou) ou_list_store.setValue( current_ou, "phone", this.getValue() );
+                                                                               </script>
+                                                                       </span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Org Unit Type</th>
+                                                               <td>
+                                                                       <div
+                                                                         id="editor_pane_ou_type"
+                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                         jsId="editor_pane_ou_type"
+                                                                         store="ou_type_store"
+                                                                         searchAttr="name"
+                                                                         ignoreCase="true"
+                                                                         required="true"
+                                                                       >
+                                                                               <script type="dojo/method" event="onChange">
+                                                                                       if (current_ou) ou_list_store.setValue( current_ou, "ou_type", this.getValue() );
+                                                                               </script>
+                                                                       </div>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Parent Org Unit</th>
+                                                               <td>
+                                                                       <div
+                                                                         id="editor_pane_parent_ou"
+                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                         jsId="editor_pane_parent_ou"
+                                                                         store="ou_list_store"
+                                                                         searchAttr="shortname"
+                                                                         ignoreCase="true"
+                                                                         required="true"
+                                                                       >
+                                                                               <script type="dojo/method" event="onChange">
+                                                                                       if (current_ou && this.getValue()) this.store.setValue( current_ou, "parent_ou", this.getValue() );
+                                                                                       if ( this.store.getValue( current_ou, '_trueRoot' ) == 'true' ) this.required = false;
+                                                                                       else this.required = true;
+                                                                               </script>
+                                                                       </div>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>OPAC Visible</th>
+                                                               <td>
+                                                                       <input
+                                                                         id="editor_pane_opac_visible"
+                                                                         jsId="editor_pane_opac_visible"
+                                                                         type="checkbox"
+                                                                         dojoType="dijit.form.CheckBox"
+                                                                         onChange='if (current_ou) ou_list_store.setValue( current_ou, "opac_visible", this.checked ? "t" : "f" );'
+                                                                       />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+       
+                                               <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 20px;">
+       
+                                                       <button jsId="save_ou_button" dojoType="dijit.form.Button" label="Save" onClick="save_org()">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                       </button>
+       
+                                                       <button jsId="delete_ou_button" dojoType="dijit.form.Button" label="Delete">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                               <script type="dojo/connect" event="onClick">
+       
+                                                                       var old_name = ou_list_store.getValue( current_ou, 'name' );
+
+                                                                       if (ou_list_store.getValue( current_ou, '_trueRoot' ) == 'true') {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Cannot delete' + ou_list_store.getValue( current_ou, 'name' ) + ', you need at least one.' );
+                                                                               return false;
+                                                                       }
+
+                                                                       if ( current_ou.children ) {
+                                                                               var kids = current_ou.children;
+                                                                               if (!dojo.isArray(kids)) kids = [kids];
+       
+                                                                               var existing_kids = dojo.filter(
+                                                                                       kids,
+                                                                                       function(kid){ return kid.isdeleted[0] != 1 }
+                                                                               );
+                                                                               if ( existing_kids.length > 0) {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Cannot delete' + ou_list_store.getValue( current_ou, 'name' ) + ', ' + existing_kids.length + ' subordinates still exist.' );
+                                                                                       return;
+                                                                               }
+                                                                       }
+       
+                                                                       if ( confirm('Are you sure you want to delete ' + current_ou.name + '?')) {
+                                                                               ou_list_store.setValue( current_ou, 'isdeleted', 1 );
+       
+                                                                               var modified_ou = new aou().fromStoreItem( current_ou );
+                                                                               modified_ou.isdeleted( 1 );
+       
+                                                                               pCRUD.request({
+                                                                                       method : 'open-ils.permacrud.delete.aou',
+                                                                                       timeout : 10,
+                                                                                       params : [ ses, modified_ou ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.editor_pane.red.play();
+                                                                                               status_update( 'Problem deleting ' + old_name );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+       
+                                                                                                       ou_list_store.fetch({
+                                                                                                               query : { id : ou_list_store.getValue( current_ou, 'id' ) },
+                                                                                                               queryOptions : { deep : true },
+                                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                                               scope : ou_list_store
+                                                                                                       });
+       
+                                                                                                       current_ou = null;
+       
+                                                                                                       new_kid_button.disabled = true;
+                                                                                                       save_ou_button.disabled = true;
+                                                                                                       delete_ou_button.disabled = true;
+                       
+                                                                                                       var main_settings_fields = [ 'name', 'shortname', 'email', 'phone', 'ou_type', 'parent_ou' ];
+                                                                                                       for ( var i in main_settings_fields ) {
+                                                                                                               var field = main_settings_fields[i];
+                                                                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                                                                       }
+                       
+                                                                                                       highlighter.editor_pane.green.play();
+                                                                                                       status_update( old_name + ' deleted' );
+                                                                                               } else {
+                                                                                                       highlighter.editor_pane.red.play();
+                                                                                                       status_update( 'Problem deleting ' + old_name );
+                                                                                               }
+                                                                                       }
+                                                                               }).send();
+       
+                                                                       }
+       
+                                                               </script>
+                                                       </button>
+       
+                                               </div>
+       
+                                               <button jsId="new_kid_button" dojoType="dijit.form.Button" label="New Child">
+                                                       <script type="dojo/connect" event="startup">
+                                                               this.disabled = true;
+                                                       </script>
+                                                       <script type="dojo/connect" event="onClick">
+       
+                                                               var new_fm_obj = new aou().fromHash({
+                                                                       isnew                   : 1,
+                                                                       name                    : 'New Branch',
+                                                                       opac_visible    : 'f',
+                                                                       shortname               : ou_list_store.getValue( current_ou, 'shortname' ) + '-NEW' + virgin_ou_id--,
+                                                                       parent_ou               : ou_list_store.getValue( current_ou, 'id' ),
+                                                                       ou_type                 : ou_list_store.getValue( current_ou, 'ou_type' )
+                                                               });
+       
+                                                               var new_obj;
+       
+                                                               pCRUD.request({
+                                                                       method : 'open-ils.permacrud.create.aou',
+                                                                       timeout : 10,
+                                                                       params : [ ses, new_fm_obj ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Problem creating child Org Unit' );
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                       ou_list_store.newItem(
+                                                                                               res.content().toHash(),
+                                                                                               { parent : current_ou, attribute : 'children' }
+                                                                                       );
+                                                                               } else {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Problem creating child Org Unit' );
+                                                                               }
+                                                                       },
+                                                               }).send();
+       
+                                                               highlighter.editor_pane.green.play();
+                                                               highlighter.ou_tree.green.play();
+                                                               status_update( 'New child Organizational Unit created for ' + ou_list_store.getValue( current_ou, 'name' ) );
+       
+                                                       </script>
+                                               </button>
+       
+                                       </div>
+
+                                       <div id="hoo_pane" dojoType="dijit.layout.ContentPane" title="Hours of Operation">
+                                               <table class="tundra" style="margin:10px;">
+                                                       <tr><th/><th>Open time</th><th>Close time</th></tr>
+                                                       <tr><th>Monday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_0_open" onChange="current_ou_hoo.dow_0_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_0_close" onChange="current_ou_hoo.dow_0_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_0_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_0_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Tuesday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_1_open" onChange="current_ou_hoo.dow_1_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_1_close" onChange="current_ou_hoo.dow_1_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_1_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_1_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Wednesday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_2_open" onChange="current_ou_hoo.dow_2_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_2_close" onChange="current_ou_hoo.dow_2_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_2_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_2_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Thursday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_3_open" onChange="current_ou_hoo.dow_3_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_3_close" onChange="current_ou_hoo.dow_3_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_3_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_3_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Friday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_4_open" onChange="current_ou_hoo.dow_4_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_4_close" onChange="current_ou_hoo.dow_4_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_4_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_4_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Saturday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_5_open" onChange="current_ou_hoo.dow_5_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_5_close" onChange="current_ou_hoo.dow_5_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_5_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_5_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                                       <tr><th>Sunday</th>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_6_open" onChange="current_ou_hoo.dow_6_open( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.TimeTextBox" style="width:8em;" jsId="dow_6_close" onChange="current_ou_hoo.dow_6_close( this.getDisplayedValue() );"/></td>
+                                                               <td><span dojoType="dijit.form.Button" label="Closed" onClick="dow_6_open.setValue( new Date('Tue Mar 25 2008 00:00:00') ); dow_6_close.setValue( new Date('Tue Mar 25 2008 00:00:00') );"/></td>
+                                                       </tr>
+                                               </table>
+       
+                                               <button jsId="save_hoo_button" dojoType="dijit.form.Button" label="Save">
+                                                       <script type="dojo/connect" event="onClick">
+       
+                                                               var method_name = 'open-ils.permacrud.update.aouhoo';
+                                                               if (current_ou_hoo.isnew() == 1) method_name = 'open-ils.permacrud.create.aouhoo';
+       
+                                                               pCRUD.request({
+                                                                       method : method_name,
+                                                                       params : [ ses, current_ou_hoo ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Problem saving Hours of Operation data for ' + ou_list_store.getValue( current_ou, 'name' ));
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                       current_ou_hoo.isnew(0);
+                                                                                       highlighter.editor_pane.green.play();
+                                                                                       status_update( 'Hours of Operation updated for ' + ou_list_store.getValue( current_ou, 'name' ) );
+                                                                               } else {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Problem saving Hours of Operation data for ' + ou_list_store.getValue( current_ou, 'name' ));
+                                                                               }
+                                                                       },
+                                                               }).send();
+       
+                                                       </script>
+                                               </button>
+       
+                                       </div>
+       
+                                       <div id="addresses_pane" dojoType="dijit.layout.ContentPane" title="Addresses">
+                                               
+                                               <div id="billing_address_pane" dojoType="dijit.layout.TabContainer" style="margin-top:10px">
+       
+                                                       <script type="dojo/method">
+                                                               window.current_billing_address = null;
+                                                               window.current_mailing_address = null;
+                                                               window.current_holds_address = null;
+                                                               window.current_ill_address = null;
+                                                       </script>
+       
+                                                       <div id="billing_address" dojoType="dijit.layout.ContentPane" title="Physical Address">
+                                                               <table class="tundra" style="margin:10px;">
+                                                                       <tr>
+                                                                               <th>Type</th>
+                                                                               <td colspan="3">
+                                                                                       <span jsId="billing_addr_type" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_billing_address.address_type( this.getValue() )"/>
+                                                                               </td>
+                                                                               <th>Valid</th><td>
+                                                                                       <input
+                                                                                         type="checkbox"
+                                                                                         jsId="billing_addr_valid"
+                                                                                         dojoType="dijit.form.CheckBox"
+                                                                                         value='t'
+                                                                                         onChange='if (current_billing_address) current_billing_address.valid( this.checked ? "t" : "f" );'
+                                                                                       />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 1</th><td colspan="5"><span jsId="billing_addr_street1" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_billing_address.street1( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 2</th><td colspan="5"><span jsId="billing_addr_street2" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_billing_address.street2( this.getValue() )"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>City</th><td><span jsId="billing_addr_city" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_billing_address.city( this.getValue() )" required="true"/></td>
+                                                                               <th>State</th><td><span jsId="billing_addr_state" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="2" maxSize="2" uppercase="true" onChange="current_billing_address.state( this.getValue() )" required="true"/></td>
+                                                                               <th>Zip</th><td><span jsId="billing_addr_post_code" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="10" maxSize="10" regExp="^\d{5}(?:-\d{4})?$" uppercase="true" onChange="current_billing_address.post_code( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Country</th><td colspan="2"><span jsId="billing_addr_country" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_billing_address.country( this.getValue() )" required="true"/></td>
+                                                                               <th>County</th><td colspan="2"><span jsId="billing_addr_county" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_billing_address.county( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                               </table>
+       
+                                                               <button jsId="save_billing_address" dojoType="dijit.form.Button" label="Save">
+                                                                       <script type="dojo/connect" event="startup">
+                                                                               this.disabled = true;
+                                                                       </script>
+                                                                       <script type="dojo/connect" event="onClick">
+       
+                                                                               var method_name = 'open-ils.permacrud.update.aoa';
+                                                                               if (current_billing_address.isnew() == 1) method_name = 'open-ils.permacrud.create.aoa';
+       
+                                                                               pCRUD.request({
+                                                                                       method : method_name,
+                                                                                       params : [ ses, current_billing_address ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.addresses_pane.red.play();
+                                                                                               status_update( 'Problem saving Physical Address data for ' + ou_list_store.getValue( current_ou, 'name' ) );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+                                                                                                       if (current_billing_address.isnew() == 1) {
+                                                                                                               current_billing_address = res.content();
+                                                                                                               ou_list_store.setValue( current_ou, 'billing_address', current_billing_address.id() );
+                                                                                                               save_org();
+                                                                                                       }
+                                                                                                       current_billing_address.isnew(0);
+                                                                                                       highlighter.addresses_pane.green.play();
+                                                                                                       status_update( 'Changes to the Physical Address of ' + ou_list_store.getValue( current_ou, 'name' ) + ' saved' );
+                                                                                               } else {
+                                                                                                       highlighter.addresses_pane.red.play();
+                                                                                                       status_update( 'Problem saving Physical Address data for ' + ou_list_store.getValue( current_ou, 'name' ) );
+                                                                                               }
+                                                                                       },
+                                                                               }).send();
+       
+                                                                       </script>
+                                                               </button>
+                                                       </div>
+
+                                                       <div id="holds_address" dojoType="dijit.layout.ContentPane" title="Holds Address">
+                                                               <table class="tundra" style="margin:10px;">
+                                                                       <tr>
+                                                                               <th>Type</th><td colspan="3"><span jsId="holds_addr_type" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_holds_address.address_type( this.getValue() )"/></td>
+                                                                               <th>Valid</th><td>
+                                                                                       <input
+                                                                                         type="checkbox"
+                                                                                         jsId="holds_addr_valid"
+                                                                                         dojoType="dijit.form.CheckBox"
+                                                                                         value='t'
+                                                                                         onChange='if (current_holds_address) current_holds_address.valid( this.checked ? "t" : "f" );'
+                                                                                       />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 1</th><td colspan="5"><span jsId="holds_addr_street1" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_holds_address.street1( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 2</th><td colspan="5"><span jsId="holds_addr_street2" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_holds_address.street2( this.getValue() )"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>City</th><td><span jsId="holds_addr_city" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_holds_address.city( this.getValue() )" required="true"/></td>
+                                                                               <th>State</th><td><span jsId="holds_addr_state" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="2" maxSize="2" uppercase="true" onChange="current_holds_address.state( this.getValue() )" required="true"/></td>
+                                                                               <th>Zip</th><td><span jsId="holds_addr_post_code" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="10" maxSize="10" regExp="^\d{5}(?:-\d{4})?$" uppercase="true" onChange="current_holds_address.post_code( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Country</th><td colspan="2"><span jsId="holds_addr_country" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_holds_address.country( this.getValue() )" required="true"/></td>
+                                                                               <th>County</th><td colspan="2"><span jsId="holds_addr_county" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_holds_address.county( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                               </table>
+       
+                                                               <button jsId="save_holds_address" dojoType="dijit.form.Button" label="Save">
+                                                                       <script type="dojo/connect" event="startup">
+                                                                               this.disabled = true;
+                                                                       </script>
+                                                                       <script type="dojo/connect" event="onClick">
+       
+                                                                               var method_name = 'open-ils.permacrud.update.aoa';
+                                                                               if (current_holds_address.isnew() == 1) method_name = 'open-ils.permacrud.create.aoa';
+       
+                                                                               pCRUD.request({
+                                                                                       method : method_name,
+                                                                                       params : [ ses, current_holds_address ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.addresses_pane.red.play();
+                                                                                               throw 'Problem saving Holds Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+                                                                                                       if (current_holds_address.isnew() == 1) {
+                                                                                                               current_holds_address = res.content();
+                                                                                                               ou_list_store.setValue( current_ou, 'holds_address', current_holds_address.id() );
+                                                                                                               save_org();
+                                                                                                       }
+                                                                                                       current_holds_address.isnew(0);
+                                                                                                       highlighter.addresses_pane.green.play();
+                                                                                                       status_update( 'Changes to the Holds Address of ' + ou_list_store.getValue( current_ou, 'name' ) + ' saved' );
+                                                                                               } else {
+                                                                                                       highlighter.addresses_pane.red.play();
+                                                                                                       throw 'Problem saving Holds Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                               }
+                                                                                       },
+                                                                               }).send();
+       
+                                                                       </script>
+                                                               </button>
+                                                       </div>
+
+                                                       <div id="mailing_address" dojoType="dijit.layout.ContentPane" title="Mailing Address">
+                                                               <table class="tundra" style="margin:10px;">
+                                                                       <tr>
+                                                                               <th>Type</th><td colspan="3"><span jsId="mailing_addr_type" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_mailing_address.address_type( this.getValue() )"/></td>
+                                                                               <th>Valid</th><td>
+                                                                                       <input
+                                                                                         type="checkbox"
+                                                                                         jsId="mailing_addr_valid"
+                                                                                         dojoType="dijit.form.CheckBox"
+                                                                                         onChange='if (current_mailing_address) current_mailing_address.valid( this.checked ? "t" : "f" );'
+                                                                                       />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 1</th><td colspan="5"><span jsId="mailing_addr_street1" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_mailing_address.street1( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 2</th><td colspan="5"><span jsId="mailing_addr_street2" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_mailing_address.street2( this.getValue() )"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>City</th><td><span jsId="mailing_addr_city" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_mailing_address.city( this.getValue() )" required="true"/></td>
+                                                                               <th>State</th><td><span jsId="mailing_addr_state" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="2" maxSize="2" uppercase="true" onChange="current_mailing_address.state( this.getValue() )" required="true"/></td>
+                                                                               <th>Zip</th><td><span jsId="mailing_addr_post_code" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="10" maxSize="10" regExp="^\d{5}(?:-\d{4})?$" uppercase="true" onChange="current_mailing_address.post_code( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Country</th><td colspan="2"><span jsId="mailing_addr_country" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_mailing_address.country( this.getValue() )" required="true"/></td>
+                                                                               <th>County</th><td colspan="2"><span jsId="mailing_addr_county" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_mailing_address.county( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                               </table>
+       
+                                                               <button jsId="save_mailing_address" dojoType="dijit.form.Button" label="Save">
+                                                                       <script type="dojo/connect" event="startup">
+                                                                               this.disabled = true;
+                                                                       </script>
+                                                                       <script type="dojo/connect" event="onClick">
+       
+                                                                               var method_name = 'open-ils.permacrud.update.aoa';
+                                                                               if (current_mailing_address.isnew() == 1) method_name = 'open-ils.permacrud.create.aoa';
+       
+                                                                               pCRUD.request({
+                                                                                       method : method_name,
+                                                                                       params : [ ses, current_mailing_address ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.addresses_pane.red.play();
+                                                                                               throw 'Problem saving Mailing Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+                                                                                                       if (current_mailing_address.isnew() == 1) {
+                                                                                                               current_mailing_address = res.content();
+                                                                                                               ou_list_store.setValue( current_ou, 'mailing_address', current_mailing_address.id() );
+                                                                                                               save_org();
+                                                                                                       }
+                                                                                                       current_mailing_address.isnew(0);
+                                                                                                       highlighter.addresses_pane.green.play();
+                                                                                                       status_update( 'Changes to the Mailing Address of ' + ou_list_store.getValue( current_ou, 'name' ) + ' saved' );
+                                                                                               } else {
+                                                                                                       highlighter.addresses_pane.red.play();
+                                                                                                       throw 'Problem saving Mailing Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                               }
+                                                                                       },
+                                                                               }).send();
+       
+                                                                       </script>
+                                                               </button>
+                                                       </div>
+
+                                                       <div id="ill_address" dojoType="dijit.layout.ContentPane" title="ILL Address">
+                                                               <table class="tundra" style="margin:10px;">
+                                                                       <tr>
+                                                                               <th>Type</th><td colspan="3"><span jsId="ill_addr_type" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_ill_address.address_type( this.getValue() )"/></td>
+                                                                               <th>Valid</th><td>
+                                                                                       <input
+                                                                                         type="checkbox"
+                                                                                         jsId="ill_addr_valid"
+                                                                                         dojoType="dijit.form.CheckBox"
+                                                                                         onChange='if (current_ill_address) current_ill_address.valid( this.checked ? "t" : "f" );'
+                                                                                       />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 1</th><td colspan="5"><span jsId="ill_addr_street1" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_ill_address.street1( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Street 2</th><td colspan="5"><span jsId="ill_addr_street2" style="width:100%;" dojoType="dijit.form.TextBox" onChange="current_ill_address.street2( this.getValue() )"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>City</th><td><span jsId="ill_addr_city" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_ill_address.city( this.getValue() )" required="true"/></td>
+                                                                               <th>State</th><td><span jsId="ill_addr_state" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="2" maxSize="2" uppercase="true" onChange="current_ill_address.state( this.getValue() )" required="true"/></td>
+                                                                               <th>Zip</th><td><span jsId="ill_addr_post_code" style="width:100%;" dojoType="dijit.form.ValidationTextBox" size="10" maxSize="10" regExp="^\d{5}(?:-\d{4})?$" uppercase="true" onChange="current_ill_address.post_code( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                                       <tr>
+                                                                               <th>Country</th><td colspan="2"><span jsId="ill_addr_country" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_ill_address.country( this.getValue() )" required="true"/></td>
+                                                                               <th>County</th><td colspan="2"><span jsId="ill_addr_county" style="width:100%;" dojoType="dijit.form.ValidationTextBox" onChange="current_ill_address.county( this.getValue() )" required="true"/></td>
+                                                                       </tr>
+                                                               </table>
+       
+                                                               <button jsId="save_ill_address" dojoType="dijit.form.Button" label="Save">
+                                                                       <script type="dojo/connect" event="startup">
+                                                                               this.disabled = true;
+                                                                       </script>
+                                                                       <script type="dojo/connect" event="onClick">
+       
+                                                                               var method_name = 'open-ils.permacrud.update.aoa';
+                                                                               if (current_ill_address.isnew() == 1) method_name = 'open-ils.permacrud.create.aoa';
+       
+                                                                               pCRUD.request({
+                                                                                       method : method_name,
+                                                                                       params : [ ses, current_ill_address ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.addresses_pane.red.play();
+                                                                                               throw 'Problem saving Physical Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+                                                                                                       if (current_ill_address.isnew() == 1) {
+                                                                                                               current_ill_address = res.content();
+                                                                                                               ou_list_store.setValue( current_ou, 'ill_address', current_ill_address.id() );
+                                                                                                               save_org();
+                                                                                                       }
+                                                                                                       current_ill_address.isnew(0);
+                                                                                                       highlighter.addresses_pane.green.play();
+                                                                                                       status_update( 'Changes to the ILL Address of ' + ou_list_store.getValue( current_ou, 'name' ) + ' saved' );
+                                                                                               } else {
+                                                                                                       highlighter.addresses_pane.red.play();
+                                                                                                       throw 'Problem saving Physical Address data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                               }
+                                                                                       },
+                                                                               }).send();
+       
+                                                                       </script>
+                                                               </button>
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+
+               <div id="status_bar"><span style="font-weight: bold; margin: 5px; margin-right: 10px;">Now editing:</span><span id="current_ou_name"></span></div>
+       </body>
+</html>
diff --git a/Open-ILS/web/conify/global/actor/org_unit.js b/Open-ILS/web/conify/global/actor/org_unit.js
new file mode 100644 (file)
index 0000000..ad00205
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+dojo.require('fieldmapper.dojoData');
+dojo.require('openils.I18N');
+dojo.require('dojo.parser');
+dojo.require('dojo.data.ItemFileWriteStore');
+dojo.require('dojo.date.stamp');
+dojo.require('dijit.form.TextBox');
+dojo.require('dijit.form.TimeTextBox');
+dojo.require('dijit.form.ValidationTextBox');
+dojo.require('dijit.form.CheckBox');
+dojo.require('dijit.form.FilteringSelect');
+dojo.require('dijit.Tree');
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.TabContainer');
+dojo.require('dijit.layout.LayoutContainer');
+dojo.require('dijit.layout.SplitContainer');
+dojo.require('dojox.widget.Toaster');
+dojo.require('dojox.fx');
+
+// some handy globals
+var cgi = new CGI();
+var cookieManager = new HTTP.Cookies();
+var ses = cookieManager.read('ses') || cgi.param('ses');
+var pCRUD = new OpenSRF.ClientSession('open-ils.permacrud');
+
+var current_ou, current_ou_hoo;
+var virgin_ou_id = -1;
+
+//var ou_type_store = new dojo.data.ItemFileWriteStore({ data : aout.toStoreData( globalOrgTypes ) });
+
+var highlighter = {};
+
+function status_update (markup) {
+       if (parent !== window && parent.status_update) parent.status_update( markup );
+}
+
+function save_org () {
+       var modified_ou = new aou().fromStoreItem( current_ou );
+       modified_ou.ischanged( 1 );
+
+       new_kid_button.disabled = false;
+       save_ou_button.disabled = false;
+       delete_ou_button.disabled = false;
+
+       pCRUD.request({
+               method : 'open-ils.permacrud.update.aou',
+               timeout : 10,
+               params : [ ses, modified_ou ],
+               onerror : function (r) {
+                       highlighter.editor_pane.red.play();
+                       status_update( 'Problem saving data for ' + ou_list_store.getValue( current_ou, 'name' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               ou_list_store.setValue( current_ou, 'ischanged', 0 );
+                               highlighter.editor_pane.green.play();
+                               status_update( 'Saved changes to ' + ou_list_store.getValue( current_ou, 'name' ) );
+                       } else {
+                               highlighter.editor_pane.red.play();
+                               status_update( 'Problem saving data for ' + ou_list_store.getValue( current_ou, 'name' ) );
+                       }
+               },
+       }).send();
+}
+       
+function hoo_load () {
+       // empty result not coming through ...
+       current_ou_hoo = new aouhoo().fromHash({id:ou_list_store.getValue( current_ou, 'id' )});
+       current_ou_hoo.isnew(1);
+
+       pCRUD.request({
+               method : 'open-ils.permacrud.retrieve.aouhoo',
+               params : [ ses, ou_list_store.getValue( current_ou, 'id' ) ],
+               onerror : function (r) { throw 'Problem fetching hours of operation for ' + ou_list_store.getValue( current_ou, 'name' );},
+               oncomplete : function (r) {
+                       current_ou_hoo = null;
+
+                       var res = r.recv();
+                       if (res) {
+                               if (res.content()) current_ou_hoo = res.content();
+                       }
+
+                       if (!current_ou_hoo) {
+                               current_ou_hoo = new aouhoo().fromHash({id:ou_list_store.getValue( current_ou, 'id' )});
+                               current_ou_hoo.isnew(1);
+                               for (var i = 0; i < 7; i++) {
+                                       current_ou_hoo['dow_' + i + '_open']('09:00:00');
+                                       current_ou_hoo['dow_' + i + '_close']('17:00:00');
+                               }
+                       }
+
+                       for (var i = 0; i < 7; i++) {
+                               window['dow_' + i + '_open'].setValue(
+                                       dojo.date.stamp.fromISOString( 'T' + current_ou_hoo['dow_' + i + '_open']() )
+                               );
+                               window['dow_' + i + '_close'].setValue(
+                                       dojo.date.stamp.fromISOString( 'T' + current_ou_hoo['dow_' + i + '_close']() )
+                               );
+                       }
+
+                       highlighter.hoo_pane.green.play();
+               }
+       }).send();
+
+}
+
+function addr_load () {
+       // empty result not coming through ...
+
+       save_ill_address.disabled = false;
+       save_holds_address.disabled = false;
+       save_mailing_address.disabled = false;
+       save_billing_address.disabled = false;
+
+       if (ou_list_store.getValue( current_ou, 'billing_address' )) {
+               pCRUD.request({
+                       method : 'open-ils.permacrud.retrieve.aoa',
+                       params : [ ses, ou_list_store.getValue( current_ou, 'billing_address' ) ],
+                       onerror : function (r) { throw 'Problem fetching Physical Address for ' + ou_list_store.getValue( current_ou, 'name' );},
+                       oncomplete : function (r) {
+                               current_billing_address = null;
+
+                               var res = r.recv();
+                               if (res) {
+                                       if (res.content()) current_billing_address = res.content();
+                               }
+
+                               if (!current_billing_address) {
+                                       current_billing_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+                                       current_billing_address.isnew(1);
+                               }
+
+                               set_addr_inputs('billing');
+                               highlighter.addresses_pane.green.play();
+                       }
+               }).send();
+       } else {
+               current_billing_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+               current_billing_address.isnew(1);
+               set_addr_inputs('billing');
+       }
+
+       if (ou_list_store.getValue( current_ou, 'mailing_address' )) {
+               pCRUD.request({
+                       method : 'open-ils.permacrud.retrieve.aoa',
+                       params : [ ses, ou_list_store.getValue( current_ou, 'mailing_address' ) ],
+                       onerror : function (r) { throw 'Problem fetching Physical Address for ' + ou_list_store.getValue( current_ou, 'name' );},
+                       oncomplete : function (r) {
+                               current_mailing_address = null;
+
+                               var res = r.recv();
+                               if (res) {
+                                       if (res.content()) current_mailing_address = res.content();
+                               }
+
+                               if (!current_mailing_address) {
+                                       current_mailing_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+                                       current_mailing_address.isnew(1);
+                               }
+
+                               set_addr_inputs('mailing');
+                               highlighter.addresses_pane.green.play();
+                       }
+               }).send();
+       } else {
+               current_mailing_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+               current_mailing_address.isnew(1);
+               set_addr_inputs('mailing');
+       }
+
+       if (ou_list_store.getValue( current_ou, 'holds_address' )) {
+               pCRUD.request({
+                       method : 'open-ils.permacrud.retrieve.aoa',
+                       params : [ ses, ou_list_store.getValue( current_ou, 'holds_address' ) ],
+                       onerror : function (r) { throw 'Problem fetching Physical Address for ' + ou_list_store.getValue( current_ou, 'name' );},
+                       oncomplete : function (r) {
+                               current_holds_address = null;
+
+                               var res = r.recv();
+                               if (res) {
+                                       if (res.content()) current_holds_address = res.content();
+                               }
+
+                               if (!current_holds_address) {
+                                       current_holds_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+                                       current_holds_address.isnew(1);
+                               }
+
+                               set_addr_inputs('holds');
+                               highlighter.addresses_pane.green.play();
+                       }
+               }).send();
+       } else {
+               current_holds_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+               current_holds_address.isnew(1);
+               set_addr_inputs('holds');
+       }
+
+       if (ou_list_store.getValue( current_ou, 'ill_address' )) {
+               pCRUD.request({
+                       method : 'open-ils.permacrud.retrieve.aoa',
+                       params : [ ses, ou_list_store.getValue( current_ou, 'ill_address' ) ],
+                       onerror : function (r) { throw 'Problem fetching Physical Address for ' + ou_list_store.getValue( current_ou, 'name' );},
+                       oncomplete : function (r) {
+                               current_ill_address = null;
+
+                               var res = r.recv();
+                               if (res) {
+                                       if (res.content()) current_ill_address = res.content();
+                               }
+
+                               if (!current_ill_address) {
+                                       current_ill_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+                                       current_ill_address.isnew(1);
+                               }
+
+                               set_addr_inputs('ill');
+                               highlighter.addresses_pane.green.play();
+                       }
+               }).send();
+       } else {
+               current_ill_address = new aoa().fromHash({org_unit:ou_list_store.getValue( current_ou, 'id' )});
+               current_ill_address.isnew(1);
+               set_addr_inputs('ill');
+       }
+
+}
+
+function set_addr_inputs (type) {
+       window[type + '_addr_valid'].setChecked( window['current_' + type + '_address'].valid() == 't' ? true : false );
+       window[type + '_addr_type'].setValue( window['current_' + type + '_address'].address_type() || '' );
+       window[type + '_addr_street1'].setValue( window['current_' + type + '_address'].street1() || '' );
+       window[type + '_addr_street2'].setValue( window['current_' + type + '_address'].street2() || '' );
+       window[type + '_addr_city'].setValue( window['current_' + type + '_address'].city() || '' );
+       window[type + '_addr_county'].setValue( window['current_' + type + '_address'].county() || '' );
+       window[type + '_addr_country'].setValue( window['current_' + type + '_address'].country() || '' );
+       window[type + '_addr_state'].setValue( window['current_' + type + '_address'].state() || '' );
+       window[type + '_addr_post_code'].setValue( window['current_' + type + '_address'].post_code() || '' );
+}
+
diff --git a/Open-ILS/web/conify/global/actor/org_unit_type.html b/Open-ILS/web/conify/global/actor/org_unit_type.html
new file mode 100644 (file)
index 0000000..b9b111d
--- /dev/null
@@ -0,0 +1,413 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title>Confiy :: Global :: Actor :: Org Unit Types</title>
+
+               <style type="text/css">
+                       @import url("/js/dojo/dojo/resources/dojo.css");
+                       @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+                       @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+               </style>
+
+               <style>
+                       html, body
+                       {
+                               height: 100%;
+                               width: 100%;
+                               margin: 0px 0px 0px 0px;
+                               padding: 0px 0px 0px 0px;
+                               overflow: hidden;
+                       }
+
+                       th
+                       {
+                               text-align: right;
+                               font-weight: bold;
+                               padding-left: 20px;
+                               padding-right: 5px;
+                       }
+               </style>
+
+               <!-- The OpenSRF API writ JS -->
+               <script language='javascript' src='/opac/common/js/utils.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/Cookies.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/CGI.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/JSON_v1.js' type='text/javascript'></script>
+
+               <!-- Dojo goodness -->
+               <script type="text/javascript" src="../admin.js"></script>
+               <script type="text/javascript" src="/js/dojo/dojo/dojo.js"</script>
+               <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+               <script type="text/javascript" src="org_unit_type.js"></script>
+
+       </head>
+
+       <body class="tundra" id='pagebody'>
+
+               <div dojoType="dijit.layout.SplitContainer" orientation="horizontal" style="height: 100%">
+
+                       <div dojoType="dijit.layout.ContentPane" sizeShare="100">
+                               <script type="dojo/method">
+                                       window.dirtyStore = [];
+
+                    pCRUD.request({
+                        method : 'open-ils.permacrud.search.aout.atomic',
+                        timeout : 10,
+                        params : [ ses, { id : { "!=" : null } }, { order_by : { aout : 'name' } } ],
+                        onerror : function (r) { status_update('Problem fetching types') },
+                        oncomplete : function (r) {
+                            ou_type_store = new dojo.data.ItemFileWriteStore({ data : aout.toStoreData( r.recv().content() ) });
+                            ou_type_store.onSet = function (item, attr, o, n) {
+                                if (attr == 'ischanged') return;
+                                if (n == o) return;
+                                this.setValue( item, 'ischanged', 1);
+                            };
+                            dojo.addOnUnload( function (event) {
+
+                                ou_type_store.fetch({
+                                    query : { ischanged : 1 },
+                                    queryOptions : { deep : true },
+                                    onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+                                    scope : ou_type_store
+                                });
+
+                                if (dirtyStore.length > 0) {
+                                    var confirmation = confirm(
+                                        'There are unsaved modified Organization Types!  '+
+                                        'OK to save these changes, Cancel to abandon them.'
+                                    );
+
+                                    if (confirmation) {
+                                        for (var i in window.dirtyStore) {
+                                            window.current_type = window.dirtyStore[i];
+                                            save_type(true);
+                                        }
+                                    }
+                                }
+
+                            });
+                        }
+                    }).send();
+
+                               </script>
+                               <div
+                                 id="type_tree"
+                                 label="Organization Types"
+                                 query="{'_top':'true'}"
+                                 dojoType="dijit.Tree"
+                                 store="ou_type_store"
+                                 minSize="200"
+                                 jsId="type_tree"
+                               >
+
+                                       <script type="dojo/method" event="onClick" args="item,node">
+
+                                               right_pane_toggler.show();
+                                               current_type = item;
+                                               current_fm_type = new aout().fromStoreItem(item);
+
+                                               highlighter.editor_pane.green.play();
+                                               status_update( 'Now editing ' + this.store.getValue( item, 'name' ) );
+
+                                               new_kid_button.disabled = false;
+                                               save_out_button.disabled = false;
+                                               delete_out_button.disabled = false;
+
+                                               var main_settings_fields = [ 'name', 'opac_label'];
+                                               for ( var i in main_settings_fields ) {
+                                                       var field = main_settings_fields[i];
+                                                       var value = this.store.getValue( current_type, field );
+
+                                                       if (!value) {
+                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                       } else window["editor_pane_" + field].setValue( value );
+                                               }
+
+                                               if ( this.store.getValue( current_type, '_trueRoot' ) == 'true' ) {
+                                                       editor_pane_parent.disabled = true;
+                                                       editor_pane_parent.setValue(null);
+                                                       editor_pane_parent.setDisplayedValue('');
+                                                       editor_pane_parent.validate(false);
+                                               } else {
+                                                       editor_pane_parent.disabled = false;
+                                                       editor_pane_parent.validate(true);
+                                                       editor_pane_parent.setValue( this.store.getValue( current_type, 'parent' ) );
+                                               }
+
+                                               editor_pane_can_have_vols.setChecked( this.store.getValue( current_type, 'can_have_vols' ) == 't' ? true : false );
+                                               editor_pane_can_have_users.setChecked( this.store.getValue( current_type, 'can_have_users' ) == 't' ? true : false );
+
+                                       </script>
+
+                                       <script type="dojo/method" event="getLabel" args="item,pI">
+                                               var label = this.store.getValue(item,'name');
+                                               if (this.store.getValue(item,'ischanged') == 1) label = '* ' + label;
+                                               return label;
+                                       </script>
+
+                               </div>
+                       </div>
+
+                       <div id="right_pane" dojoType="dijit.layout.ContentPane"  sizeShare="200">
+                               <script type="dojo/method">
+                                       window.right_pane_toggler = new dojo.fx.Toggler({ node: 'right_pane'});
+                                       window.right_pane_toggler.hide();
+                               </script>
+
+                                       <div id="editor_pane" dojoType="dijit.layout.ContentPane">
+                                               <script type="dojo/method">
+                                                       highlighter.type_tree = {};
+                                                       highlighter.editor_pane = {};
+                                                       highlighter.type_tree.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'type_tree', duration : 500 } );
+                                                       highlighter.type_tree.red = dojox.fx.highlight( { color : '#FF2018', node : 'type_tree', duration : 500 } );
+                                                       highlighter.editor_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'editor_pane', duration : 500 } );
+                                                       highlighter.editor_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'editor_pane', duration : 500 } );
+                                               </script>
+       
+                                               <table class="tundra" style="margin:10px;">
+                                                       <tr>
+                                                               <th>Type Name</th>
+                                                               <td>
+                                                                       <span id="editor_pane_name" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_name" regExp=".+" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_type) {
+                                                                                               ou_type_store.setValue( current_type, "name", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </span>
+                                                                       <span dojoType="openils.I18N.translationWidget" targetObject="current_fm_type" field="name"></span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>OPAC Label</th>
+                                                               <td>
+                                                                       <span id="editor_pane_opac_label" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_opac_label" regExp=".+" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_type) {
+                                                                                               ou_type_store.setValue( current_type, "opac_label", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </span>
+                                                                       <span dojoType="openils.I18N.translationWidget" targetObject="current_fm_type" field="opac_label"></span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Parent Type</th>
+                                                               <td>
+                                                                       <div
+                                                                         id="editor_pane_parent"
+                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                         jsId="editor_pane_parent"
+                                                                         store="ou_type_store"
+                                                                         searchAttr="name"
+                                                                         ignoreCase="true"
+                                                                         required="true"
+                                                                       >
+                                                                               <script type="dojo/method" event="onChange" args=>
+                                                                                       if (current_type && this.getValue()) {
+                                                                                               if ( this.store.getValue( current_type, 'parent' ) == this.getValue() ) return;
+
+                                                                                               this.store.setValue( current_type, "parent", this.getValue() );
+                                                                                               this.store.fetch({
+                                                                                                       query : { "parent" : this.getValue() },
+                                                                                                       onItem: function (parent_item) {
+                                                                                                               this.setValue( current_type, 'depth', 1 + parseInt(this.getValue( parent_item, 'depth' ) ));
+                                                                                                       },
+                                                                                                       scope : ou_type_store
+                                                                                               });
+                                                                                       }
+                                                                               </script>
+                                                                       </div>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Can have Volumes/Copies</th>
+                                                               <td>
+                                                                       <input
+                                                                         id="editor_pane_can_have_vols"
+                                                                         jsId="editor_pane_can_have_vols"
+                                                                         type="checkbox"
+                                                                         dojoType="dijit.form.CheckBox"
+                                                                         onChange='if (current_type) ou_type_store.setValue( current_type, "can_have_vols", this.checked ? "t" : "f" );'
+                                                                       />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Can have Users</th>
+                                                               <td>
+                                                                       <input
+                                                                         id="editor_pane_can_have_users"
+                                                                         jsId="editor_pane_can_have_users"
+                                                                         type="checkbox"
+                                                                         dojoType="dijit.form.CheckBox"
+                                                                         onChange='if (current_type) ou_type_store.setValue( current_type, "can_have_users", this.checked ? "t" : "f" );'
+                                                                       />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+       
+                                               <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 20px;">
+       
+                                                       <button jsId="save_out_button" dojoType="dijit.form.Button" label="Save" onClick="save_type()">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                       </button>
+       
+                                                       <button jsId="delete_out_button" dojoType="dijit.form.Button" label="Delete">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                               <script type="dojo/connect" event="onClick">
+       
+                                                                       if (ou_type_store.getValue( current_type, '_trueRoot' ) == 'true') {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Cannot delete' + ou_type_store.getValue( current_type, 'name' ) + ', you need at least one.' );
+                                                                               return false;
+                                                                       }
+
+                                                                       if ( current_type.children ) {
+                                                                               var kids = current_type.children;
+                                                                               if (!dojo.isArray(kids)) kids = [kids];
+       
+                                                                               var existing_kids = dojo.filter(
+                                                                                       kids,
+                                                                                       function(kid){ return kid.isdeleted[0] != 1 }
+                                                                               );
+                                                                               if ( existing_kids.length > 0) {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Cannot delete' + ou_type_store.getValue( current_type, 'name' ) + ', ' + existing_kids.length + ' subordinates still exist.' );
+                                                                                       return;
+                                                                               }
+                                                                       }
+       
+                                                                       if ( confirm('Are you sure you want to delete ' + current_type.name + '?')) {
+                                                                               ou_type_store.setValue( current_type, 'isdeleted', 1 );
+       
+                                                                               var modified_aout = new aout().fromStoreItem( current_type );
+                                                                               modified_aout.isdeleted( 1 );
+       
+                                                                               pCRUD.request({
+                                                                                       method : 'open-ils.permacrud.delete.aout',
+                                                                                       timeout : 10,
+                                                                                       params : [ ses, modified_aout ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.editor_pane.red.play();
+                                                                                               status_update( 'Problem deleting ' + ou_type_store.getValue( current_type, 'name' ) );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+       
+                                                                                                       var old_name = ou_type_store.getValue( current_type, 'name' );
+
+                                                                                                       ou_type_store.fetch({
+                                                                                                               query : { id : ou_type_store.getValue( current_type, 'id' ) },
+                                                                                                               queryOptions : { deep : true },
+                                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                                               scope : ou_type_store
+                                                                                                       });
+       
+                                                                                                       current_type = null;
+       
+                                                                                                       new_kid_button.disabled = true;
+                                                                                                       save_out_button.disabled = true;
+                                                                                                       delete_out_button.disabled = true;
+                       
+                                                                                                       var main_settings_fields = [ 'name', 'opac_label' ];
+                                                                                                       for ( var i in main_settings_fields ) {
+                                                                                                               var field = main_settings_fields[i];
+                                                                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                                                                       }
+
+                                                                                                       window["editor_pane_can_have_vols"].setChecked( false ); // unset the value
+                                                                                                       window["editor_pane_can_have_users"].setChecked( false ); // unset the value
+                       
+                                                                                                       highlighter.editor_pane.green.play();
+                                                                                                       status_update( old_name + ' deleted' );
+                                                                                               } else {
+                                                                                                       highlighter.editor_pane.red.play();
+                                                                                                       status_update( 'Problem deleting ' + old_name );
+                                                                                               }
+                                                                                       }
+                                                                               }).send();
+       
+                                                                       }
+       
+                                                               </script>
+                                                       </button>
+       
+                                               </div>
+       
+                                               <button jsId="new_kid_button" dojoType="dijit.form.Button" label="New Child">
+                                                       <script type="dojo/connect" event="startup">
+                                                               this.disabled = true;
+                                                       </script>
+                                                       <script type="dojo/connect" event="onClick">
+       
+                                                               var new_fm_obj = new aout().fromHash({
+                                                                       isnew                   : 1,
+                                                                       name                    : 'New Type',
+                                                                       can_have_vols   : 'f',
+                                                                       can_have_users  : 'f',
+                                                                       depth                   : 1 + parseInt(ou_type_store.getValue( current_type, 'depth' )),
+                                                                       opac_label              : ou_type_store.getValue( current_type, 'opac_label' ) + ' child' + virgin_out_id--,
+                                                                       parent                  : ou_type_store.getValue( current_type, 'id' )
+                                                               });
+       
+                                                               var err = false;
+                                                               pCRUD.request({
+                                                                       method : 'open-ils.permacrud.create.aout',
+                                                                       timeout : 10,
+                                                                       params : [ ses, new_fm_obj ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Problem calling method to create child Org Type' );
+                                                                               err = true;
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                       ou_type_store.newItem(
+                                                                                               res.content().toHash(),
+                                                                                               { parent : current_type, attribute : 'children' }
+                                                                                       );
+                                                                               } else {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Problem creating child Org Type' );
+                                                                                       err = true;
+                                                                               }
+                                                                       },
+                                                               }).send();
+       
+                                                               if (!err) {
+                                                                       highlighter.editor_pane.green.play();
+                                                                       highlighter.type_tree.green.play();
+                                                                       status_update( 'New child Organization Type created for ' + ou_type_store.getValue( current_type, 'name' ) );
+                                                               }
+       
+                                                       </script>
+                                               </button>
+       
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/Open-ILS/web/conify/global/actor/org_unit_type.js b/Open-ILS/web/conify/global/actor/org_unit_type.js
new file mode 100644 (file)
index 0000000..dcb7d7d
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+dojo.require('fieldmapper.dojoData');
+dojo.require('openils.I18N');
+dojo.require('dojo.parser');
+dojo.require('dojo.data.ItemFileWriteStore');
+dojo.require('dojo.date.stamp');
+dojo.require('dijit.form.NumberSpinner');
+dojo.require('dijit.form.TextBox');
+dojo.require('dijit.form.TimeTextBox');
+dojo.require('dijit.form.ValidationTextBox');
+dojo.require('dijit.form.CheckBox');
+dojo.require('dijit.form.FilteringSelect');
+dojo.require('dijit.Tree');
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.TabContainer');
+dojo.require('dijit.layout.LayoutContainer');
+dojo.require('dijit.layout.SplitContainer');
+dojo.require('dojox.widget.Toaster');
+dojo.require('dojox.fx');
+
+// some handy globals
+var cgi = new CGI();
+var cookieManager = new HTTP.Cookies();
+var ses = cookieManager.read('ses') || cgi.param('ses');
+var pCRUD = new OpenSRF.ClientSession('open-ils.permacrud');
+
+var current_type;
+var current_fm_type;
+var virgin_out_id = -1;
+
+var highlighter = {};
+
+function status_update (markup) {
+       if (parent !== window && parent.status_update) parent.status_update( markup );
+}
+
+function save_type () {
+
+       var modified_aout = new aout().fromStoreItem( current_type );
+       modified_aout.ischanged( 1 );
+
+       new_kid_button.disabled = false;
+       save_out_button.disabled = false;
+       delete_out_button.disabled = false;
+
+       pCRUD.request({
+               method : 'open-ils.permacrud.update.aout',
+               timeout : 10,
+               params : [ ses, modified_aout ],
+               onerror : function (r) {
+                       highlighter.editor_pane.red.play();
+                       status_update( 'Problem saving data for ' + ou_type_store.getValue( current_type, 'name' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               ou_type_store.setValue( current_type, 'ischanged', 0 );
+                               highlighter.editor_pane.green.play();
+                               status_update( 'Saved changes to ' + ou_type_store.getValue( current_type, 'name' ) );
+                       } else {
+                               highlighter.editor_pane.red.play();
+                               status_update( 'Problem saving data for ' + ou_type_store.getValue( current_type, 'name' ) );
+                       }
+               },
+       }).send();
+}
+
diff --git a/Open-ILS/web/conify/global/admin.html b/Open-ILS/web/conify/global/admin.html
new file mode 100644 (file)
index 0000000..8a4ff3f
--- /dev/null
@@ -0,0 +1,77 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title>Conify :: Global :: Admin</title>
+
+        <style type="text/css">
+            @import url("/js/dojo/dojo/resources/dojo.css");
+            @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+            @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+        </style>
+
+        <style>
+            html, body
+            {
+                height: 100%;
+                width: 100%;
+                margin: 0px 0px 0px 0px;
+                padding: 0px 0px 0px 0px;
+                overflow: hidden;
+            }
+        </style>
+
+        <!-- Dojo goodness -->
+        <script type="text/javascript" src="/js/dojo/dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+        <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+        <script type="text/javascript">
+            dojo.require('dojo.parser');
+            dojo.require('dijit.form.Button');
+            dojo.require('dijit.layout.ContentPane');
+            dojo.require('dijit.layout.LayoutContainer');
+
+            function status_update (markup) {
+                dojo.byId('status_text').innerHTML = markup;
+            }
+
+        </script>
+
+       </head>
+       <body class="tundra" id='pagebody'>
+               <div dojoType="dijit.layout.LayoutContainer" style="height: 100%; width: 100%; margin: 0; padding: 0; border: 0;">
+                       <div id="top_pane" jsId="top_pane" dojoType="dijit.layout.ContentPane" layoutAlign="top" orientation="horizontal" style="margin: 4px; width: 100%; text-align: middle;" title="Controls">
+                               <img src="/opac/images/small_logo.jpg"/>
+                               <span style="font-size: large; padding-left: 20px;"> Configure your ILS </span>
+                       </div>
+                       <div id="left_pane" jsId="left_pane" dojoType="dijit.layout.ContentPane" layoutAlign="left" orientation="vertical" style="height: 90%; margin: 4px;" label="Controls">
+                               <ul style="margin-left: -10px;">
+                                       <li><a href="" onclick="dojo.byId('action_iframe').src = 'actor/org_unit_type.html'; return false;">Organization Types</a></li>
+                                       <li><a href="" onclick="dojo.byId('action_iframe').src = 'actor/org_unit.html'; return false;">Organizational Units</a></li>
+                                       <li><a href="" onclick="dojo.byId('action_iframe').src = 'permission/grp_tree.html'; return false;">Permission Groups</a></li>
+                                       <li><a href="" onclick="dojo.byId('action_iframe').src = 'permission/perm_list.html'; return false;">Permissions</a></li>
+                                       <li><a href="" onclick="dojo.byId('action_iframe').src = 'config/copy_status.html'; return false;">Copy Statuses</a></li>
+                               </ul>
+                       </div>
+                       <div id="content_pane" jsId="content_pane" dojoType="dijit.layout.ContentPane" layoutAlign="client" style="margin: 2px; border-top: 2px solid grey; border-bottom: 2px solid grey; border-left: 2px solid grey;">
+                               <iframe id="action_iframe" marginwidth="0" marginheight="0" style="border:0; height: 100%; width: 100%;"></iframe>
+                       </div>
+                       <div id="bottom_pane" jsId="bottom_pane" dojoType="dijit.layout.ContentPane" layoutAlign="bottom" orientation="horizontal" style="margin: 4px; height: 5%; width: 100%" title="Controls">
+                               <span id="status_text"/>
+                       </div>
+               </div>
+       </body>
+</html>
+
diff --git a/Open-ILS/web/conify/global/admin.js b/Open-ILS/web/conify/global/admin.js
new file mode 100644 (file)
index 0000000..e3b4ae2
--- /dev/null
@@ -0,0 +1,6 @@
+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"-->';
+
diff --git a/Open-ILS/web/conify/global/config/copy_status.html b/Open-ILS/web/conify/global/config/copy_status.html
new file mode 100644 (file)
index 0000000..3efa3c2
--- /dev/null
@@ -0,0 +1,295 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title>Confiy :: Global :: Config :: Copy Status</title>
+
+               <style type="text/css">
+                       @import url("/js/dojo/dojox/grid/_grid/tundraGrid.css");
+                       @import url("/js/dojo/dojo/resources/dojo.css");
+                       @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+                       @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+               </style>
+
+               <style>
+                       html, body {
+                               height: 100%;
+                               width: 100%;
+                               margin: 0px 0px 0px 0px;
+                               padding: 0px 0px 0px 0px;
+                               overflow: hidden;
+                       }
+
+                       #status_grid {
+                               border: 0px;
+                               width: 100%;
+                               height: 100%;
+                       }
+
+                       #grid_container {
+                               width: 100%;
+                               height: 100%;
+                       }
+               </style>
+
+               <!-- The OpenSRF API writ JS -->
+               <script language='javascript' src='/opac/common/js/utils.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/Cookies.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/CGI.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/JSON_v1.js' type='text/javascript'></script>
+
+               <!-- Dojo goodness -->
+               <script type="text/javascript" src="../admin.js"></script>
+               <script type="text/javascript" src="/js/dojo/dojo/dojo.js"></script>
+               <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+               <script type="text/javascript" src="copy_status.js"></script>
+
+       </head>
+
+       <body class="tundra" id='pagebody'>
+
+               <div dojoType="dijit.layout.LayoutContainer" id="grid_container" jsId="grid_container" orientation="vertical">
+                       <script type="dojo/method">
+                               window.highlighter= {};
+                               window.highlighter.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'grid_container', duration : 500 } );
+                               window.highlighter.red = dojox.fx.highlight( { color : '#FF2018', node : 'grid_container', duration : 500 } );
+
+                               window.dirtyStore = [];
+
+                pCRUD.request({
+                    method : 'open-ils.permacrud.search.ccs.atomic',
+                    timeout : 10,
+                    params : [ ses, { id : { "!=" : null } }, { order_by : { ccs : 'name' } } ],
+                    onerror : function (r) { status_update('Problem fetching statuses') },
+                    oncomplete : function (r) {
+
+                        window._status_list = r.recv().content();
+                        window._status_data = ccs.toStoreData( window._status_list, 'name' );
+                        window.status_store = new dojo.data.ItemFileWriteStore({ data : window._status_data });
+
+                           window.status_store.onSet = function (item, attr, o, n) {
+                            if (attr == 'ischanged') return;
+                            if (n == o) return;
+                            this.setValue( item, 'ischanged', 1);
+
+                            if (attr == 'holdable' && typeof n != 'string')
+                                this.setValue(item, 'holdable', n ? 't' : 'f');
+
+                        };
+
+                        dojo.addOnUnload( function (event) {
+
+                            status_store.fetch({
+                                query : { ischanged : 1 },
+                                onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+                                scope : status_store
+                            });
+
+                            if (dirtyStore.length > 0) {
+                                var confirmation = confirm(
+                                    'There are unsaved modified Statuses!  '+
+                                    'OK to save these changes, Cancel to abandon them.'
+                                );
+
+                                if (confirmation) {
+                                    for (var i in window.dirtyStore) {
+                                        window.current_status = window.dirtyStore[i];
+                                        save_status(true);
+                                    }
+                                }
+                            }
+
+                        });
+                    }
+                }).send();
+
+                       </script>
+
+                       <div dojoType="dijit.layout.LayoutContainer" orientation="horizontal" style="margin-top: 5px;" layoutAlign="top">
+                               <span>New Status:</span>
+                               <div dojoType="dijit.form.TextBox" id="new_status_code" jsId="new_status_name" label="New Status Name"></div>
+                               <button dojoType="dijit.form.Button" id="save_new_status_code" jsId="save_new_status_name" label="Add"> 
+                                       <script type="dojo/connect" event="onClick">
+
+                                               var new_name = new_status_name.getValue();
+                                               if (!new_name) return;
+
+                       var new_fm_obj = new ccs().fromHash({
+                               isnew           : 1,
+                           name            : new_name
+                           });
+    
+                       var err = false;
+                           pCRUD.request({
+                           method : 'open-ils.permacrud.create.ccs',
+                               timeout : 10,
+                           params : [ ses, new_fm_obj ],
+                               onerror : function (r) {
+                               highlighter.red.play();
+                                   status_update( 'Problem calling method to create new Status' );
+                               err = true;
+                               },
+                               oncomplete : function (r) {
+                               var res = r.recv();
+                                   if ( res && res.content() ) {
+                                   var new_item_hash = res.content().toHash();
+                                   status_store.newItem( new_item_hash );
+                                                                       status_update( 'New ' + new_item_hash.name + ' status created' );
+                                                                       status_grid.model.sort(-2);
+                                                                       highlighter.green.play();
+                               } else {
+                                       highlighter.red.play();
+                                   status_update( 'Problem creating new Status' );
+                                       err = true;
+                               }
+                               }
+                       }).send();
+    
+                       </script>
+                               </button>
+                       </div>
+
+                       <div dojoType="dijit.layout.ContentPane" style="width:100%; height:100%;" layoutAlign="client">
+                               <div dojoType="dojox.grid.data.DojoData" id="status_data_model"jsId="status_data_model" store="status_store" query="{ 'id' : '*' }"></div>
+                               <div id="status_grid" dojoType="dojox.Grid" jsId="status_grid">
+                                       <script type="dojo/connect" event="startup">
+                                               var g = this;
+                                               var status_grid_layout = [
+                                                       {       cells : [
+                                                                       [
+                                                                               { name : "ID",
+                                                                                 field : "id",
+                                                                               },
+                                                                               { name : "Name",
+                                                                                 field : "name",
+                                                                                 width : "auto",
+                                                                                 editor : dojox.grid.editors.Dijit
+                                                                               },
+                                                                               { name : "Translation",
+                                                                                 width : "10em",
+                                                                                 height : "2em",
+                                                                                 get : function (row) {
+                                                                                       if (!window.status_rows) window.status_rows = [];
+                                                                                       var r = window.status_data_model.getRow(row);
+                                                                                       if (r) {
+                                                                                               window.status_rows[row] = new ccs().fromHash(window.status_data_model.getRow(row));
+                                                                                               setTimeout(
+                                                                                                       'dojo.query(".status_grid_trans_cell_' + row + '").'+
+                                                                                                               'instantiate(openils.I18N.translationWidget,{field:"name",'+
+                                                                                                               'targetObject:"window.status_rows['+row+']",unique:"' + row + '"});'+
+                                                                                                               'status_grid.rowHeightChanged('+row+')',
+                                                                                                       0
+                                                                                               );
+                                                                                               var oldnode = dojo.byId('name_translation_' + row);
+                                                                                               if (oldnode) dijit.byNode(oldnode).destroyRecursive();
+                                                                                               return '<span class="status_grid_trans_cell_'+row+'"></span>';
+                                                                                       }
+                                                                                       return '';
+                                                                                 }
+                                                                               },
+                                                                               { name : "Holdable",
+                                                                                 field : "holdable",
+                                                                                 editor : dojox.grid.editors.bool,
+                                          get : function (row) {
+                                               var r = window.status_data_model.getRow(row);
+                                                                                       if (r) {
+                                                       var h = r.holdable;
+                                                           if (h == 't' || h === true) return true;
+                                                               return false;
+                                                                                       }
+                                          }
+                                                                               }
+                                                                       ]
+                                                               ]
+                                                       }
+                                               ];
+
+                                               this.setStructure(status_grid_layout);
+                                               this.setModel(window.status_data_model);
+                                       </script>
+                               </div>
+                       </div>
+
+                       <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 5px;" layoutAlign="bottom">
+               
+                               <button jsId="save_ccs_button" dojoType="dijit.form.Button" label="Save Changes" onClick="save_them_all()"></button>
+               
+                               <button jsId="delete_ccs_button" dojoType="dijit.form.Button" label="Delete Selected">
+                                       <script type="dojo/connect" event="onClick">
+
+                                               var selected_rows = status_grid.selection.getSelected();
+               
+                                               var selected_items = [];
+                                               for (var i in selected_rows) {
+                                                       selected_items.push(
+                                                               status_grid.model.getRow( selected_rows[i] ).__dojo_data_item
+                                                       );
+                                               }
+
+                                               status_grid.selection.clear();
+
+                                               for (var i in selected_items) {
+                                                       current_status = selected_items[i];
+
+                                                       if ( confirm('Are you sure you want to delete ' + status_store.getValue( current_status, 'name' ) + '?')) {
+
+                                                               status_store.setValue( current_status, 'isdeleted', 1 );
+                       
+                                                               var modified_ccs = new ccs().fromStoreItem( current_status );
+                                                               modified_ccs.isdeleted( 1 );
+                       
+                                                               pCRUD.request({
+                                                                       method : 'open-ils.permacrud.delete.ccs',
+                                                                       timeout : 10,
+                                                                       params : [ ses, modified_ccs ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.red.play();
+                                                                               status_update( 'Problem deleting ' + status_store.getValue( current_status, 'name' ) );
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                       
+                                                                                       var old_name = status_store.getValue( current_status, 'name' );
+               
+                                                                                       status_store.fetch({
+                                                                                               query : { id : status_store.getValue( current_status, 'id' ) },
+                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                               scope : status_store
+                                                                                       });
+                       
+                                                                                       current_status = null;
+                       
+                                                                                       highlighter.green.play();
+                                                                                       status_update( old_name + ' deleted' );
+                                                                               } else {
+                                                                                       highlighter.red.play();
+                                                                                       status_update( 'Problem deleting ' + old_name );
+                                                                               }
+                                                                       }
+                                                               }).send();
+               
+                                                       }
+                                               }
+       
+                                       </script>
+                               </button>
+       
+                       </div>
+               </div>
+       
+       </body>
+</html>
diff --git a/Open-ILS/web/conify/global/config/copy_status.js b/Open-ILS/web/conify/global/config/copy_status.js
new file mode 100644 (file)
index 0000000..bfa9174
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+dojo.require('fieldmapper.dojoData');
+dojo.require('openils.I18N');
+dojo.require('dojo.parser');
+dojo.require('dojo.string');
+dojo.require('dojo.data.ItemFileWriteStore');
+dojo.require('dijit.form.TextBox');
+dojo.require('dijit.form.ValidationTextBox');
+dojo.require('dijit.form.Textarea');
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.LayoutContainer');
+dojo.require('dijit.layout.BorderContainer');
+dojo.require('dojox.widget.Toaster');
+dojo.require('dojox.fx');
+dojo.require('dojox.grid.Grid');
+dojo.require('dojox.grid._data.model');
+dojo.require("dojox.grid.editors");
+
+// some handy globals
+var cgi = new CGI();
+var cookieManager = new HTTP.Cookies();
+var ses = cookieManager.read('ses') || cgi.param('ses');
+var pCRUD = new OpenSRF.ClientSession('open-ils.permacrud');
+
+var current_status;
+var virgin_out_id = -1;
+
+var highlighter = {};
+
+function status_update (markup) {
+       if (parent !== window && parent.status_update) parent.status_update( markup );
+}
+
+function save_status () {
+
+       var modified_ccs = new ccs().fromStoreItem( current_status );
+       modified_ccs.ischanged( 1 );
+
+       pCRUD.request({
+               method : 'open-ils.permacrud.update.ccs',
+               timeout : 10,
+               params : [ ses, modified_ccs ],
+               onerror : function (r) {
+                       highlighter.red.play();
+                       status_update( 'Problem saving ' + status_store.getValue( current_status, 'name' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               status_store.setValue( current_status, 'ischanged', 0 );
+                               highlighter.green.play();
+                               status_update( 'Saved changes to ' + status_store.getValue( current_status, 'name' ) );
+                       } else {
+                               highlighter.red.play();
+                               status_update( 'Problem saving ' + status_store.getValue( current_status, 'name' ) );
+                       }
+               },
+       }).send();
+}
+
+function save_them_all (event) {
+
+       status_store.fetch({
+               query : { ischanged : 1 },
+               onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+               scope : status_store
+       });
+
+       var confirmation = true;
+
+
+       if (event && dirtyStore.length > 0) {
+               confirmation = confirm(
+                       'There are unsaved modified Statuses!  '+
+                       'OK to save these changes, Cancel to abandon them.'
+               );
+       }
+
+       if (confirmation) {
+               for (var i in window.dirtyStore) {
+                       window.current_status = window.dirtyStore[i];
+                       save_status(true);
+               }
+
+               window.dirtyStore = [];
+       }
+}
+
+dojo.addOnUnload( save_them_all );
+
diff --git a/Open-ILS/web/conify/global/permission/grp_tree.html b/Open-ILS/web/conify/global/permission/grp_tree.html
new file mode 100644 (file)
index 0000000..31800c3
--- /dev/null
@@ -0,0 +1,742 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w2.org/1999/xhtml">
+       <head>
+               <title>Confiy :: Global :: Permission :: Group Tree</title>
+
+               <style type="text/css">
+                       @import url("/js/dojo/dojox/grid/_grid/tundraGrid.css");
+                       @import url("/js/dojo/dojo/resources/dojo.css");
+                       @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+                       @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+               </style>
+
+               <style>
+                       html, body
+                       {
+                               height: 100%;
+                               width: 100%;
+                               margin: 0px 0px 0px 0px;
+                               padding: 0px 0px 0px 0px;
+                               overflow: hidden;
+                       }
+
+                       th
+                       {
+                               text-align: right;
+                               font-weight: bold;
+                               padding-left: 20px;
+                               padding-right: 5px;
+                       }
+
+            #perm_grid {
+                border: 0px;
+                width: 100%;
+                height: 100%;
+            }
+
+            #grid_container {
+                width: 75%;
+                height: 100%;
+            }
+
+               </style>
+
+               <!-- The OpenSRF API writ JS -->
+               <script language='javascript' src='/opac/common/js/utils.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/Cookies.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/CGI.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/JSON_v1.js' type='text/javascript'></script>
+
+               <!-- Dojo goodness -->
+               <script type="text/javascript" src="../admin.js"></script>
+               <script type="text/javascript" src="/js/dojo/dojo/dojo.js"></script>
+               <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+               <script type="text/javascript" src="grp_tree.js"></script>
+
+       </head>
+
+       <body class="tundra" id='pagebody'>
+
+               <div dojoType="dijit.layout.SplitContainer" orientation="horizontal" style="height: 100%">
+
+                       <div dojoType="dijit.layout.ContentPane" sizeShare="100">
+                               <script type="dojo/method">
+                                       window.dirtyStore = [];
+
+                    server.pCRUD.request({
+                        method : 'open-ils.permacrud.search.pgt.atomic',
+                        timeout : 10,
+                        params : [ ses, { id : { "!=" : null } }, { order_by : { pgt : 'name' } } ],
+                        onerror : function (r) { status_update('Problem fetching groups') },
+                        oncomplete : function (r) {
+                            window._group_list = r.recv().content();
+                            window._group_data = pgt.toStoreData( window._group_list );
+                            window.group_store = new dojo.data.ItemFileWriteStore({ data : window._group_data });
+                            window.group_store.onSet = function (item, attr, o, n) {
+                                if (attr == 'ischanged') return;
+                                if (n == o) return;
+                                this.setValue( item, 'ischanged', 1);
+                            };
+                            dojo.addOnUnload( function (event) {
+
+                                window.group_store.fetch({
+                                    query : { ischanged : 1 },
+                                    queryOptions : { deep : true },
+                                    onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+                                    scope : window.group_store
+                                });
+
+                                if (dirtyStore.length > 0) {
+                                    var confirmation = confirm(
+                                        'There are unsaved modified Groups!  '+
+                                        'OK to save these changes, Cancel to abandon them.'
+                                    );
+
+                                    if (confirmation) {
+                                        for (var i in window.dirtyStore) {
+                                            window.current_group = window.dirtyStore[i];
+                                            save_group(true);
+                                        }
+                                    }
+                                }
+
+                            });
+                        }
+                    }).send();
+
+                    server.actor.request({
+                        method : 'open-ils.actor.org_types.retrieve',
+                        timeout : 10,
+                        onerror : function (r) { status_update('Problem fetching types') },
+                        oncomplete : function (r) {
+                            window._ou_type_list = r.recv().content();
+                            window._ou_type_data = aout.toStoreData( window._ou_type_list );
+                            window.ou_type_store = new dojo.data.ItemFileReadStore({ data : window._ou_type_data });
+                        }
+                    }).send();
+
+                    server.actor.request({
+                        method : 'open-ils.actor.permissions.retrieve',
+                        timeout : 10,
+                        onerror : function (r) { status_update('Problem fetching perms') },
+                        oncomplete : function (r) {
+    
+                            window._perm_list = r.recv().content();
+
+                            window._perm_data = ppl.toStoreData( window._perm_list, 'code' );
+                            window._perm_name_data = ppl.toStoreData( window._perm_list, 'code', { identifier : 'code' } );
+
+                            window.perm_store = new dojo.data.ItemFileWriteStore({ data : window._perm_data });
+                            window.perm_name_store = new dojo.data.ItemFileWriteStore({ data : window._perm_name_data });
+    
+   
+                        }
+                    }).send();
+
+                    server.pCRUD.request({
+                        method : 'open-ils.permacrud.search.pgpm.atomic',
+                        timeout : 10,
+                        params : [ ses, { id : { "!=" : null } } ],
+                        onerror : function (r) { status_update('Problem fetching perm maps') },
+                        oncomplete : function (r) {
+                            window._perm_map_list = r.recv().content();
+                            window._perm_map_data = pgpm.toStoreData( window._perm_map_list, 'id' );
+                            window.perm_map_store = new dojo.data.ItemFileWriteStore({ data : window._perm_map_data });
+
+                                                       window.perm_map_store.onSet = function (item, attr, o, n) {
+                                                               if (attr == 'ischanged') return;
+                                                               if (n == o) return;
+
+                                                               this.setValue( item, 'ischanged', 1);
+
+                                                               if (attr == 'grantable' && typeof n != 'string')
+                                                                       this.setValue(item, 'grantable', n ? 't' : 'f');
+                                                       }
+
+                            dojo.addOnUnload( function (event) { save_them_all(); });
+                        }
+                    }).send();
+
+                               </script>
+                               <div
+                                 id="group_tree"
+                                 label="Permission Groups"
+                                 query="{'_top':'true'}"
+                                 dojoType="dijit.Tree"
+                                 store="group_store"
+                                 minSize="200"
+                                 jsId="group_tree"
+                               >
+
+                                       <script type="dojo/method" event="onClick" args="item,node">
+
+                                               right_pane_toggler.show();
+
+                                               current_group = item;
+                                               window.current_fm_group = new pgt().fromStoreItem(item);
+
+                                               perm_map_model.query = { grp : current_group ? current_group.id[0] : -1 };
+                                               perm_map_model.refresh();
+                                               perm_grid.refresh();
+
+                                               highlighter.editor_pane.green.play();
+                                               status_update( 'Now editing ' + this.store.getValue( item, 'name' ) );
+
+                                               new_kid_button.disabled = false;
+                                               save_group_button.disabled = false;
+                                               delete_group_button.disabled = false;
+
+                                               var main_settings_fields = [ 'name', 'perm_interval', 'description'];
+                                               for ( var i in main_settings_fields ) {
+                                                       var field = main_settings_fields[i];
+                                                       var value = this.store.getValue( current_group, field );
+
+                                                       if (!value) {
+                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                               if (field != 'description') window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                       } else window["editor_pane_" + field].setValue( value );
+                                               }
+
+                                               if ( this.store.getValue( current_group, '_trueRoot' ) == 'true' ) {
+                                                       editor_pane_parent.disabled = true;
+                                                       editor_pane_parent.setValue(null);
+                                                       editor_pane_parent.setDisplayedValue('');
+                                                       editor_pane_parent.validate(false);
+                                               } else {
+                                                       editor_pane_parent.disabled = false;
+                                                       editor_pane_parent.validate(true);
+                                                       editor_pane_parent.setValue( this.store.getValue( current_group, 'parent' ) );
+                                               }
+
+                                               editor_pane_application_perm.setValue( this.store.getValue( current_group, 'application_perm' ) );
+
+                                               editor_pane_usergroup.setChecked( this.store.getValue( current_group, 'usergroup' ) == 't' ? true : false );
+
+                                       </script>
+
+                                       <script type="dojo/method" event="getLabel" args="item,pI">
+                                               var label = this.store.getValue(item,'name');
+                                               if (this.store.getValue(item,'ischanged') == 1) label = '* ' + label;
+                                               return label;
+                                       </script>
+
+                               </div>
+                       </div>
+
+                       <div id="right_pane" dojoType="dijit.layout.ContentPane"  sizeShare="300">
+                               <script type="dojo/method">
+                                       window.right_pane_toggler = new dojo.fx.Toggler({ node: 'right_pane'});
+                                       window.right_pane_toggler.hide();
+                               </script>
+
+                               <div dojoType="dijit.layout.TabContainer">
+                                       <div id="editor_pane" dojoType="dijit.layout.ContentPane" title="Group Configuration">
+                                               <script type="dojo/method">
+                                                       highlighter.group_tree = {};
+                                                       highlighter.editor_pane = {};
+                                                       highlighter.group_tree.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'group_tree', duration : 500 } );
+                                                       highlighter.group_tree.red = dojox.fx.highlight( { color : '#FF2018', node : 'group_tree', duration : 500 } );
+                                                       highlighter.editor_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'editor_pane', duration : 500 } );
+                                                       highlighter.editor_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'editor_pane', duration : 500 } );
+                                               </script>
+       
+                                               <table class="tundra" style="margin:10px;">
+                                                       <tr>
+                                                               <th>Group Name</th>
+                                                               <td>
+                                                                       <span id="editor_pane_name" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_name" regExp=".+" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_group) {
+                                                                                               group_store.setValue( current_group, "name", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </span>
+                                                                       <span dojoType="openils.I18N.translationWidget" targetObject="current_fm_group" field="name"></span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Description</th>
+                                                               <td>
+                                                                       <span>
+                                                                               <textarea
+                                                                                 id="editor_pane_description"
+                                                                                 dojoType="dijit.form.Textarea"
+                                                                                 jsId="editor_pane_description"
+                                                                                 onChange="if (current_group) group_store.setValue( current_group, "description", this.getValue() );"
+                                                                               ></textarea>
+                                                                       </span>
+                                                                       <span dojoType="openils.I18N.translationWidget" targetObject="current_fm_group" field="description"></span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Permission Interval</th>
+                                                               <td>
+                                                                       <span id="editor_pane_perm_interval" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_perm_interval" regExp="^\d+ (?:y.*|mo.*|d.*)$" required="true">
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_group) {
+                                                                                               group_store.setValue( current_group, "perm_interval", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </span>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Editing Permission</th>
+                                                               <td>
+                                                                       <div
+                                                                         id="editor_pane_application_perm"
+                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                         store="perm_name_store"
+                                                                         searchAttr="code"
+                                                                         jsId="editor_pane_application_perm"
+                                                                       >
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_group && this.getValue()) {
+                                                                                               group_store.setValue( current_group, "application_perm", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </div>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>Parent Group</th>
+                                                               <td>
+                                                                       <div
+                                                                         id="editor_pane_parent"
+                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                         jsId="editor_pane_parent"
+                                                                         store="group_store"
+                                                                         searchAttr="name"
+                                                                         ignoreCase="true"
+                                                                         required="true"
+                                                                       >
+                                                                               <script type="dojo/connect" event="onChange">
+                                                                                       if (current_group && this.getValue()) {
+                                                                                               this.store.setValue( current_group, "parent", this.getValue() );
+                                                                                       }
+                                                                               </script>
+                                                                       </div>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <th>User Group</th>
+                                                               <td>
+                                                                       <input
+                                                                         id="editor_pane_usergroup"
+                                                                         jsId="editor_pane_usergroup"
+                                                                         type="checkbox"
+                                                                         dojoType="dijit.form.CheckBox"
+                                                                         onChange='if (current_group) group_store.setValue( current_group, "usergroup", this.checked ? "t" : "f" );'
+                                                                       />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+       
+                                               <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 20px;">
+       
+                                                       <button jsId="save_group_button" dojoType="dijit.form.Button" label="Save" onClick="save_group()">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                       </button>
+       
+                                                       <button jsId="delete_group_button" dojoType="dijit.form.Button" label="Delete">
+                                                               <script type="dojo/connect" event="startup">
+                                                                       this.disabled = true;
+                                                               </script>
+                                                               <script type="dojo/connect" event="onClick">
+       
+                                                                       if (group_store.getValue( current_group, '_trueRoot' ) == 'true') {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Cannot delete' + group_store.getValue( current_group, 'name' ) + ', you need at least one.' );
+                                                                               return false;
+                                                                       }
+
+                                                                       if ( current_group.children ) {
+                                                                               var kids = current_group.children;
+                                                                               if (!dojo.isArray(kids)) kids = [kids];
+       
+                                                                               var existing_kids = dojo.filter(
+                                                                                       kids,
+                                                                                       function(kid){ return kid.isdeleted[0] != 1 }
+                                                                               );
+                                                                               if ( existing_kids.length > 0) {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Cannot delete' + group_store.getValue( current_group, 'name' ) + ', ' + existing_kids.length + ' subordinates still exist.' );
+                                                                                       return;
+                                                                               }
+                                                                       }
+       
+                                                                       if ( confirm('Are you sure you want to delete ' + current_group.name + '?')) {
+                                                                               group_store.setValue( current_group, 'isdeleted', 1 );
+       
+                                                                               var modified_pgt = new pgt().fromStoreItem( current_group );
+                                                                               modified_pgt.isdeleted( 1 );
+       
+                                                                               server.pCRUD.request({
+                                                                                       method : 'open-ils.permacrud.delete.pgt',
+                                                                                       timeout : 10,
+                                                                                       params : [ ses, modified_pgt ],
+                                                                                       onerror : function (r) {
+                                                                                               highlighter.editor_pane.red.play();
+                                                                                               status_update( 'Problem deleting ' + group_store.getValue( current_group, 'name' ) );
+                                                                                       },
+                                                                                       oncomplete : function (r) {
+                                                                                               var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+       
+                                                                                                       var old_name = group_store.getValue( current_group, 'name' );
+
+                                                                                                       group_store.fetch({
+                                                                                                               query : { id : group_store.getValue( current_group, 'id' ) },
+                                                                                                               queryOptions : { deep : true },
+                                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                                               scope : group_store
+                                                                                                       });
+       
+                                                                                                       current_group = null;
+       
+                                                                                                       new_kid_button.disabled = true;
+                                                                                                       save_group_button.disabled = true;
+                                                                                                       delete_group_button.disabled = true;
+                       
+                                                                                                       var main_settings_fields = [ 'name', 'perm_interval', 'description' ];
+                                                                                                       for ( var i in main_settings_fields ) {
+                                                                                                               var field = main_settings_fields[i];
+                                                                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                                                                       }
+
+                                                                                                       window["editor_pane_usergroup"].setChecked( false ); // unset the value
+                       
+                                                                                                       highlighter.editor_pane.green.play();
+                                                                                                       status_update( old_name + ' deleted' );
+                                                                                               } else {
+                                                                                                       highlighter.editor_pane.red.play();
+                                                                                                       status_update( 'Problem deleting ' + old_name );
+                                                                                               }
+                                                                                       }
+                                                                               }).send();
+       
+                                                                       }
+       
+                                                               </script>
+                                                       </button>
+       
+                                               </div>
+       
+                                               <button jsId="new_kid_button" dojoType="dijit.form.Button" label="New Child">
+                                                       <script type="dojo/connect" event="startup">
+                                                               this.disabled = true;
+                                                       </script>
+                                                       <script type="dojo/connect" event="onClick">
+       
+                                                               var new_fm_obj = new pgt().fromHash({
+                                                                       isnew                   : 1,
+                                                                       name                    : 'New Group',
+                                                                       usergroup               : 'f',
+                                                                       parent                  : group_store.getValue( current_group, 'id' )
+                                                               });
+       
+                                                               var err = false;
+                                                               server.pCRUD.request({
+                                                                       method : 'open-ils.permacrud.create.pgt',
+                                                                       timeout : 10,
+                                                                       params : [ ses, new_fm_obj ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               status_update( 'Problem calling method to create child Group' );
+                                                                               err = true;
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                       group_store.newItem(
+                                                                                               res.content().toHash(),
+                                                                                               { parent : current_group, attribute : 'children' }
+                                                                                       );
+                                                                               } else {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       status_update( 'Problem creating child Group' );
+                                                                                       err = true;
+                                                                               }
+                                                                       },
+                                                               }).send();
+       
+                                                               if (!err) {
+                                                                       highlighter.editor_pane.green.play();
+                                                                       highlighter.group_tree.green.play();
+                                                                       status_update( 'New child Group created for ' + group_store.getValue( current_group, 'name' ) );
+                                                               }
+       
+                                                       </script>
+                                               </button>
+       
+                                       </div>
+
+                                       <div id="perm_pane" dojoType="dijit.layout.ContentPane" title="Group Permissions">
+                                               <script type="dojo/connect" event="onShow">
+                                                       perm_map_model.query = { grp : current_group ? current_group.id[0] : -1 };
+                                                       perm_map_model.refresh();
+                                                       perm_grid.refresh();
+                                               </script>
+                                               <div dojoType="dijit.layout.LayoutContainer" orientation="horizontal" style="width:100%; height:100%;">
+                                                       <div id="grid_container" dojoType="dijit.layout.ContentPane" sizeShare="1" layoutAlign="left">
+                                                               <div dojoType="dojox.grid.data.DojoData" id="perm_map_model"jsId="perm_map_model" store="perm_map_store"></div>
+       
+                                                               <div id="perm_grid" dojoType="dojox.Grid" model="perm_map_model" jsId="perm_grid">
+                                                                       <script type="dojo/connect" event="startup">
+       
+                                                                               function get_item_part(model_field, item_search_field, item_part, model, store, datum, row) {
+                                                                                       var formatter = true;
+       
+                                                                                       if (!row && row != '0') {
+                                                                                               row = datum;
+                                                                                               formatter = false;
+                                                                                       }
+       
+                                                                                       if(!model.getRow(row)) return null;
+                                                                                       var value = null;
+       
+                                                                                       if(!formatter) { //this.editor && (this.editor.alwaysOn || (this.grid.edit.info.rowIndex==row && this.grid.edit.info.cell==this))) {
+                                                                                               return model.getRow(row)[model_field];
+                                                                                       }
+       
+                                                                                       var q = {};
+                                                                                       q[item_search_field] = model.getRow(row)[model_field];
+       
+                                                                                       store.fetch({
+                                                                                               query : q,
+                                                                                               onItem : function (item) { value = store.getValue( item, item_part ) }
+                                                                                       });
+
+                                                                                       return value;
+                                                                               }
+       
+                                                   window.current_perm_grid_layout = [
+                                                       {   cells : [
+                                                                   [
+                                                                           {   name : "Code",
+                                                                                                                       field: "perm",
+                                                                                                                       formatter : dojo.partial(get_item_part, "perm", "id", "code", perm_map_model, perm_store),
+                                                                                                                       width : "auto"
+                                                                                                               },
+                                                                                               {       name : "Depth",
+                                                                                                                       field : "depth",
+                                                                                                                       formatter : dojo.partial(get_item_part, "depth", "depth", "name", perm_map_model, ou_type_store),
+                                                                                                                       editor : dojox.grid.editors.select,
+                                                                                                                       options : dojo.map( _ou_type_list, function (x) { return x.name() } ),
+                                                                                                                       values : dojo.map( _ou_type_list, function (x) { return x.depth() } )
+                                                                                                               }, 
+                                                                   {   name : "Grantable",
+                                                                                                                       field : "grantable",
+                                                                                                                       editor : dojox.grid.editors.bool,
+                                                                                                                       get : function (row) {
+                                                                                                                               var gr = get_item_part("id", "id", "grantable", perm_map_model, perm_map_model.store, row, row);
+                                                                                                                               if (gr == 't' || gr === true) return true;
+                                                                                                                               return false;
+                                                                                                                       },
+                                                                                                               }
+                                                                                               ]
+                                                                                               ]
+                                                       }
+                                                   ];
+
+                                                                               perm_grid.setStructure(window.current_perm_grid_layout);
+       
+                                                                       </script>
+                                                               </div>
+                                                       </div>
+
+                                                       <div id="new_perm_container" dojoType="dijit.layout.ContentPane" sizeShare="1" layoutAlign="client">
+
+                                                               <div dojoType="dijit.form.DropDownButton" id="new_popup" jsId="new_popup">
+                                                                       <span>New Mapping</span>
+                                                                       <div  dojoType="dijit.TooltipDialog"> 
+                                                                               <table class="tundra">
+                                                                                       <tr>
+                                                                                               <td>Permission:</td>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                                                         Id="new_perm_select"
+                                                                                                         jsId="new_perm_select"
+                                                                                                         store="perm_store"
+                                                                                                         searchAttr="code"
+                                                                                                         ignoreCase="true"
+                                                                                                         required="true"></div>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                                       <tr>
+                                                                                               <td>Depth:</td>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                         dojoType="dijit.form.FilteringSelect"
+                                                                                                         Id="new_depth_select"
+                                                                                                         jsId="new_depth_select"
+                                                                                                         store="ou_type_store"
+                                                                                                         searchAttr="name"
+                                                                                                         ignoreCase="true"
+                                                                                                         required="true"></div>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                                       <tr>
+                                                                                               <td>Grantable:</td>
+                                                                                               <td>
+                                                                                                       <input
+                                                                                                         type="checkbox"
+                                                                                                         dojoType="dijit.form.CheckBox"
+                                                                                                         Id="new_grant_checkbox"
+                                                                                                         jsId="new_grant_checkbox"
+                                                                                                         value="t"></input>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </table>
+
+                                                                               <button dojoType="dijit.form.Button" jsId="new_mapping_add" label="Add Mapping">
+                                                                   <script type="dojo/connect" event="onClick">
+                                               
+                                                                       var new_perm = new_perm_select.getValue();
+                                                                       if (!new_perm) return;
+               
+                                                                       var new_type_id = new_depth_select.getValue();
+                                                                       if (!new_type_id) return;
+               
+                                                                                               var new_type;
+                                                               window.ou_type_store.fetch({
+                                                               query : { id : new_type_id },
+                                                               onItem : function (item, req) { try { new_type = item } catch (e) { /* meh */ } },
+                                                               });
+               
+                                                                       var new_depth = ou_type_store.getValue( new_type, 'depth')
+                                                                       var new_grant = new_grant_checkbox.getValue();
+                                               
+                                                                       var new_fm_obj = new pgpm().fromHash({
+                                                                           isnew       : 1,
+                                                                           perm        : new_perm,
+                                                                           depth       : new_depth,
+                                                                                                       grp                     : group_store.getValue( current_group, 'id' ),
+                                                                                                       grantable       : new_grant ? 't' : 'f'
+                                                                       });
+                                                   
+                                                                       var err = false;
+                                                                       server.pCRUD.request({
+                                                                           method : 'open-ils.permacrud.create.pgpm',
+                                                                           timeout : 10,
+                                                                           params : [ ses, new_fm_obj ],
+                                                                           onerror : function (r) {
+                                                                               highlighter.group_tree.red.play();
+                                                                               status_update( 'Problem calling method to create new Permission Map' );
+                                                                               err = true;
+                                                                           },
+                                                                           oncomplete : function (r) {
+               
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                   var new_item_hash = res.content().toHash();
+                                                                                   perm_map_store.newItem( new_item_hash );
+                                                                                   status_update( 'New permission map created' );
+                                                                                   highlighter.group_tree.green.play();
+               
+                                                                                           perm_map_model.query = { grp : current_group ? current_group.id[0] : -1 };
+                                                                                   perm_grid.model.sort(-1);
+                                                                                           perm_map_model.refresh();
+                                                                                           perm_grid.refresh();
+               
+                                                                               } else {
+                                                                                   highlighter.group_tree.red.play();
+                                                                                   status_update( 'Problem creating new Permission Map' );
+                                                                                   err = true;
+                                                                               }
+                                                                           }
+                                                                       }).send();
+
+                                                                                               new_popup._closeDropDown();
+                   
+                                                                   </script>
+               
+                                                                               </button>
+                                                                       </div>
+                                                               </div>
+
+                                                               <button jsId="save_pgpm_button" dojoType="dijit.form.Button" label="Save Changes" onClick="save_them_all()"></button><br/>
+
+                                               <button jsId="delete_pgpm_button" dojoType="dijit.form.Button" label="Remove Selected">
+                                                       <script type="dojo/connect" event="onClick">
+                                       
+                                                       var selected_rows = perm_grid.selection.getSelected();
+                                       
+                                                       var selected_items = [];
+                                                       for (var i in selected_rows) {
+                                                           selected_items.push(
+                                                               perm_grid.model.getRow( selected_rows[i] ).__dojo_data_item
+                                                           );
+                                                       }
+                       
+                                                       perm_grid.selection.clear();
+                               
+                                                           for (var i in selected_items) {
+                                                                   window.current_perm_map = selected_items[i];
+                       
+                                                                       perm_map_store.setValue( window.current_perm_map, 'isdeleted', 1 );
+                                                       
+                                                                           var modified_pgpm = new pgpm().fromStoreItem( window.current_perm_map );
+                                                                               modified_pgpm.isdeleted( 1 );
+                                   
+                                                       server.pCRUD.request({
+                                                           method : 'open-ils.permacrud.delete.pgpm',
+                                                           timeout : 10,
+                                                               params : [ ses, modified_pgpm ],
+                                                                   onerror : function (r) {
+                                                                                                       highlighter.editor_pane.red.play();
+                                                                               status_update( 'Problem deleting permission mapping ' + perm_map_store.getValue( window.current_perm_map, 'id' ) );
+                                                                               },
+                                                                                   oncomplete : function (r) {
+                                                                                           var res = r.recv();
+                                                                                               if ( res && res.content() ) {
+                                               
+                                                                                   perm_map_store.fetch({
+                                                                                           query : { id : perm_map_store.getValue( window.current_perm_map, 'id' ) },
+                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                                   scope : perm_map_store
+                                                                                                   });
+                           
+                                                                                                       window.current_perm_map = null;
+                                               
+                                                                                                               highlighter.editor_pane.green.play();
+                                                                                       status_update( 'Permission mapping deleted' );
+                                                                                       } else {
+                                                                                                               highlighter.editor_pane.red.play();
+                                                                                                   status_update( 'Problem deleting permission mapping ' + perm_map_store.getValue( window.current_perm_map, 'id' ));
+                                                                                                   }
+                                                           }
+                                                       }).send();
+                                       
+                                                       }
+                                   
+                                                       </script>
+                                                       </button>
+       
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/Open-ILS/web/conify/global/permission/grp_tree.js b/Open-ILS/web/conify/global/permission/grp_tree.js
new file mode 100644 (file)
index 0000000..151a343
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+dojo.require('fieldmapper.dojoData');
+dojo.require('openils.I18N');
+dojo.require('dojo.parser');
+dojo.require('dojo.data.ItemFileWriteStore');
+dojo.require('dojo.date.stamp');
+dojo.require('dijit.form.NumberSpinner');
+dojo.require('dijit.form.TextBox');
+dojo.require('dijit.form.TimeTextBox');
+dojo.require('dijit.form.ValidationTextBox');
+dojo.require('dijit.form.CheckBox');
+dojo.require('dijit.form.FilteringSelect');
+dojo.require('dijit.form.Textarea');
+dojo.require('dijit.form.Button');
+dojo.require('dijit.Dialog');
+dojo.require('dijit.Tree');
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.TabContainer');
+dojo.require('dijit.layout.LayoutContainer');
+dojo.require('dijit.layout.SplitContainer');
+dojo.require('dojox.widget.Toaster');
+dojo.require('dojox.fx');
+dojo.require('dojox.grid.Grid');
+dojo.require('dojox.grid._data.model');
+dojo.require("dojox.grid.editors");
+
+// some handy globals
+var cgi = new CGI();
+var cookieManager = new HTTP.Cookies();
+var ses = cookieManager.read('ses') || cgi.param('ses');
+var server = {};
+server.pCRUD = new OpenSRF.ClientSession('open-ils.permacrud');
+server.actor = new OpenSRF.ClientSession('open-ils.actor');
+
+var current_group;
+var virgin_out_id = -1;
+
+var highlighter = {};
+
+function status_update (markup) {
+       if (parent !== window && parent.status_update) parent.status_update( markup );
+}
+
+function save_group () {
+
+       var modified_pgt = new pgt().fromStoreItem( current_group );
+       modified_pgt.ischanged( 1 );
+
+       new_kid_button.disabled = false;
+       save_out_button.disabled = false;
+       delete_out_button.disabled = false;
+
+       server.pCRUD.request({
+               method : 'open-ils.permacrud.update.pgt',
+               timeout : 10,
+               params : [ ses, modified_pgt ],
+               onerror : function (r) {
+                       highlighter.editor_pane.red.play();
+                       status_update( 'Problem saving data for ' + group_store.getValue( current_group, 'name' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               group_store.setValue( current_group, 'ischanged', 0 );
+                               highlighter.editor_pane.green.play();
+                               status_update( 'Saved changes to ' + group_store.getValue( current_group, 'name' ) );
+                       } else {
+                               highlighter.editor_pane.red.play();
+                               status_update( 'Problem saving data for ' + group_store.getValue( current_group, 'name' ) );
+                       }
+               },
+       }).send();
+}
+
+function save_perm_map (storeItem) {
+
+       var modified_pgpm = new pgpm().fromStoreItem( storeItem );
+       modified_pgpm.ischanged( 1 );
+
+       server.pCRUD.request({
+               method : 'open-ils.permacrud.update.pgpm',
+               timeout : 10,
+               params : [ ses, modified_pgpm ],
+               onerror : function (r) {
+                       highlighter.editor_pane.red.play();
+                       status_update( 'Problem saving permission data for ' + group_store.getValue( current_group, 'name' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               perm_map_store.setValue( storeItem, 'ischanged', 0 );
+                               highlighter.editor_pane.green.play();
+                               status_update( 'Saved permission changes to ' + group_store.getValue( current_group, 'name' ) );
+                       } else {
+                               highlighter.editor_pane.red.play();
+                               status_update( 'Problem saving permission data for ' + group_store.getValue( current_group, 'name' ) );
+                       }
+               },
+       }).send();
+}
+
+function save_them_all (event) {
+
+       var dirtyMaps = [];
+
+    perm_map_store.fetch({
+        query : { ischanged : 1 },
+        onItem : function (item, req) { try { if (this.isItem( item )) dirtyMaps.push( item ); } catch (e) { /* meh */ } },
+        scope : perm_map_store
+    });
+
+    var confirmation = true;
+
+
+    if (event && dirtyMaps.length > 0) {
+        confirmation = confirm(
+            'There are unsaved modified Permission Maps!  '+
+            'OK to save these changes, Cancel to abandon them.'
+        );
+    }
+
+    if (confirmation) {
+        for (var i in dirtyMaps) {
+            save_perm_map(dirtyMaps[i]);
+        }
+    }
+}
+
+dojo.addOnUnload( save_them_all );
+
diff --git a/Open-ILS/web/conify/global/permission/perm_list.html b/Open-ILS/web/conify/global/permission/perm_list.html
new file mode 100644 (file)
index 0000000..18aa944
--- /dev/null
@@ -0,0 +1,249 @@
+<!--
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title>Confiy :: Global :: Permission :: Permission List</title>
+
+               <style type="text/css">
+                       @import url("/js/dojo/dojox/grid/_grid/tundraGrid.css");
+                       @import url("/js/dojo/dojo/resources/dojo.css");
+                       @import url("/js/dojo/dijit/themes/tundra/tundra.css");
+                       @import url("/js/dojo/dojox/widget/Toaster/Toaster.css");
+               </style>
+
+               <style>
+                       html, body {
+                               height: 100%;
+                               width: 100%;
+                               margin: 0px 0px 0px 0px;
+                               padding: 0px 0px 0px 0px;
+                               overflow: hidden;
+                       }
+
+                       #perm_grid {
+                               border: 0px;
+                               width: 100%;
+                               height: 100%;
+                       }
+
+                       #grid_container {
+                               width: 100%;
+                               height: 100%;
+                       }
+               </style>
+
+               <!-- The OpenSRF API writ JS -->
+               <script language='javascript' src='/opac/common/js/utils.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/Cookies.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/CGI.js' type='text/javascript'></script>
+               <script language='javascript' src='/opac/common/js/JSON_v1.js' type='text/javascript'></script>
+
+               <!-- Dojo goodness -->
+               <script type="text/javascript" src="/js/dojo/dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+               <script type="text/javascript" src="/js/dojo/dijit/dijit.js"></script>
+
+               <script type="text/javascript" src="perm_list.js"></script>
+
+       </head>
+
+       <body class="tundra" id='pagebody'>
+
+               <div dojoType="dijit.layout.LayoutContainer" id="grid_container" jsId="grid_container" orientation="vertical">
+                       <script type="dojo/method">
+                               window.highlighter= {};
+                               window.highlighter.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'grid_container', duration : 500 } );
+                               window.highlighter.red = dojox.fx.highlight( { color : '#FF2018', node : 'grid_container', duration : 500 } );
+
+                               window.dirtyStore = [];
+
+                pCRUD.request({
+                    method : 'open-ils.permacrud.search.ppl.atomic',
+                    timeout : 10,
+                    params : [ ses, { id : { "!=" : null } }, { order_by : { ppl : 'code' } } ],
+                    onerror : function (r) { status_update('Problem fetching perms') },
+                    oncomplete : function (r) {
+
+                        window._perm_list = r.recv().content();
+                        window._perm_data = ppl.toStoreData( window._perm_list, 'code' );
+                        window.perm_store = new dojo.data.ItemFileWriteStore({ data : window._perm_data });
+
+                           perm_store.onSet = function (item, attr, o, n) {
+                            if (attr == 'ischanged') return;
+                            if (n == o) return;
+                            this.setValue( item, 'ischanged', 1);
+                        };
+
+                                               window.perm_grid_layout = [
+                                                       {       cells : [
+                                                                       [
+                                                                               { name : "Code",        field : "code",        width : "300px", editor : dojox.grid.editors.Dijit },
+                                                                               { name : "Description", field : "description", width : "auto",  editor : dojox.grid.editors.Editor }
+                                                                       ]
+                                                               ]
+                                                       }
+                                               ];
+
+                        dojo.addOnUnload( function (event) {
+
+                            perm_store.fetch({
+                                query : { ischanged : 1 },
+                                onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+                                scope : perm_store
+                            });
+
+                            if (dirtyStore.length > 0) {
+                                var confirmation = confirm(
+                                    'There are unsaved modified Permissions!  '+
+                                    'OK to save these changes, Cancel to abandon them.'
+                                );
+
+                                if (confirmation) {
+                                    for (var i in window.dirtyStore) {
+                                        window.current_perm = window.dirtyStore[i];
+                                        save_perm(true);
+                                    }
+                                }
+                            }
+
+                        });
+                    }
+                }).send();
+
+                       </script>
+
+                       <div dojoType="dijit.layout.LayoutContainer" orientation="horizontal" style="margin-top: 5px;" layoutAlign="top">
+                               <span>New Permission:</span>
+                               <div dojoType="dijit.form.TextBox" id="new_perm_code" jsId="new_perm_code" label="New Code"></div>
+                               <button dojoType="dijit.form.Button" id="save_new_perm_code" jsId="save_new_perm_code" label="Add"> 
+                                       <script type="dojo/connect" event="onClick">
+
+                                               var new_code = new_perm_code.getValue();
+                                               if (!new_code) return;
+
+                       var new_fm_obj = new ppl().fromHash({
+                               isnew           : 1,
+                           code            : new_code
+                           });
+    
+                       var err = false;
+                           pCRUD.request({
+                           method : 'open-ils.permacrud.create.ppl',
+                               timeout : 10,
+                           params : [ ses, new_fm_obj ],
+                               onerror : function (r) {
+                               highlighter.red.play();
+                                   status_update( 'Problem calling method to create new Permission' );
+                               err = true;
+                               },
+                               oncomplete : function (r) {
+                               var res = r.recv();
+                                   if ( res && res.content() ) {
+                                   var new_item_hash = res.content().toHash();
+                                   perm_store.newItem( new_item_hash );
+                                                                       status_update( 'New ' + new_item_hash.code + ' permission created' );
+                                                                       perm_grid.model.sort(-1);
+                                                                       highlighter.green.play();
+                               } else {
+                                       highlighter.red.play();
+                                   status_update( 'Problem creating new Permission' );
+                                       err = true;
+                               }
+                               }
+                       }).send();
+    
+                       </script>
+                               </button>
+                       </div>
+
+                       <div dojoType="dijit.layout.ContentPane" style="width:100%; height:100%;" layoutAlign="client">
+                               <div dojoType="dojox.grid.data.DojoData" id="perm_data_model"jsId="perm_data_model" store="perm_store" query="{ code : '*' }"></div>
+                               <div id="perm_grid" dojoType="dojox.Grid" model="perm_data_model" structure="perm_grid_layout" jsId="perm_grid">
+                                       <!!--
+                                       <script type="dojo/connect" event="onSet" args="item,attr,oldVal,newVal">
+                                       </script>
+                                       -->
+                               </div>
+                       </div>
+
+                       <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 5px;" layoutAlign="bottom">
+               
+                               <button jsId="save_ppl_button" dojoType="dijit.form.Button" label="Save Changes" onClick="save_them_all()"></button>
+               
+                               <button jsId="delete_ppl_button" dojoType="dijit.form.Button" label="Delete Selected">
+                                       <script type="dojo/connect" event="onClick">
+
+                                               var selected_rows = perm_grid.selection.getSelected();
+               
+                                               var selected_items = [];
+                                               for (var i in selected_rows) {
+                                                       selected_items.push(
+                                                               perm_grid.model.getRow( selected_rows[i] ).__dojo_data_item
+                                                       );
+                                               }
+
+                                               perm_grid.selection.clear();
+
+                                               for (var i in selected_items) {
+                                                       current_perm = selected_items[i];
+
+                                                       if ( confirm('Are you sure you want to delete ' + perm_store.getValue( current_perm, 'code' ) + '?')) {
+
+                                                               perm_store.setValue( current_perm, 'isdeleted', 1 );
+                       
+                                                               var modified_ppl = new ppl().fromStoreItem( current_perm );
+                                                               modified_ppl.isdeleted( 1 );
+                       
+                                                               pCRUD.request({
+                                                                       method : 'open-ils.permacrud.delete.ppl',
+                                                                       timeout : 10,
+                                                                       params : [ ses, modified_ppl ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.red.play();
+                                                                               status_update( 'Problem deleting ' + perm_store.getValue( current_perm, 'code' ) );
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                       
+                                                                                       var old_name = perm_store.getValue( current_perm, 'code' );
+               
+                                                                                       perm_store.fetch({
+                                                                                               query : { id : perm_store.getValue( current_perm, 'id' ) },
+                                                                                               onItem : function (item, req) { try { if (this.isItem( item )) this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                               scope : perm_store
+                                                                                       });
+                       
+                                                                                       current_perm = null;
+                       
+                                                                                       highlighter.green.play();
+                                                                                       status_update( old_name + ' deleted' );
+                                                                               } else {
+                                                                                       highlighter.red.play();
+                                                                                       status_update( 'Problem deleting ' + old_name );
+                                                                               }
+                                                                       }
+                                                               }).send();
+               
+                                                       }
+                                               }
+       
+                                       </script>
+                               </button>
+       
+                       </div>
+               </div>
+       
+       </body>
+</html>
diff --git a/Open-ILS/web/conify/global/permission/perm_list.js b/Open-ILS/web/conify/global/permission/perm_list.js
new file mode 100644 (file)
index 0000000..4dc76cf
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+dojo.require('fieldmapper.dojoData');
+dojo.require('dojo.parser');
+dojo.require('dojo.string');
+dojo.require('dojo.data.ItemFileWriteStore');
+dojo.require('dijit.form.TextBox');
+dojo.require('dijit.form.ValidationTextBox');
+dojo.require('dijit.form.Textarea');
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.LayoutContainer');
+dojo.require('dijit.layout.BorderContainer');
+dojo.require('dojox.widget.Toaster');
+dojo.require('dojox.fx');
+dojo.require('dojox.grid.Grid');
+dojo.require('dojox.grid._data.model');
+dojo.require("dojox.grid.editors");
+
+// some handy globals
+var cgi = new CGI();
+var cookieManager = new HTTP.Cookies();
+var ses = cookieManager.read('ses') || cgi.param('ses');
+var pCRUD = new OpenSRF.ClientSession('open-ils.permacrud');
+
+var current_perm;
+var virgin_out_id = -1;
+
+var highlighter = {};
+
+function status_update (markup) {
+       if (parent !== window && parent.status_update) parent.status_update( markup );
+}
+
+function save_perm () {
+
+       var modified_ppl = new ppl().fromStoreItem( current_perm );
+       modified_ppl.ischanged( 1 );
+       modified_ppl.description( dojo.string.trim( modified_ppl.description() ) );
+       modified_ppl.code( dojo.string.trim( modified_ppl.code() ) );
+
+       pCRUD.request({
+               method : 'open-ils.permacrud.update.ppl',
+               timeout : 10,
+               params : [ ses, modified_ppl ],
+               onerror : function (r) {
+                       highlighter.red.play();
+                       status_update( 'Problem saving data for ' + perm_store.getValue( current_perm, 'code' ) );
+               },
+               oncomplete : function (r) {
+                       var res = r.recv();
+                       if ( res && res.content() ) {
+                               perm_store.setValue( current_perm, 'ischanged', 0 );
+                               highlighter.green.play();
+                               status_update( 'Saved changes to ' + perm_store.getValue( current_perm, 'code' ) );
+                       } else {
+                               highlighter.red.play();
+                               status_update( 'Problem saving data for ' + perm_store.getValue( current_perm, 'code' ) );
+                       }
+               },
+       }).send();
+}
+
+function save_them_all (event) {
+
+       perm_store.fetch({
+               query : { ischanged : 1 },
+               onItem : function (item, req) { try { if (this.isItem( item )) window.dirtyStore.push( item ); } catch (e) { /* meh */ } },
+               scope : perm_store
+       });
+
+       var confirmation = true;
+
+
+       if (event && dirtyStore.length > 0) {
+               confirmation = confirm(
+                       'There are unsaved modified Permissions!  '+
+                       'OK to save these changes, Cancel to abandon them.'
+               );
+       }
+
+       if (confirmation) {
+               for (var i in window.dirtyStore) {
+                       window.current_perm = window.dirtyStore[i];
+                       save_perm(true);
+               }
+
+               window.dirtyStore = [];
+       }
+}
+
+dojo.addOnUnload( save_them_all );
+
diff --git a/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js b/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js
new file mode 100644 (file)
index 0000000..c6bc24e
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+if(!dojo._hasResource["fieldmapper.Fieldmapper"]){
+
+/* generate fieldmapper javascript classes.  This expects a global variable
+       called 'fmclasses' to be fleshed with the classes we need to build */
+
+       function FMEX(message) { this.message = message; }
+       FMEX.toString = function() { return "FieldmapperException: " + this.message + "\n"; }
+
+
+       dojo._hasResource["fieldmapper.Fieldmapper"] = true;
+       dojo.provide("fieldmapper.Fieldmapper");
+       dojo.require("DojoSRF");
+       dojo.require("fieldmapper.fmall", true);
+
+       dojo.declare( "fieldmapper.Fieldmapper", null, {
+
+               constructor : function (initArray) {
+                       if (initArray) {
+                               if (dojo.isArray(initArray)) {
+                                       this.a = initArray;
+                               } else {
+                                       this.a = [];
+                               }
+                       }
+               },
+
+               _isfieldmapper : true,
+               fm_classes : fmclasses,
+
+               clone : function() {
+                       var obj = new this.constructor();
+
+                       for( var i in this.a ) {
+                               var thing = this.a[i];
+                               if(thing == null) continue;
+
+                               if( thing._isfieldmapper ) {
+                                       obj.a[i] = thing.clone();
+                               } else {
+
+                                       if(instanceOf(thing, Array)) {
+                                               obj.a[i] = new Array();
+
+                                               for( var j in thing ) {
+
+                                                       if( thing[j]._isfieldmapper )
+                                                               obj.a[i][j] = thing[j].clone();
+                                                       else
+                                                               obj.a[i][j] = thing[j];
+                                               }
+                                       } else {
+                                               obj.a[i] = thing;
+                                       }
+                               }
+                       }
+                       return obj;
+               },
+
+               isnew : function(n) { if(arguments.length == 1) this.a[0] =n; return this.a[0]; },
+               ischanged : function(n) { if(arguments.length == 1) this.a[1] =n; return this.a[1]; },
+               isdeleted : function(n) { if(arguments.length == 1) this.a[2] =n; return this.a[2]; }
+       });
+
+       fieldmapper._request = function ( meth, staff, params ) {
+               var ses = OpenSRF.CachedClientSession( meth[0] );
+               if (!ses) return null;
+
+               var result = null;
+               var args = {};
+
+               if (dojo.isArray(params)) {
+                       args.params = params;
+               } else {
+
+                       if (dojo.isObject(params)) {
+                               args = params;
+                       } else {
+                               args.params = arguments.splice(1, arguments.length - 1);
+                       }
+
+               }
+
+        if (!args.async && !args.timeout) args.timeout = 10;
+
+               if (!args.onerror) {
+                       args.onerror = function (r) {
+                               throw 'Error encountered! ' + r;
+                       }
+               }
+
+               if (!args.oncomplete) {
+                       args.oncomplete = function (r) {
+                               var x = r.recv();
+                               if (x) result = x.content();
+                       }
+               }
+
+               args.method = meth[1];
+               if (staff && meth[2]) args.method += '.staff';
+
+               ses.request(args).send();
+
+               return result;
+       };
+
+       fieldmapper.standardRequest = function (meth, params) { return fieldmapper._request(meth, false, params) };
+       fieldmapper.Fieldmapper.prototype.standardRequest = fieldmapper.standardRequest;
+
+       fieldmapper.staffRequest = function (meth, params) { return fieldmapper._request(meth, true, params) };
+       fieldmapper.Fieldmapper.prototype.staffRequest = fieldmapper.staffRequest;
+
+       for( var cl in fmclasses ) {
+               dojo.provide( cl );
+               dojo.declare( cl , fieldmapper.Fieldmapper, {
+                       constructor : function () {
+                               if (!this.a) this.a = [];
+                               this.classname = this.declaredClass;
+                               this.Identifier = 'id';
+                               this._fields = fmclasses[this.classname];
+                               for( var pos = 0; pos <  this._fields.length; pos++ ) {
+                                       var p = parseInt(pos) + 3;
+                                       var f = this._fields[pos];
+                                       this[f]=new Function('n', 'if(arguments.length==1)this.a['+p+']=n;return this.a['+p+'];');
+                               }
+                       }
+               });
+               fieldmapper[cl] = window[cl]; // alias into place
+
+       }
+
+       fieldmapper.ppl.Identifier = 'code';
+       fieldmapper.ccm.Identifier = 'code';
+       fieldmapper.cvrfm.Identifier = 'code';
+       fieldmapper.clm.Identifier = 'code';
+       fieldmapper.cam.Identifier = 'code';
+       fieldmapper.cifm.Identifier = 'code';
+       fieldmapper.citm.Identifier = 'code';
+       fieldmapper.cblvl.Identifier = 'code';
+       fieldmapper.clfm.Identifier = 'code';
+       fieldmapper.mous.Identifier = 'usr';
+       fieldmapper.moucs.Identifier = 'usr';
+       fieldmapper.mucs.Identifier = 'usr';
+       fieldmapper.mus.Identifier = 'usr';
+       fieldmapper.rxbt.Identifier = 'xact';
+       fieldmapper.rxpt.Identifier = 'xact';
+       fieldmapper.cxt.Identifier = 'name';
+       fieldmapper.amtr.Identifier = 'matchpoint';
+       fieldmapper.chmt.Identifier = 'matchpoint';
+       fieldmapper.ccmt.Identifier = 'matchpoint';
+       fieldmapper.ccmrs.Identifier = 'matchpoint';
+
+       fieldmapper.OpenSRF = {};
+
+       /*      Methods are defined as [ service, method, have_staff ]
+               An optional 3rd component is when a method is followed by true, such methods
+               have a staff counterpart and should have ".staff" appended to the method 
+               before the method is called when in XUL mode */
+       fieldmapper.OpenSRF.methods = {
+               SEARCH_MRS : ['open-ils.search','open-ils.search.metabib.multiclass',true],
+               SEARCH_RS : ['open-ils.search','open-ils.search.biblio.multiclass',true],
+               SEARCH_MRS_QUERY : ['open-ils.search','open-ils.search.metabib.multiclass.query',true],
+               SEARCH_RS_QUERY : ['open-ils.search','open-ils.search.biblio.multiclass.query',true],
+               FETCH_SEARCH_RIDS : ['open-ils.search','open-ils.search.biblio.record.class.search',true],
+               FETCH_MRMODS : ['open-ils.search','open-ils.search.biblio.metarecord.mods_slim.retrieve'],
+               FETCH_MODS_FROM_COPY : ['open-ils.search','open-ils.search.biblio.mods_from_copy'],
+               FETCH_MR_COPY_COUNTS : ['open-ils.search','open-ils.search.biblio.metarecord.copy_count',true],
+               FETCH_RIDS : ['open-ils.search','open-ils.search.biblio.metarecord_to_records',true],
+               FETCH_RMODS : ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve'],
+               FETCH_R_COPY_COUNTS : ['open-ils.search','open-ils.search.biblio.record.copy_count',true],
+               FETCH_FLESHED_USER : ['open-ils.actor','open-ils.actor.user.fleshed.retrieve'],
+               FETCH_SESSION : ['open-ils.auth','open-ils.auth.session.retrieve'],
+               LOGIN_INIT : ['open-ils.auth','open-ils.auth.authenticate.init'],
+               LOGIN_COMPLETE : ['open-ils.auth','open-ils.auth.authenticate.complete'],
+               LOGIN_DELETE : ['open-ils.auth','open-ils.auth.session.delete'],
+               FETCH_USER_PREFS : ['open-ils.actor','open-ils.actor.patron.settings.retrieve'], 
+               UPDATE_USER_PREFS : ['open-ils.actor','open-ils.actor.patron.settings.update'], 
+               FETCH_COPY_STATUSES : ['open-ils.search','open-ils.search.config.copy_status.retrieve.all'],
+               FETCH_COPY_COUNTS_SUMMARY : ['open-ils.search','open-ils.search.biblio.copy_counts.summary.retrieve'],
+               FETCH_MARC_HTML : ['open-ils.search','open-ils.search.biblio.record.html'],
+               FETCH_CHECKED_OUT_SUM : ['open-ils.actor','open-ils.actor.user.checked_out'],
+               FETCH_HOLDS : ['open-ils.circ','open-ils.circ.holds.retrieve'],
+               FETCH_FINES_SUMMARY : ['open-ils.actor','open-ils.actor.user.fines.summary'],
+               FETCH_TRANSACTIONS : ['open-ils.actor','open-ils.actor.user.transactions.have_charge.fleshed'],
+               FETCH_MONEY_BILLING : ['open-ils.circ','open-ils.circ.money.billing.retrieve.all'],
+               FETCH_CROSSREF : ['open-ils.search','open-ils.search.authority.crossref'],
+               FETCH_CROSSREF_BATCH : ['open-ils.search','open-ils.search.authority.crossref.batch'],
+               CREATE_HOLD : ['open-ils.circ','open-ils.circ.holds.create'],
+               CREATE_HOLD_OVERRIDE : ['open-ils.circ','open-ils.circ.holds.create.override'],
+               CANCEL_HOLD : ['open-ils.circ','open-ils.circ.hold.cancel'],
+               UPDATE_USERNAME : ['open-ils.actor','open-ils.actor.user.username.update'],
+               UPDATE_PASSWORD : ['open-ils.actor','open-ils.actor.user.password.update'],
+               UPDATE_EMAIL : ['open-ils.actor','open-ils.actor.user.email.update'],
+               RENEW_CIRC : ['open-ils.circ','open-ils.circ.renew'],
+               CHECK_SPELL : ['open-ils.search','open-ils.search.spellcheck'],
+               FETCH_REVIEWS : ['open-ils.search','open-ils.search.added_content.review.retrieve.all'],
+               FETCH_TOC : ['open-ils.search','open-ils.search.added_content.toc.retrieve'],
+               FETCH_ACONT_SUMMARY : ['open-ils.search','open-ils.search.added_content.summary.retrieve'],
+               FETCH_USER_BYBARCODE : ['open-ils.actor','open-ils.actor.user.fleshed.retrieve_by_barcode'],
+               FETCH_ADV_MARC_MRIDS : ['open-ils.search','open-ils.search.biblio.marc',true],
+               FETCH_ADV_ISBN_RIDS : ['open-ils.search','open-ils.search.biblio.isbn'],
+               FETCH_ADV_ISSN_RIDS : ['open-ils.search','open-ils.search.biblio.issn'],
+               FETCH_ADV_TCN_RIDS : ['open-ils.search','open-ils.search.biblio.tcn'],
+               FETCH_CNBROWSE : ['open-ils.search','open-ils.search.callnumber.browse'],
+               FETCH_CONTAINERS : ['open-ils.actor','open-ils.actor.container.retrieve_by_class'],
+               FETCH_CONTAINERS : ['open-ils.actor','open-ils.actor.container.retrieve_by_class'],
+               CREATE_CONTAINER : ['open-ils.actor','open-ils.actor.container.create'],
+               DELETE_CONTAINER : ['open-ils.actor','open-ils.actor.container.full_delete'],
+               CREATE_CONTAINER_ITEM : ['open-ils.actor','open-ils.actor.container.item.create'],
+               DELETE_CONTAINER_ITEM : ['open-ils.actor','open-ils.actor.container.item.delete'],
+               FLESH_CONTAINER : ['open-ils.actor','open-ils.actor.container.flesh'],
+               FLESH_PUBLIC_CONTAINER : ['open-ils.actor','open-ils.actor.container.public.flesh'],
+               UPDATE_CONTAINER : ['open-ils.actor','open-ils.actor.container.update'],
+               FETCH_COPY : ['open-ils.search','open-ils.search.asset.copy.retrieve'],
+               FETCH_FLESHED_COPY : ['open-ils.search','open-ils.search.asset.copy.fleshed2.retrieve'],
+               CHECK_HOLD_POSSIBLE : ['open-ils.circ','open-ils.circ.title_hold.is_possible'],
+               UPDATE_HOLD : ['open-ils.circ','open-ils.circ.hold.update'],
+               FETCH_COPIES_FROM_VOLUME : ['open-ils.search','open-ils.search.asset.copy.retrieve_by_cn_label',true],
+               FETCH_VOLUME_BY_INFO : ['open-ils.search','open-ils.search.call_number.retrieve_by_info'], /* XXX staff method? */
+               FETCH_VOLUME : ['open-ils.search','open-ils.search.asset.call_number.retrieve'],
+               FETCH_COPY_LOCATIONS : ['open-ils.circ','open-ils.circ.copy_location.retrieve.all'],
+               FETCH_COPY_NOTES : ['open-ils.circ','open-ils.circ.copy_note.retrieve.all'],
+               FETCH_COPY_STAT_CATS : ['open-ils.circ','open-ils.circ.asset.stat_cat_entries.fleshed.retrieve_by_copy'],
+               FETCH_LIT_FORMS : ['open-ils.search','open-ils.search.biblio.lit_form_map.retrieve.all'],
+               FETCH_ITEM_FORMS : ['open-ils.search','open-ils.search.biblio.item_form_map.retrieve.all'],
+               FETCH_ITEM_TYPES : ['open-ils.search','open-ils.search.biblio.item_type_map.retrieve.all'],
+               FETCH_AUDIENCES : ['open-ils.search','open-ils.search.biblio.audience_map.retrieve.all'],
+               FETCH_HOLD_STATUS : ['open-ils.circ','open-ils.circ.hold.status.retrieve'],
+               FETCH_NON_CAT_CIRCS : ['open-ils.circ','open-ils.circ.open_non_cataloged_circulation.user'],
+               FETCH_NON_CAT_CIRC : ['open-ils.circ','open-ils.circ.non_cataloged_circulation.retrieve'],
+               FETCH_NON_CAT_TYPES : ['open-ils.circ','open-ils.circ.non_cat_types.retrieve.all'],
+               FETCH_BRE : ['open-ils.search','open-ils.search.biblio.record_entry.slim.retrieve'],
+               CHECK_USERNAME : ['open-ils.actor','open-ils.actor.username.exists'],
+               FETCH_CIRC_BY_ID : ['open-ils.circ','open-ils.circ.retrieve'],
+               FETCH_MR_DESCRIPTORS : ['open-ils.search','open-ils.search.metabib.record_to_descriptors'],
+               FETCH_HIGHEST_PERM_ORG : ['open-ils.actor','open-ils.actor.user.perm.highest_org.batch'],
+               FETCH_USER_NOTES : ['open-ils.actor','open-ils.actor.note.retrieve.all'],
+               FETCH_ORG_BY_SHORTNAME : ['open-ils.actor','open-ils.actor.org_unit.retrieve_by_shorname'],
+               FETCH_BIB_ID_BY_BARCODE : ['open-ils.search','open-ils.search.bib_id.by_barcode'],
+               FETCH_ORG_SETTING : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default']
+       };
+
+}
+
+
+
diff --git a/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js b/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js
new file mode 100644 (file)
index 0000000..d29313b
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+if(!dojo._hasResource["fieldmapper.OrgUtils"]){
+
+       dojo._hasResource["fieldmapper.OrgUtils"] = true;
+       dojo.provide("fieldmapper.OrgUtils");
+       dojo.require("fieldmapper.Fieldmapper");
+       dojo.require("fieldmapper.OrgTree", true);
+       dojo.require("fieldmapper.OrgLasso", true);
+
+       fieldmapper.aou.globalOrgTree = {};
+       fieldmapper.aou.OrgCache = {};
+       fieldmapper.aou.OrgCacheSN = {};
+       fieldmapper.aout.OrgTypeCache = {};
+
+       fieldmapper.aout.LoadOrgTypes = function () {
+               for (var i in fieldmapper.aout.OrgTypeCache) {
+                       return;
+               }
+
+               var types = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.org_types.retrieve']);
+
+               for (var i in types) {
+                       fieldmapper.aout.OrgTypeCache[types[i].id()] = {
+                               loaded : true,
+                               type : types[i]
+                       };
+               }
+       }
+
+       fieldmapper.aou.LoadOrg = function (id, slim_ok) {
+               var slim_o = fieldmapper.aou.OrgCache[id];
+
+               if (slim_o && (slim_ok || slim_o.loaded))
+                       return fieldmapper.aou.OrgCache[id].org;
+
+               var o = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.org_unit.retrieve'],[null,id]);
+               fieldmapper.aou.OrgCache[o.id()] = { loaded : true, org : o };
+               return o;
+       }
+       fieldmapper.aou.findOrgUnit = fieldmapper.aou.LoadOrg;
+
+       if (window._l) {
+               for (var i in _l) {
+                       fieldmapper.aou.OrgCache[_l[i][0]] = {
+                               loaded: false,
+                               org : new fieldmapper.aou().fromHash({
+                                       id : _l[i][0],
+                                       ou_type : _l[i][1],
+                                       parent_ou : _l[i][2],
+                                       name : _l[i][3],
+                                       opac_visible : _l[i][4]
+                               })
+                       };
+
+               }
+
+               for (var i in fieldmapper.aou.OrgCache) {
+                       var x = fieldmapper.aou.OrgCache[i].org;
+                       if (x.parent_ou() == null || x.parent_ou() == '') {
+                               fieldmapper.aou.globalOrgTree = x;
+                               continue;
+                       }
+
+                       var parent = fieldmapper.aou.findOrgUnit(x.parent_ou(),true);
+                       if (!parent.children()) parent.children([]);
+                       parent.children().push(x);
+                       fieldmapper.aou.OrgCache[x.id()].treePtr = x;
+               }
+
+               for (var i in globalOrgTypes) {
+                       fieldmapper.aout.OrgTypeCache[globalOrgTypes[i].id()] = {
+                               loaded : true,
+                               type : globalOrgTypes[i]
+                       };
+               }
+       }
+
+
+   /* ---------------------------------------------------------------------- */
+
+       fieldmapper.aou.prototype.fetchOrgSettingDefault = function (name) {
+               return this.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING, name ); 
+       }
+
+       fieldmapper.aout.findOrgType = function (id) {
+               fieldmapper.aout.LoadOrgTypes();
+               return fieldmapper.aout.OrgTypeCache[id].type;
+       }
+
+       fieldmapper.aou.prototype.findOrgDepth = function (id) {
+               if (!id) id = this.id;
+               if (!id) return null;
+
+               var org = fieldmapper.aou.findOrgUnit(id);
+               return fieldmapper.findOrgType(
+                       fieldmapper.aou.findOrgUnit(id).ou_type()
+               ).depth;
+       }
+       fieldmapper.aou.findOrgDepth = fieldmapper.aou.prototype.findOrgDepth;
+
+       fieldmapper.aout.findOrgTypeFromDepth = function (depth) {
+               if( depth == null ) return null;
+               fieldmapper.aout.LoadOrgTypes();
+               for( var i in fieldmapper.aout.OrgTypeCache ) {
+                       var t = fieldmapper.aout.OrgTypeCache[i].type;
+                       if( t.depth() == depth ) return t;
+               }
+               return null;
+       }
+
+       fieldmapper.aou.findOrgUnitSN = function (sn) {
+               var org = fieldmapper.aou.OrgCacheSN[sn];
+               if (!org) {
+                       for (var i in fieldmapper.aou.OrgCache) {
+                               var o = fieldmapper.aou.OrgCache[i];
+                               if (o.loaded && o.org.shortname() == sn) {
+                                       fieldmapper.aou.OrgCacheSN[o.org.shortname()] = o;
+                                       return o.org;
+                               }
+                       }
+
+                       org = fieldmapper.standardRequest(fieldmapper.OpenSRF.methods.FETCH_ORG_BY_SHORTNAME, sn);
+
+                       fieldmapper.aou.OrgCache[org.id()] = { loaded : true, org : org };
+                       fieldmapper.aou.OrgCacheSN[org.shortname()] = { loaded : true, org : org };
+
+               }
+
+               return org;
+       }
+
+       fieldmapper.aou.prototype.orgNodeTrail = function (node) {
+               if (!node) node = this;
+               if (!node) return [];
+
+               var na = [];
+
+               while( node ) {
+                       na.push(node);
+                       node = fieldmapper.aou.findOrgUnit(node.parent_ou());
+               }
+
+               return na.reverse();
+       }
+       fieldmapper.aou.orgNodeTrail = fieldmapper.aou.prototype.orgNodeTrail;
+
+       fieldmapper.aou.prototype.orgIsMine = function (me, org) {
+               if (this._isfieldmapper) {
+                       org = me;
+                       me = this;
+               }
+
+               if(!me || !org) return false;
+
+               if(me.id() == org.id()) return true;
+
+               for( var i in me.children() ) {
+                       if(me.children()[i].orgIsMine(org)) return true;
+               }
+               return false;
+       }
+
+       dojo.addOnUnload( function () {
+               for (var i in fieldmapper.aou.OrgCache) {
+                       x=fieldmapper.aou.OrgCache[i].treePtr;
+                       if (!x) continue;
+
+                       x.children(null);
+                       x.parent_ou(null);
+                       fieldmapper.aou.OrgCache[i]=null;
+               }
+               fieldmapper.aou.globalOrgTree = null;
+               fieldmapper.aou.OrgCache = null;
+               fieldmapper.aou.OrgCacheSN = null;
+               fieldmapper.aout.OrgTypeCache = null;
+       });
+}
+
+
+
diff --git a/Open-ILS/web/js/dojo/fieldmapper/dojoData.js b/Open-ILS/web/js/dojo/fieldmapper/dojoData.js
new file mode 100644 (file)
index 0000000..60d17e0
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+if(!dojo._hasResource['fieldmapper.dojoData']){
+
+       dojo._hasResource['fieldmapper.dojoData'] = true;
+       dojo.provide('fieldmapper.dojoData');
+       dojo.require('fieldmapper.Fieldmapper');
+       dojo.require('fieldmapper.hash');
+
+
+       function _fromStoreItem (data) {
+               this.fromHash(data);
+
+               for (var i in this._ignore_fields)
+                       this[this._ignore_fields[i]](null);
+
+               for ( var i=0; i < this._fields.length; i++) {
+                       if (dojo.isArray( this[this._fields[i]]() ))
+                               this[this._fields[i]]( this[this._fields[i]]()[0] );
+               }
+               return this;
+       }
+
+       function _toStoreData (list, label, params) {
+
+               if (!params) params = {};
+               if (!list) list = {};
+
+               // a sane default
+               if (!params.identifier) params.identifier = 'id';
+               if (!label) label = params.label;
+               if (!label) label = params.identifier;
+
+               var data = { label : label, identifier : params.identifier, items : [] };
+
+               for (var i in list) data.items.push( list[i].toHash() );
+
+               if (params.children && params.parent) {
+                       var _hash_list = data.items;
+
+                       var _find_root = {};
+                       for (var i in _hash_list) {
+                               _find_root[_hash_list[i][params.identifier]] = _hash_list[i]; 
+                       }
+
+                       var item_data = [];
+                       for (var i in _hash_list) {
+                               var obj = _hash_list[i]
+                               obj[params.children] = [];
+
+                               for (var j in _hash_list) {
+                                       var kid = _hash_list[j];
+                                       if (kid[params.parent] == obj[params.identifier]) {
+                                               obj[params.children].push( { _reference : kid[params.identifier] } );
+                                               kid._iskid = true;
+                                               if (_find_root[kid[params.identifier]]) delete _find_root[kid[params.identifier]];
+                                       }
+                               }
+
+                               item_data.push( obj );
+                       }
+
+                       for (var j in _find_root) {
+                               _find_root[j]['_top'] = 'true';
+                               if (!_find_root[j][params.parent])
+                                       _find_root[j]['_trueRoot'] = 'true';
+                       }
+
+                       data.items = item_data;
+               }
+
+               return data;
+       }
+
+       for (var i in fmclasses) fieldmapper[i].prototype.fromStoreItem = _fromStoreItem;
+       for (var i in fmclasses) fieldmapper[i].toStoreData = _toStoreData;
+
+       fieldmapper.aou.prototype._ignore_fields = ['children'];
+       fieldmapper.aout.prototype._ignore_fields = ['children'];
+       fieldmapper.pgt.prototype._ignore_fields = ['children'];
+
+       fieldmapper.aou.toStoreData = function (list, label) {
+               if (!label) label = 'shortname';
+               return _toStoreData(list, label, { 'parent' : 'parent_ou', 'children' : 'children' });
+       }
+
+       fieldmapper.aout.toStoreData = function (list, label) {
+               if (!label) label = 'name';
+               return _toStoreData(list, label, { 'parent' : 'parent', 'children' : 'children' });
+       }
+
+       fieldmapper.pgt.toStoreData = function (list, label) {
+               if (!label) label = 'name';
+               return _toStoreData(list, label, { 'parent' : 'parent', 'children' : 'children' });
+       }
+
+       /*
+       ppl.toStoreData = function (list, label) {
+               if (!label) label = 'code';
+               return _toStoreData(list, label, {});
+       }
+       */
+
+}
diff --git a/Open-ILS/web/js/dojo/fieldmapper/hash.js b/Open-ILS/web/js/dojo/fieldmapper/hash.js
new file mode 100644 (file)
index 0000000..c186dfa
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+# ---------------------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
+# Mike Rylander <miker@esilibrary.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.
+# ---------------------------------------------------------------------------
+*/
+
+if(!dojo._hasResource['fieldmapper.hash']){
+
+       dojo._hasResource['fieldmapper.hash'] = true;
+       dojo.provide('fieldmapper.hash');
+       dojo.require('fieldmapper.Fieldmapper');
+
+       function _fromHash (_hash) {
+               for ( var i=0; i < this._fields.length; i++) {
+                       if (_hash[this._fields[i]] != null)
+                               this[this._fields[i]]( _hash[this._fields[i]] );
+               }
+               return this;
+       }
+
+       function _toHash () {
+               var _hash = {};
+               for ( var i=0; i < this._fields.length; i++) {
+                       if (this[this._fields[i]]() != null)
+                               _hash[this._fields[i]] = '' + this[this._fields[i]]();
+               }
+               return _hash;
+       }
+
+       for (var i in fmclasses) {
+               window[i].prototype.fromHash = _fromHash;
+               window[i].prototype.toHash = _toHash;
+       }
+
+}
diff --git a/Open-ILS/web/js/dojo/openils/Event.js b/Open-ILS/web/js/dojo/openils/Event.js
new file mode 100644 (file)
index 0000000..bc82634
--- /dev/null
@@ -0,0 +1,62 @@
+/* ---------------------------------------------------------------------------
+ * Copyright (C) 2008  Georgia Public Library Service
+ * Bill Erickson <erickson@esilibrary.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.
+ * ---------------------------------------------------------------------------
+ */
+
+if(!dojo._hasResource["openils.Event"]) {
+
+    dojo._hasResource["openils.Event"] = true;
+    dojo.provide("openils.Event");
+    dojo.declare('openils.Event', null, {
+
+        constructor : function(kwargs) {
+            this.code = kwargs.ilsevent;
+            this.textcode = kwargs.textcode;
+            this.desc = kwargs.desc;
+            this.payload = kwargs.payload;
+            this.debug = kwargs.stacktrace;
+            this.servertime = kwargs.servertime;
+            this.ilsperm = kwargs.ilsperm;
+            this.ilspermloc = kwargs.ilspermloc;
+        },
+
+        toString : function() {
+            var s = 'Event: ' + this.code + ':' + this.textcode + ' -> ' + new String(this.desc);
+            if(this.ilsperm)
+                s += ' ' + this.ilsperm + '@' + this.ilspermloc;
+            return s;
+        }
+    });
+
+    /**
+     * Parses a proposed event object.  If this object is an
+     * event, a new openils.Event is returned.  Otherwise,
+     * null is returned
+     */
+    openils.Event.parse = function(evt) {
+        if(evt && typeof evt == 'object' && 'ilsevent' in evt && 'textcode' in evt)
+            return new openils.Event(evt);
+        return null;
+    }
+
+    /**
+     * If the provided object is a non-success event, the
+     * event is thrown as an exception.
+     */
+    openils.Event.parse_and_raise = function(evt) {
+        var e = openils.Event.parse(evt);
+        if(e && e.ilsevent != 0)    
+            throw e;
+    }
+}
diff --git a/Open-ILS/web/js/dojo/openils/I18N.js b/Open-ILS/web/js/dojo/openils/I18N.js
new file mode 100644 (file)
index 0000000..a99fa41
--- /dev/null
@@ -0,0 +1,260 @@
+/* ---------------------------------------------------------------------------
+ * Copyright (C) 2008  Georgia Public Library Service
+ * Copyright (C) 2008  Equinox Software, Inc
+ * Mike Rylander <miker@esilibrary.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.
+ * ---------------------------------------------------------------------------
+ */
+
+if(!dojo._hasResource["openils.I18N"]) {
+
+    dojo._hasResource["openils.I18N"] = true;
+    dojo.provide("openils.I18N");
+    dojo.require("fieldmapper.dojoData");
+    dojo.require("DojoSRF");
+       dojo.require("dojo.data.ItemFileWriteStore");
+       dojo.require("dijit._Widget");
+       dojo.require("dijit._Templated");
+       dojo.require("dijit.layout.ContentPane");
+       dojo.require("dijit.Dialog");
+       dojo.require("dijit.form.Button");
+       dojo.require("dijit.form.TextBox");
+       dojo.require("dijit.form.ComboBox");
+
+
+    dojo.declare('openils.I18N', null, {});
+
+    openils.I18N.BaseLocales = {
+               "en" : "English",
+               "en_us" : "US English",
+               "en_ca" : "Canadian English",
+               "es" : "Spanish",
+               "es_us" : "US Spanish",
+               "fr" : "French",
+               "fr_ca" : "Canadian French"
+       };
+
+       openils.I18N.localeStore = new dojo.data.ItemFileWriteStore( { data : {identifier : 'locale', label : 'label', items : [] } } );
+
+       for (var i in openils.I18N.BaseLocales) {
+               openils.I18N.localeStore.newItem({ locale : i, label : openils.I18N.BaseLocales[i] });
+       }
+
+       openils.I18N.getTranslations = function ( obj /* Fieldmapper object */,  field /* Field to translate */, locale /* optional locale */) {
+               var classname = obj.classname;
+
+               // XXX need to derive identity field from IDL...
+               var ident_field = fieldmapper[classname].Identifier || 'id';
+               var ident_value = obj[ident_field]();
+
+               var fielder_args = { query : { fq_field : classname + '.' + field, identity_value : ident_value } };
+               if (locale) fielder_args.translation = locale;
+
+               var hash_list = fieldmapper.standardRequest( [ 'open-ils.fielder', 'open-ils.fielder.i18n.atomic'], [ fielder_args ] );
+               var obj_list = dojo.map( hash_list, function (t) { return new fieldmapper.i18n().fromHash( t ) } );
+
+               if (locale) return obj_list[0];
+               return obj_list;
+       }
+
+//----------------------------------------------------------------
+
+    dojo.declare(
+               'openils.I18N.translationWidget',
+               [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.I18N.translationWidget.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>",
+
+                       widgetsInTemplate: true,
+                       field : "",
+                       targetObject : "",
+                       unique : ""
+               }
+       );
+
+       openils.I18N.translationWidget.renderTranslationPopup = function (obj, field, num) {
+               var node = dojo.byId(field + '_translation_' + num);
+
+               var trans_list = openils.I18N.getTranslations( obj, 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 :
+                                       (function (trans_id, obj, field) {
+                                               return function () { openils.I18N.translationWidget.updateTranslation(trans_id, obj, field, num) }
+                                       })(trans_id, obj, field) 
+                               }
+                       );
+
+                       dojo.query('.delete_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
+                               dijit.form.Button,
+                               { onClick :
+                                       (function (trans_id, obj, field) {
+                                               return function () { openils.I18N.translationWidget.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();
+
+               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.I18N.translationWidget.createTranslation( obj, field, num) } }
+               );
+
+               trans_tbody.appendChild( trans_row );
+       }
+
+       openils.I18N.translationWidget.updateTranslation = function (trans_id, obj, field, num) {
+               return openils.I18N.translationWidget.changeTranslation('update', trans_id, obj, field, num);
+       }
+       
+       openils.I18N.translationWidget.removeTranslation = function (trans_id, obj, field, num) {
+               return openils.I18N.translationWidget.changeTranslation('delete', trans_id, obj, field, num);
+       }
+       
+       openils.I18N.translationWidget.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.I18N.translationWidget.writeTranslation(method, trans_obj, obj, field, num);
+       }
+       
+       openils.I18N.translationWidget.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.I18N.translationWidget.writeTranslation('create', trans_obj, obj, field, num);
+       }
+       
+       openils.I18N.translationWidget.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.I18N.translationWidget.renderTranslationPopup(obj, field, num);
+                                       }
+       
+                               } else {
+                                       //highlighter.editor_pane.red.play();
+                                       if (status_update) status_update( 'Problem saving translation for ' + obj[field]() );
+                               }
+                       },
+               }).send();
+       }
+
+}
+
+
diff --git a/Open-ILS/web/js/dojo/openils/User.js b/Open-ILS/web/js/dojo/openils/User.js
new file mode 100644 (file)
index 0000000..cbc2f19
--- /dev/null
@@ -0,0 +1,114 @@
+/* ---------------------------------------------------------------------------
+ * Copyright (C) 2008  Georgia Public Library Service
+ * Bill Erickson <erickson@esilibrary.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.
+ * ---------------------------------------------------------------------------
+ */
+
+if(!dojo._hasResource["openils.User"]) {
+
+    dojo._hasResource["openils.User"] = true;
+    dojo.provide("openils.User");
+    dojo.require('openils.Event');
+    dojo.require('DojoSRF');
+
+    dojo.declare('openils.User', null, {});
+
+    openils.User.user = null;
+    openils.User.authtoken = null;
+    openils.User.authtime = null;
+
+    var ses = new OpenSRF.ClientSession('open-ils.auth');
+
+    openils.User.getBySession = function(onComplete) {
+        var req = ses.request('open-ils.auth.session.retrieve', openils.User.authtoken);
+        if(onComplete) {
+            req.oncomplete = function(r) {
+                var user = r.recv().content();
+                openils.User.user = user;
+                if(onComplete)
+                    onComplete(user);
+            }
+            req.send();
+        } else {
+            req.timeout = 10;
+            req.send();
+            return openils.User.user = req.recv().content();
+        }
+    }
+
+    openils.User.getById = function(id, onComplete) {
+        var ases = new OpenSRF.ClientSession('open-ils.actor');
+        var req = ases.request('open-ils.actor.user.retrieve', openils.User.authtoken, id);
+        if(onComplete) {
+            req.oncomplete = function(r) {
+                var user = r.recv().content();
+                onComplete(user);
+            }
+            req.send();
+        } else {
+            req.timeout = 10;
+            req.send();
+            return req.recv().content();
+        }
+    }
+
+
+    /**
+     * Logs in, sets the authtoken/authtime vars, and fetches the logged in user
+     */
+    openils.User.login = function(args, onComplete) {
+        var initReq = ses.request('open-ils.auth.authenticate.init', args.username);
+
+        initReq.oncomplete = function(r) {
+            var seed = r.recv().content(); 
+            alert(seed);
+            var loginInfo = {
+                password : hex_md5(seed + hex_md5(args.passwd)), 
+                type : args.type || 'opac',
+                org : args.location,
+            };
+
+            var authReq = ses.request('open-ils.auth.authenticate.complete', loginInfo);
+            authReq.oncomplete = function(rr) {
+                var data = rr.recv().content();
+                openils.User.authtoken = data.payload.authtoken;
+                openils.User.authtime = data.payload.authtime;
+                openils.User.getBySession(onComplete);
+            }
+            authReq.send();
+        }
+
+        initReq.send();
+    }
+
+    /**
+     * Returns a list of the "highest" org units where the user
+     * has the given permission.
+     */
+    openils.User.getPermOrgList = function(perm, onload) {
+
+        var ases = new OpenSRF.ClientSession('open-ils.actor');
+        var req = ases.request(
+            'open-ils.actor.user.work_perm.highest_org_set',
+            openils.User.authtoken, perm);
+
+        req.oncomplete = function(r) {
+            org_list = r.recv().content();
+            onload(org_list);
+        }
+
+        req.send();
+    }
+}
+
+
index 1249948..accdcd6 100644 (file)
@@ -9,6 +9,7 @@ var DO_AUTHORITY_LOOKUPS = true;
 var PARAM_TERM                 = "t";                  /* search term */
 var PARAM_STYPE                = "tp";                 /* search type */
 var PARAM_LOCATION     = "l";                  /* current location */
+var PARAM_LASSO        = "sg";                 /* current location */
 var PARAM_DEPTH                = "d";                  /* search depth */
 var PARAM_FORM                 = "f";                  /* search format */
 var PARAM_OFFSET               = "o";                  /* search offset */
@@ -29,6 +30,7 @@ var PARAM_CN                  = "cn";
 var PARAM_LITFORM              = 'lf';
 var PARAM_ITEMFORM     = 'if';
 var PARAM_ITEMTYPE     = 'it';
+var PARAM_BIBLEVEL     = 'bl';
 var PARAM_AUDIENCE     = 'a';
 var PARAM_SEARCHES     = 'ss';
 var PARAM_LANGUAGE     = 'la';
@@ -41,6 +43,7 @@ var PARAM_AVAIL     = 'av'; /* limit search results to available items */
 var TERM;  
 var STYPE;  
 var LOCATION;  
+var LASSO;  
 var DEPTH;  
 var FORM; 
 var OFFSET;
@@ -63,6 +66,7 @@ var CALLNUM;
 var LITFORM;
 var ITEMFORM;
 var ITEMTYPE;
+var BIBLEVEL;
 var AUDIENCE;
 var SEARCHES;
 var LANGUAGE;
@@ -338,6 +342,7 @@ var FETCH_COPY_STAT_CATS            = 'open-ils.circ:open-ils.circ.asset.stat_cat_entries.
 var FETCH_LIT_FORMS                            = 'open-ils.search:open-ils.search.biblio.lit_form_map.retrieve.all';
 var FETCH_ITEM_FORMS                           = 'open-ils.search:open-ils.search.biblio.item_form_map.retrieve.all';
 var FETCH_ITEM_TYPES                           = 'open-ils.search:open-ils.search.biblio.item_type_map.retrieve.all';
+var FETCH_BIB_LEVELS                           = 'open-ils.search:open-ils.search.biblio.bib_level_map.retrieve.all';
 var FETCH_AUDIENCES                            = 'open-ils.search:open-ils.search.biblio.audience_map.retrieve.all';
 var FETCH_HOLD_STATUS                  = 'open-ils.circ:open-ils.circ.hold.status.retrieve';
 var FETCH_NON_CAT_CIRCS                        = 'open-ils.circ:open-ils.circ.open_non_cataloged_circulation.user';
index 96b2e72..9ad1ed8 100644 (file)
@@ -36,17 +36,22 @@ function init() {
                        var org = G.user.prefs[PREF_DEF_LOCATION];
                        var depth = G.user.prefs[PREF_DEF_DEPTH];
 
-                       if(!org) org = G.user.ws_ou();
-                       if(!depth) depth = findOrgDepth(org);
+                       if(org == null) org = G.user.ws_ou();
+                       if(depth == null) depth = findOrgDepth(org);
 
                        LOCATION = org;
-                       DEPTH = DEPTH;
+                       DEPTH = depth;
                }
        }
 
        runEvt("common", "run");
        //checkUserSkin();
-       G.ui.common.now_searching.appendChild(text(findOrgUnit(getLocation()).name()));
+
+       var loc = findOrgLasso(getLasso());
+       if (!loc) loc = findOrgUnit(getLocation());
+
+       if (getLasso()) G.ui.common.now_searching.appendChild(text('Search group: '));
+       G.ui.common.now_searching.appendChild(text(loc.name()));
 }
 
 function windowUnload() { runEvt("common", "unload"); }
index fd50eba..c730e50 100644 (file)
@@ -109,11 +109,22 @@ function initParams() {
        /* handle the location var */
        var org;
        var loc = cgi.param(PARAM_LOCATION);
-       if( loc ) {
+       var lasso = cgi.param(PARAM_LASSO);
+
+    if ( lasso ) {
+               lasso = findOrgLasso( lasso );
+               LASSO = lasso ? lasso.id() : null;
+       }
+
+    if (loc) {
                org = findOrgUnit(loc);
-               if(!org) org = findOrgUnitSN(loc);
-       } 
-       LOCATION        = (org) ? org.id() : null;
+               LOCATION = org ? org.id() : null;
+
+               if ( !LOCATION ){
+                       org = findOrgUnit(loc);
+                       LOCATION = org ? org.id() : null;
+               }
+    }
 
        org = null;
        loc = cgi.param(PARAM_ORIGLOC);
@@ -148,6 +159,7 @@ function initParams() {
        LITFORM = cgi.param(PARAM_LITFORM);
        ITEMFORM        = cgi.param(PARAM_ITEMFORM);
        ITEMTYPE        = cgi.param(PARAM_ITEMTYPE);
+       BIBLEVEL        = cgi.param(PARAM_BIBLEVEL);
        AUDIENCE        = cgi.param(PARAM_AUDIENCE);
        SEARCHES = cgi.param(PARAM_SEARCHES);
        LANGUAGE        = cgi.param(PARAM_LANGUAGE);
@@ -187,6 +199,7 @@ function clearSearchParams() {
        LITFORM     = null;
        ITEMFORM    = null;
        ITEMTYPE    = null;
+       BIBLEVEL    = null;
        AUDIENCE    = null;
        SEARCHES    = null;
        LANGUAGE    = null;
@@ -211,6 +224,7 @@ function initCookies() {
 function getTerm(){return TERM;}
 function getStype(){return STYPE;}
 function getLocation(){return LOCATION;}
+function getLasso(){return LASSO;}
 function getDepth(){return DEPTH;}
 function getForm(){return FORM;}
 function getTform(){return TFORM;}
@@ -234,6 +248,7 @@ function getCallnumber() { return CALLNUM; }
 function getLitForm() { return LITFORM; }
 function getItemForm() { return ITEMFORM; }
 function getItemType() { return ITEMTYPE; }
+function getBibLevel() { return BIBLEVEL; }
 function getAudience() { return AUDIENCE; }
 function getSearches() { return SEARCHES; }
 function getLanguage() { return LANGUAGE; }
@@ -343,6 +358,8 @@ function  buildOPACLink(args, slim, ssl) {
                string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
        if(getLocation() != 1) 
                string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
+       if(getLasso() != null) 
+               string += _appendParam(LASSO, PARAM_LASSO, args, getLasso, string);
        if(getDepth() != null) 
                string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
        if(getForm() && (getForm() != 'all') ) 
@@ -371,6 +388,8 @@ function  buildOPACLink(args, slim, ssl) {
                string += _appendParam(ITEMFORM,        PARAM_ITEMFORM, args, getItemForm, string);
        if(getItemType())
                string += _appendParam(ITEMTYPE,        PARAM_ITEMTYPE, args, getItemType, string);
+       if(getBibLevel())
+               string += _appendParam(BIBLEVEL,        PARAM_BIBLEVEL, args, getBibLevel, string);
        if(getLitForm())
                string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
        if(getAudience())
@@ -695,7 +714,7 @@ function doLogin(suppressEvents) {
        return u;
 }
 
-function doLogout(noredirect) {
+function doLogout() {
 
        /* cancel everything else */
        abortAllRequests();
@@ -771,8 +790,12 @@ function orgSelect(id) {
        showCanvas();
        runEvt("common", "locationChanged", id, findOrgDepth(id) );
 
+
+       var loc = findOrgLasso(getLasso());
+       if (!loc) loc = findOrgUnit(id);
+
        removeChildren(G.ui.common.now_searching);
-       G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
+       G.ui.common.now_searching.appendChild(text(loc.name()));
 }
 
 function setFontSize(size) {
index 4fcd742..2acf826 100644 (file)
@@ -6,7 +6,7 @@ function fetchOrgSettingDefault(orgId, name) {
     var req = new Request(FETCH_ORG_SETTING, orgId, name);
     req.send(true);
     var res = req.result();
-    return res.value;
+    return (res) ? res.value : null;
 }
 
 
@@ -47,6 +47,14 @@ function findOrgUnit(org_id) {
        return (typeof org_id == 'object') ? org_id : orgArraySearcher[org_id];
 }
 
+function findOrgLasso(lasso_id) {
+       if (typeof lasso_id == 'object') return lasso_id;
+    for (var i in _lasso) {
+        if (_lasso[i].id() == lasso_id) return _lasso[i];
+    }
+    return null;
+}
+
 var orgArraySearcherSN = {};
 function findOrgUnitSN(shortname) {
        if (typeof shortname == 'object') return shortname;
index 66cb824..9cc06f5 100644 (file)
@@ -96,7 +96,7 @@
                                <tr class="bluerow">
                                        <td>
                                                <div class='search_field'>
-                                                       <span>&slimpac.search.nowSearching;</span>
+                                                       <span>&slimpac.start.nowSearching;</span>
                                                        <select name="searchOrg">
                                                                <!--#include file="lib_list.inc" -->
                                                        </select>
index 4f8d9cb..ef0a5ed 100644 (file)
@@ -5,6 +5,7 @@
 <!ENTITY common.check_date.description "Check today's date above.">
 <!ENTITY common.check_barcode.description "Check barcode?">
 <!ENTITY common.date_helper 'or choose one of these'>
+<!ENTITY common.date_helper.normal 'Normal'>
 <!ENTITY common.date_helper.3_days 'Today + 3 days'>
 <!ENTITY common.date_helper.7_days 'Today + 7 days'>
 <!ENTITY common.date_helper.14_days 'Today + 14 days'>
@@ -39,6 +40,7 @@
 <!ENTITY common.username "Username">
 <!ENTITY common.username.label "Username:">
 <!ENTITY common.password "Password">
+<!ENTITY common.refresh "Refresh">
 <!ENTITY common.submit "Submit">
 <!ENTITY common.user_not_found "User not found">
 <!ENTITY common.unimplemented 'Not Yet Implemented'>
 <!ENTITY staff.patron_navbar.info.accesskey 'o'>
 <!ENTITY staff.patron_navbar.items 'Items Out'>
 <!ENTITY staff.patron_navbar.items.accesskey 'I'>
+<!ENTITY staff.patron_navbar.items.problem_items.caption 'Lost / Claimed Returned / Long Overdue / Has Unpaid Billings'>
 <!ENTITY staff.patron_navbar.refresh 'Refresh'>
 <!ENTITY staff.patron_navbar.refresh.accesskey 'R'>
 <!ENTITY staff.patron_navbar.retrieve 'Retrieve Patron'>
 <!ENTITY staff.z39_50.search_class.tcn "Accession #">
 <!ENTITY staff.z39_50.search_class.title "Title">
 <!ENTITY staff.z39_50_import_interface_label "Z39.50 IMPORT">
+<!ENTITY staff.server.admin.offline.xacts.caption "Offline Sessions">
+<!ENTITY staff.server.admin.offline.xacts.refresh.accesskey "R">
+<!ENTITY staff.server.admin.offline.xacts.create.label "Create">
+<!ENTITY staff.server.admin.offline.xacts.execute.label "Process">
+<!ENTITY staff.server.admin.offline.xacts.update.label "Update">
+<!ENTITY staff.server.admin.offline.xacts.status.label "Uploaded Transaction Files">
+<!ENTITY staff.server.admin.offline.xacts.status.desc "The transactions from the following workstations have been uploaded, but not processed.  When all expected workstations are present here, use the Process button above.">
+<!ENTITY staff.server.admin.offline.xacts.errors.label "Exceptions">
+<!ENTITY staff.server.admin.offline.xacts.errors.desc "All transactions from this session have been processed.  The errors, if any, are listed below.">
+<!ENTITY staff.server.admin.offline.xacts.export.label "Export List">
+<!ENTITY staff.server.admin.offline.xacts.print.label "Print Export">
+<!ENTITY staff.server.admin.offline.xacts.get_item.label "Retrieve Item">
+<!ENTITY staff.server.admin.offline.xacts.get_patron.label "Retrieve Patron">
+<!ENTITY staff.server.admin.offline.xacts.get_details.label "Details">
+<!ENTITY staff.server.admin.offline.xacts.errors.caption "The session is now processing.  Hit Refresh to check its status.">
+<!ENTITY staff.server.admin.font.sound.caption "Adjust Sound">
+<!ENTITY staff.server.admin.font.sound.checkbox "Disable sound?">
+<!ENTITY staff.server.admin.save_disk "Save to Disk">
+<!ENTITY staff.server.admin.font.global.caption "Adjust Global Font">
+<!ENTITY staff.server.admin.font.smaller "Smaller than Default">
+<!ENTITY staff.server.admin.font.default "Default">
+<!ENTITY staff.server.admin.font.larger "Larger than Default">
+<!ENTITY staff.server.admin.font.xxsmall "XX-Small">
+<!ENTITY staff.server.admin.font.xsmall "X-Small">
+<!ENTITY staff.server.admin.font.small "Small">
+<!ENTITY staff.server.admin.font.medium "Medium">
+<!ENTITY staff.server.admin.font.large "Large">
+<!ENTITY staff.server.admin.font.xlarge "X-Large">
+<!ENTITY staff.server.admin.font.xxlarge "XX-Large">
+<!ENTITY staff.server.admin.font.5pt "5pt">
+<!ENTITY staff.server.admin.font.6pt "6pt">
+<!ENTITY staff.server.admin.font.7pt "7pt">
+<!ENTITY staff.server.admin.font.8pt "8pt">
+<!ENTITY staff.server.admin.font.9pt "9pt">
+<!ENTITY staff.server.admin.font.10pt "10pt">
+<!ENTITY staff.server.admin.font.11pt "11pt">
+<!ENTITY staff.server.admin.font.12pt "12pt">
+<!ENTITY staff.server.admin.font.13pt "13pt">
+<!ENTITY staff.server.admin.font.14pt "14pt">
+<!ENTITY staff.server.admin.font.15pt "15pt">
+<!ENTITY staff.server.admin.font.16pt "16pt">
+<!ENTITY staff.server.admin.font.17pt "17pt">
+<!ENTITY staff.server.admin.font.18pt "18pt">
+<!ENTITY staff.server.admin.font.restore "Restore Default">
+<!ENTITY staff.server.admin.font.restore "Restore Default">
+<!ENTITY staff.server.admin.transit.filter.caption "Transit Filter">
+<!ENTITY staff.server.admin.transit.library.label "Transit Library">
+<!ENTITY staff.server.admin.transit.to.label "Transit to">
+<!ENTITY staff.server.admin.transit.from.label "Transit from">
+<!ENTITY staff.server.admin.transit.date.label "Transit Date falls between">
+<!ENTITY staff.server.admin.transit.date.today "Today">
+<!ENTITY staff.server.admin.transit.date.week "Today - 7 days">
+<!ENTITY staff.server.admin.transit.date.2weeks "Today - 14 days">
+<!ENTITY staff.server.admin.transit.date.3weeks "Today - 21 days">
+<!ENTITY staff.server.admin.transit.date.30days "Today - 30 days">
+<!ENTITY staff.server.admin.transit.date.start "The Beginning">
+<!ENTITY staff.server.admin.transit.retrieve.label "Retrieve Transits">
+<!ENTITY staff.server.admin.transit.retrieve.accesskey "T">
+<!ENTITY staff.server.admin.transit.list.label "Transits">
+<!ENTITY staff.server.admin.transit.list.print "Print Transits">
+<!ENTITY staff.server.admin.transit.list.actions "Actions for Selected Transits">
+<!ENTITY staff.server.admin.transit.list.actions.accesskey "S">
+<!ENTITY staff.server.admin.transit.list.copy.label "Copy to Clipboard">
+<!ENTITY staff.server.admin.transit.list.copy.accesskey "C">
+<!ENTITY staff.server.admin.transit.list.add.label "Add to Item Bucket">
+<!ENTITY staff.server.admin.transit.list.add.accesskey "A">
+<!ENTITY staff.server.admin.transit.list.show.label "Show in Catalog">
+<!ENTITY staff.server.admin.transit.list.show.accesskey "S">
+<!ENTITY staff.server.admin.transit.list.details.label "Show Item Details">
+<!ENTITY staff.server.admin.transit.list.details.accesskey "I">
+<!ENTITY staff.server.admin.transit.list.circs.label "Show Last Few Circulations">
+<!ENTITY staff.server.admin.transit.list.circs.accesskey "L">
+<!ENTITY staff.server.admin.transit.list.edit.label "Edit Item Attributes">
+<!ENTITY staff.server.admin.transit.list.edit.accesskey "E">
+<!ENTITY staff.server.admin.transit.list.abort.label "Abort Transits">
+<!ENTITY staff.server.admin.transit.list.save.label "Save Columns">
+<!ENTITY staff.server.admin.cash.title "Evergreen: Cash Reports">
+<!ENTITY staff.server.admin.cash.welcome "Welcome ">
+<!ENTITY staff.server.admin.cash.start_date "Start Date:">
+<!ENTITY staff.server.admin.cash.date.select "Date selector">
+<!ENTITY staff.server.admin.cash.end_date "End Date:">
+<!ENTITY staff.server.admin.cash.date_format "(YYYY-MM-DD)">
+<!ENTITY staff.server.admin.cash.view "View reports for : ">
+<!ENTITY staff.server.admin.cash.submit "Go!">
+<!ENTITY staff.server.admin.cash.desk "Desk Payments">
+<!ENTITY staff.server.admin.cash.user "User Payments">
+<!ENTITY staff.server.admin.closed_dates.title "Evergreen: Library Closed Dates Editor">
+<!ENTITY staff.server.admin.closed_dates.welcome "Welcome ">
+<!ENTITY staff.server.admin.closed_dates.editor.title " Closed Dates Editor ">
+<!ENTITY staff.server.admin.closed_dates.editor.for "Edit Closed Dates for: ">
+<!ENTITY staff.server.admin.closed_dates.editor.duration "Closed Duration">
+<!ENTITY staff.server.admin.closed_dates.editor.reason "Reason for Closing">
+<!ENTITY staff.server.admin.closed_dates.editor.delete "Delete">
+<!ENTITY staff.server.admin.closed_dates.editor.allmultiday.delete "delete">
+<!-- Translators: do not translate "<b>YYYY-MM-DD</b>" or "<b>HH:MM</b>" -->
+<!ENTITY staff.server.admin.closed_dates.editor.allmultiday.format "Note: All dates must have the form <b>YYYY-MM-DD</b>.  Times must have the form <b>HH:MM</b>">
+<!ENTITY staff.server.admin.closed_dates.add.allday "Add Single Day Closing">
+<!ENTITY staff.server.admin.closed_dates.add.multiday "Add Multiple Date Closing">
+<!ENTITY staff.server.admin.closed_dates.add.detailed "Add Detailed Closing">
+<!ENTITY staff.server.admin.closed_dates.date.start "Start Date">
+<!ENTITY staff.server.admin.closed_dates.time.start "Start Time">
+<!ENTITY staff.server.admin.closed_dates.date.end "End Date">
+<!ENTITY staff.server.admin.closed_dates.time.end "End Time">
+<!ENTITY staff.server.admin.closed_dates.allday.label "All Day">
+<!ENTITY staff.server.admin.closed_dates.editor.reason.label "Reason for closing: ">
+<!ENTITY staff.server.admin.closed_dates.apply_all "Apply to all of my libraries">
+<!ENTITY staff.server.admin.closed_dates.save "Save">
+<!ENTITY staff.server.admin.closed_dates.cancel "Cancel">
+<!ENTITY staff.server.admin.closed_dates.confirm_delete "Are you sure you wish to delete the selected close date?">
+<!ENTITY staff.server.admin.closed_dates.date.invalid "Invalid date format">
+<!ENTITY staff.server.admin.closed_dates.time.invalid "Invalid time format">
+<!ENTITY staff.server.admin.closed_dates.success "Closed date successfully updated">
+<!ENTITY staff.server.admin.copy_locations.title "Evergreen: Copy Locations Editor">
+<!ENTITY staff.server.admin.copy_locations.editor " Copy Locations Editor ">
+<!ENTITY staff.server.admin.copy_locations.editor.create "Create a new copy location">
+<!ENTITY staff.server.admin.copy_locations.editor.name "Name: ">
+<!ENTITY staff.server.admin.copy_locations.editor.holdable.label "Holdable: ">
+<!ENTITY staff.server.admin.copy_locations.editor.yes "Yes">
+<!ENTITY staff.server.admin.copy_locations.editor.no "No">
+<!ENTITY staff.server.admin.copy_locations.editor.opac_visible.label "OPAC Visible: ">
+<!ENTITY staff.server.admin.copy_locations.editor.circulate.label "Circulate: ">
+<!ENTITY staff.server.admin.copy_locations.editor.library.label "Owning Library:">
+<!ENTITY staff.server.admin.copy_locations.editor.name "Name">
+<!ENTITY staff.server.admin.copy_locations.editor.library "Owning Library">
+<!ENTITY staff.server.admin.copy_locations.editor.holdable "Holdable">
+<!ENTITY staff.server.admin.copy_locations.editor.help "Help">
+<!ENTITY staff.server.admin.copy_locations.editor.opac_visible "OPAC Visible">
+<!ENTITY staff.server.admin.copy_locations.editor.circulate "Circulate">
+<!ENTITY staff.server.admin.copy_locations.editor.edit "Edit">
+<!ENTITY staff.server.admin.copy_locations.editor.delete "Delete">
+<!ENTITY staff.server.admin.copy_locations.editor.help.holdable "If a copy location is 'Holdable', copies in that location may have holds placed on them.">
+<!ENTITY staff.server.admin.copy_locations.editor.delete.confirm "Are you sure you wish to delete the selected copy location?  Note: If copies are currently attached to this location, the delete operation will fail.">
+<!ENTITY staff.server.admin.copy_locations.submit "Submit">
+<!ENTITY staff.server.admin.copy_locations.cancel "Cancel">
+<!ENTITY staff.server.admin.copy_locations.update_success "Update Succeeded">
+<!ENTITY staff.server.admin.hold_pull.title "Evergreen Holds Pull List">
+<!-- This will be followed by the org_unit name -->
+<!ENTITY staff.server.admin.hold_pull.header "Evergreen Holds Pull List : ">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.hold_pull.greeting "Welcome ">
+<!ENTITY staff.server.admin.hold_pull.sort.note "Note: Click on a column header to sort the column">
+<!ENTITY staff.server.admin.hold_pull.title "Title">
+<!ENTITY staff.server.admin.hold_pull.author "Author">
+<!ENTITY staff.server.admin.hold_pull.copy_location "Copy Location">
+<!ENTITY staff.server.admin.hold_pull.call_number "Call Number">
+<!ENTITY staff.server.admin.hold_pull.barcode "Item Barcode">
+<!ENTITY staff.server.admin.hold_pull.copy "Copy Number">
+<!ENTITY staff.server.admin.hold_pull.format "Format">
+<!ENTITY staff.server.admin.hold_pull.patron_barcode "Patron Barcode">
+<!ENTITY staff.server.admin.hold_pull.hold_date "Hold Placement Date">
+<!ENTITY staff.server.admin.hold_pull.hold_type "Hold Type">
+<!ENTITY staff.server.admin.hold_pull.book "Book">
+<!ENTITY staff.server.admin.hold_pull.large_book "Large Print Book">
+<!ENTITY staff.server.admin.hold_pull.audiobook "Audiobook">
+<!ENTITY staff.server.admin.hold_pull.video "Video Recording">
+<!ENTITY staff.server.admin.hold_pull.music "Music">
+<!ENTITY staff.server.admin.hold_pull.eresource "Electronic Resource">
+<!ENTITY staff.server.admin.hold_pull.copy_hold "Copy Hold">
+<!ENTITY staff.server.admin.hold_pull.volume_hold "Volume Hold">
+<!ENTITY staff.server.admin.hold_pull.title_hold "Title Hold">
+<!ENTITY staff.server.admin.hold_pull.metarecord_hold "Metarecord Hold">
+<!ENTITY staff.server.admin.non_cat_types.title "Evergreen: Non Cataloged Types Editor">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.non_cat_types.greeting "Welcome ">
+<!ENTITY staff.server.admin.non_cat_types.editor.title " Non Cataloged Types Editor ">
+<!ENTITY staff.server.admin.non_cat_types.editor.header "Create a new non-cataloged type">
+<!ENTITY staff.server.admin.non_cat_types.editor.minutes "Minutes">
+<!ENTITY staff.server.admin.non_cat_types.editor.hours "Hours">
+<!ENTITY staff.server.admin.non_cat_types.editor.days "Days">
+<!ENTITY staff.server.admin.non_cat_types.editor.weeks "Weeks">
+<!ENTITY staff.server.admin.non_cat_types.editor.months "Months">
+<!ENTITY staff.server.admin.non_cat_types.in_house_circ "Circulate In-House?">
+<!ENTITY staff.server.admin.non_cat_types.in_house_circ "Help">
+<!ENTITY staff.server.admin.non_cat_types.editor.create "Create">
+<!ENTITY staff.server.admin.non_cat_types.name "Name">
+<!ENTITY staff.server.admin.non_cat_types.owning_location "Owning Location">
+<!ENTITY staff.server.admin.non_cat_types.duration "Duration">
+<!ENTITY staff.server.admin.non_cat_types.in_house.circulate "Circulate In House">
+<!ENTITY staff.server.admin.non_cat_types.edit "Edit">
+<!ENTITY staff.server.admin.non_cat_types.delete "Delete">
+<!ENTITY staff.server.admin.non_cat_types.submit "Submit">
+<!ENTITY staff.server.admin.non_cat_types.cancel "Cancel">
+<!ENTITY staff.server.admin.non_cat_types.delete.confirm "Are you sure you wish to delete the selected non-cataloged type?">
+<!ENTITY staff.server.admin.non_cat_types.in_house.help 'If the "In-House" flag is set on a non-cataloged type, items that circulate as that type will create "In-House" circulations.  This is ideal for computer use, room "rentals", etc.'>
+<!ENTITY staff.server.admin.non_cat_types.update.success "Non-cataloged type successfully updated">
+<!ENTITY staff.server.admin.non_cat_types.name_exists "A non-cataloged type with the selected name already exists.">
+<!ENTITY staff.server.admin.index.title "Local System Administration">
+<!ENTITY staff.server.admin.index.workstation_configuration "Workstation Configuration">
+<!ENTITY staff.server.admin.index.library_configuration "Library Configuration">
+<!ENTITY staff.server.admin.index.maintenance_reports "Maintenance Reports">
+<!ENTITY staff.server.admin.index.fonts_and_sounds "Global Font and Sound Settings">
+<!ENTITY staff.server.admin.index.printer "Printer Settings Editor">
+<!ENTITY staff.server.admin.index.closed_dates "Closed Dates Editor">
+<!ENTITY staff.server.admin.index.copy_locations "Copy Locations Editor">
+<!ENTITY staff.server.admin.index.library_settings "Library Settings Editor">
+<!ENTITY staff.server.admin.index.non_cataloged_types "Non-cataloged Types Editor">
+<!ENTITY staff.server.admin.index.statistical_categories "Statistical Categories Editor">
+<!ENTITY staff.server.admin.index.hold_pull_list "Pull List for Hold Requests">
+<!ENTITY staff.server.admin.index.testing "(Testing)">
+<!ENTITY staff.server.admin.index.hold_pull_list_classic "Pull List for Hold Requests (Classic)">
+<!ENTITY staff.server.admin.index.reports "Reports">
+<!ENTITY staff.server.admin.index.cash_reports "Cash Reports">
+<!ENTITY staff.server.admin.index.transits "Transits">
+<!ENTITY staff.server.admin.index.transit_list "Transit List">
+<!ENTITY staff.server.admin.org_settings.title "Evergreen: Library Settings Editor">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.org_settings.greeting "Welcome ">
+<!ENTITY staff.server.admin.org_settings.header " Library Settings Editor ">
+<!-- This will be followed by the library's name -->
+<!ENTITY staff.server.admin.org_settings.select_library "Edit Settings for : ">
+<!-- This will be followed by the library's name -->
+<!ENTITY staff.server.admin.org_settings.selected_library "Library Settings for ">
+<!ENTITY staff.server.admin.org_settings.opac_timeout "OPAC Inactivity Timeout (in seconds)">
+<!ENTITY staff.server.admin.org_settings.apply "Apply">
+<!ENTITY staff.server.admin.org_settings.apply_all "Apply to all Locations">
+<!ENTITY staff.server.admin.org_settings.staff_timeout "Staff Login Inactivity Timeout (in seconds)">
+<!ENTITY staff.server.admin.org_settings.lost_fee "Lost Materials Processing Fee">
+<!ENTITY staff.server.admin.org_settings.default_price "Default Item Price">
+<!ENTITY staff.server.admin.org_settings.from_address '"FROM" email address for patron notices'>
+<!ENTITY staff.server.admin.org_settings.bounce_note "(note: delivery failures will be returned this address)">
+<!ENTITY staff.server.admin.org_settings.apply_all.note 'I. "Apply to all Locations" will force the new setting to be applied to all locations in the location dropdown.'>
+<!ENTITY staff.server.admin.org_settings.update_success "Update succeeded.">
+<!ENTITY staff.server.admin.org_settings.apply_all.confirm "This will update the setting for all of the locations listed in the dropdown menu. Are you sure you wish to continue?">
+<!ENTITY staff.server.admin.stat_cat.title "Evergreen: Statistical Category Editor">
+<!ENTITY staff.server.admin.stat_cat.greeting "Welcome ">
+<!ENTITY staff.server.admin.stat_cat.heading " Statistical Category Editor">
+<!ENTITY staff.server.admin.stat_cat.create "Create a new statistical category">
+<!ENTITY staff.server.admin.stat_cat.name "Enter the name: ">
+<!ENTITY staff.server.admin.stat_cat.owning_library "Owning Library: ">
+<!ENTITY staff.server.admin.stat_cat.opac_visibility "OPAC Visibility: ">
+<!ENTITY staff.server.admin.stat_cat.on "On">
+<!ENTITY staff.server.admin.stat_cat.off "Off">
+<!ENTITY staff.server.admin.stat_cat.type "Type: ">
+<!ENTITY staff.server.admin.stat_cat.patron "Patron">
+<!ENTITY staff.server.admin.stat_cat.copy "Copy">
+<!ENTITY staff.server.admin.stat_cat.create.submit "Create new statistical category">
+<!ENTITY staff.server.admin.stat_cat.loading_status "Loading permissions and statistical categories...">
+<!ENTITY staff.server.admin.stat_cat.copy_stat_cats "Copy Statistical Categories">
+<!ENTITY staff.server.admin.stat_cat.patron_stat_cats "Patron Statistical Categories">
+<!ENTITY staff.server.admin.stat_cat.info_prompt "* To edit or view information about an entry, click on the entry in the drop-down menu">
+<!ENTITY staff.server.admin.stat_cat.none_defined "No statistical categories are defined">
+<!ENTITY staff.server.admin.stat_cat.name.label "Statistical Category Name">
+<!ENTITY staff.server.admin.stat_cat.owning_library.label "Owning Library">
+<!ENTITY staff.server.admin.stat_cat.opac_visibility.label "OPAC Visibility">
+<!ENTITY staff.server.admin.stat_cat.entries.label "Entries">
+<!ENTITY staff.server.admin.stat_cat.add_entry "Add Entry">
+<!ENTITY staff.server.admin.stat_cat.edit "Edit">
+<!ENTITY staff.server.admin.stat_cat.none "(none)">
+<!ENTITY staff.server.admin.stat_cat.add.label "Add">
+<!ENTITY staff.server.admin.stat_cat.add.prompt "Enter the value for the new statistical category entry">
+<!ENTITY staff.server.admin.stat_cat.delete.confirm "This will delete the selected statistical category and all attached entries. Are you sure you wish to continue?">
+<!ENTITY staff.server.admin.stat_cat.entry_delete.confirm "Are you sure you wish to remove this statistical category entry?">
+<!ENTITY staff.server.admin.stat_cat.edit_submit "Update Statistical Category">
+<!ENTITY staff.server.admin.stat_cat.edit_delete "Delete Statistical Category">
+<!ENTITY staff.server.admin.stat_cat.cancel "Cancel">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_owner "Owned By ">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_name_submit "Update Entry Value">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_delete "Delete Entry">
+<!ENTITY staff.server.admin.stat_cat.new_entry_name "Enter the value of the new entry: ">
+<!ENTITY staff.server.admin.stat_cat.new_entry_create "Create new entry">
+<!ENTITY staff.server.admin.stat_cat.update_success "Update succeeded">
+<!ENTITY staff.server.admin.upload_xacts.title "Upload Offline Transactions">
+<!ENTITY staff.server.admin.upload_xacts.header "Uploading transactions...">
+<!ENTITY staff.server.admin.upload_xacts.upload "Upload">
+<!ENTITY staff.circ.checkin_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.checkin_overlay.sel_clip.accesskey "C">
+<!ENTITY staff.circ.checkin_overlay.sel_bucket.label "Add to Item Bucket">
+<!ENTITY staff.circ.checkin_overlay.sel_bucket.accesskey "A">
+<!ENTITY staff.circ.checkin_overlay.sel_opac.label "Show in Catalog">
+<!ENTITY staff.circ.checkin_overlay.sel_opac.accesskey "S">
+<!ENTITY staff.circ.checkin_overlay.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.circ.checkin_overlay.sel_copy_details.accesskey "I">
+<!ENTITY staff.circ.checkin_overlay.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.circ.checkin_overlay.sel_patron.accesskey "L">
+<!ENTITY staff.circ.checkin_overlay.sel_last_patron.label "Retrieve Last Patron who circulated item">
+<!ENTITY staff.circ.checkin_overlay.sel_last_patron.accesskey "R">
+<!ENTITY staff.circ.checkin_overlay.sel_edit.label "Edit Item Attributes">
+<!ENTITY staff.circ.checkin_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.checkin_overlay.sel_transit_abort.label "Abort Transit">
+<!ENTITY staff.circ.checkin_overlay.sel_spine.label "Print Spine Label">
+<!ENTITY staff.circ.checkin_overlay.sel_spine.accesskey "P">
+<!ENTITY staff.circ.checkin_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.checkin_overlay.background_text "Check In / Process Item">
+<!ENTITY staff.circ.checkin_overlay.background_text.hold_capture "Auto-Print Hold and Transit Slips">
+<!ENTITY staff.circ.checkin_overlay.effective_date.label "Effective Date:">
+<!ENTITY staff.circ.checkin_overlay.actions.label "Actions for Selected Items">
+<!ENTITY staff.circ.checkin_overlay.actions.accesskey "S">
+<!ENTITY staff.circ.checkin_overlay.checkin_export.label "Export">
+<!ENTITY staff.circ.checkin_overlay.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.checkin_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.checkin_overlay.do_not_alert_on_precat.label "Ignore Pre-cataloged Items">
+<!ENTITY staff.circ.checkin_overlay.checkin_auto.label "Auto-Print Hold and Transit Slips">
+<!ENTITY staff.circ.checkin_overlay.checkin_auto.accesskey "P">
+<!ENTITY staff.circ.checkout_overlay.duedate_menu.label "Normal">
+<!ENTITY staff.circ.checkout_overlay.duedate_menu.accesskey "u">
+<!ENTITY staff.circ.checkout_overlay.barcode.accesskey "C">
+<!ENTITY staff.circ.checkout_overlay.export.accesskey "">
+<!ENTITY staff.circ.checkout_overlay.export.label "Export">
+<!ENTITY staff.circ.checkout_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.checkout_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.checkout_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.circ_brief.patron_id.label "Circ ID: ">
+<!ENTITY staff.circ.circ_brief.add_billing.label "Add Billing">
+<!ENTITY staff.circ.circ_brief.xact_start.label "Check Out Time">
+<!ENTITY staff.circ.circ_brief.due_date.label "Due Date">
+<!ENTITY staff.circ.circ_brief.stop_fines_time.label "Stop Fines Time">
+<!ENTITY staff.circ.circ_brief.checkin_time.label "Check In Time">
+<!ENTITY staff.circ.circ_brief.circ_lib.label "Check Out Library">
+<!ENTITY staff.circ.circ_brief.renewal.label "Renewal">
+<!ENTITY staff.circ.circ_brief.stop_fines.label "Stop Fines Reason">
+<!ENTITY staff.circ.circ_brief.checkin_lib.label "Check In Library">
+<!ENTITY staff.circ.circ_summary.caption "Last Few Circulations">
+<!ENTITY staff.circ.circ_summary.retrieve_last.label "Retrieve Last Patron">
+<!ENTITY staff.circ.circ_summary.retrieve_last.accesskey "L">
+<!ENTITY staff.circ.circ_summary.retrieve_all.label "Retrieve All These Patrons">
+<!ENTITY staff.circ.circ_summary.retrieve_all.accesskey "A">
+<!ENTITY staff.circ.circ_summary.done.label "Done">
+<!ENTITY staff.circ.circ_summary.done.accesskey "D">
+<!ENTITY staff.circ.copy_details.hold_caption "Captured for Hold">
+<!ENTITY staff.circ.copy_details.transit_caption "In Transit">
+<!ENTITY staff.circ.copy_details.circ_caption "Last or Current Circulation">
+<!ENTITY staff.circ.copy_details.r_last.label "Retrieve Last Patron">
+<!ENTITY staff.circ.copy_details.r_last.accesskey "L">
+<!ENTITY staff.circ.copy_details.r_hold.label "Retrieve Hold Patron">
+<!ENTITY staff.circ.copy_details.r_hold.accesskey "H">
+<!ENTITY staff.circ.copy_details.done.label "Done">
+<!ENTITY staff.circ.copy_details.done.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.copy_status_overlay.sel_clip.accesskey "C">
+<!ENTITY staff.circ.copy_status_overlay.sel_bucket.label "Add to Item Bucket">
+<!ENTITY staff.circ.copy_status_overlay.sel_bucket.accesskey "A">
+<!ENTITY staff.circ.copy_status_overlay.sel_opac.label "Show in Catalog">
+<!ENTITY staff.circ.copy_status_overlay.sel_opac.accesskey "S">
+<!ENTITY staff.circ.copy_status_overlay.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.circ.copy_status_overlay.sel_copy_details.accesskey "I">
+<!ENTITY staff.circ.copy_status_overlay.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.circ.copy_status_overlay.sel_patron.accesskey "L">
+<!ENTITY staff.circ.copy_status_overlay.sel_edit.label "Edit Item Attributes">
+<!ENTITY staff.circ.copy_status_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.sel_transit_abort.label "Abort Transits">
+<!ENTITY staff.circ.copy_status_overlay.sel_checkin.label "Check In Items">
+<!ENTITY staff.circ.copy_status_overlay.sel_checkin.accesskey "N">
+<!ENTITY staff.circ.copy_status_overlay.sel_renew.label "Renew Items">
+<!ENTITY staff.circ.copy_status_overlay.sel_renew.accesskey "R">
+<!ENTITY staff.circ.copy_status_overlay.sel_spine.label "Print Spine Label">
+<!ENTITY staff.circ.copy_status_overlay.sel_spine.accesskey "P">
+<!ENTITY staff.circ.copy_status_overlay.cmd_replace_barcode.label "Replace Barcode">
+<!ENTITY staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_items.label "Transfer Items to Previously Marked Volume">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_items.accesskey "T">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_volumes.label "Add Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_volumes.accesskey "V">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_library.label "Mark Library as Volume Transfer Destination">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_library.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_items.label "Add Items">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_items.accesskey "A">
+<!ENTITY staff.circ.copy_status_overlay.cmd_edit_volumes.label "Edit Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_edit_volumes.accesskey "E">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_volume.label "Mark Volume as Item Transfer Destination">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_volume.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_volumes.label "Transfer Volumes to Previously Marked Library">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_volumes.accesskey "T">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_items.label "Delete Items">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_items.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_volumes.label "Delete Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_volumes.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey "g">
+<!ENTITY staff.circ.copy_status_overlay.item_status.label "Item Status">
+<!ENTITY staff.circ.copy_status_overlay.last_scanned.caption "Scan Item">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_scan_barcode.label "Barcode:">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_scan_barcode.accesskey "B">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_submit_barcode.label "Submit">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_submit_barcode.accesskey "t">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_upload_file.label "Upload From File">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_upload_file.accesskey "U">
+<!ENTITY staff.circ.copy_status_overlay.cataloger_actions.label "Actions for Catalogers">
+<!ENTITY staff.circ.copy_status_overlay.cataloger_actions.accesskey "f">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print.label "Print">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print.accesskey "P">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_export.label "Export">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_export.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print_export.label "Print Export">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print_export.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.copy_status_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.chrome.menu_frame_overlay.tab1.label "Tab 1">
+<!ENTITY staff.chrome.menu_frame_overlay.tab1.accesskey "1">
+<!ENTITY staff.chrome.menu_frame_overlay.tab2.label "Tab 2">
+<!ENTITY staff.chrome.menu_frame_overlay.tab2.accesskey "2">
+<!ENTITY staff.chrome.menu_frame_overlay.tab3.label "Tab 3">
+<!ENTITY staff.chrome.menu_frame_overlay.tab3.accesskey "3">
+<!ENTITY staff.chrome.menu_frame_overlay.tab4.label "Tab 4">
+<!ENTITY staff.chrome.menu_frame_overlay.tab4.accesskey "4">
+<!ENTITY staff.chrome.menu_frame_overlay.tab5.label "Tab 5">
+<!ENTITY staff.chrome.menu_frame_overlay.tab5.accesskey "5">
+<!ENTITY staff.chrome.menu_frame_overlay.tab6.label "Tab 6">
+<!ENTITY staff.chrome.menu_frame_overlay.tab6.accesskey "6">
+<!ENTITY staff.chrome.menu_frame_overlay.tab7.label "Tab 7">
+<!ENTITY staff.chrome.menu_frame_overlay.tab7.accesskey "7">
+<!ENTITY staff.chrome.menu_frame_overlay.tab8.label "Tab 8">
+<!ENTITY staff.chrome.menu_frame_overlay.tab8.accesskey "8">
+<!ENTITY staff.chrome.menu_frame_overlay.tab9.label "Tab 9">
+<!ENTITY staff.chrome.menu_frame_overlay.tab9.accesskey "9">
+<!ENTITY staff.circ.in_house_use.main.label "Record In-House Use">
+<!ENTITY staff.circ.in_house_use.cmgb1.caption "In-House Use">
+<!ENTITY staff.circ.in_house_use.multiplier_label.value "# of uses:">
+<!ENTITY staff.circ.in_house_use.multiplier_label.accesskey "u">
+<!ENTITY staff.circ.in_house_use.submit.label "Submit">
+<!ENTITY staff.circ.in_house_use.submit.accesskey "S">
+<!ENTITY staff.circ.in_house_use.print.label "Print List">
+<!ENTITY staff.circ.in_house_use.export.label "Export">
+<!ENTITY staff.circ.in_house_use.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.in_house_use.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.in_house_use.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.in_house_use.save_cols_btn.label "Save Columns">
+<!ENTITY staff.circ.pre_cat.window.title "Pre-Catalog Fields">
+<!ENTITY staff.circ.pre_cat.caption.label "Pre-Catalog Field Entry">
+<!ENTITY staff.circ.pre_cat.dummy_title.value "Title">
+<!ENTITY staff.circ.pre_cat.dummy_author.value "Author">
+<!ENTITY staff.circ.pre_cat.cancel.label "Cancel">
+<!ENTITY staff.circ.pre_cat.cancel.accesskey "C">
+<!ENTITY staff.circ.pre_cat.checkout.label "Checkout">
+<!ENTITY staff.circ.pre_cat.checkout.accesskey "o">
+<!ENTITY staff.circ.print_list.main.label "Templates">
+<!ENTITY staff.circ.print_list.top_ui.label "ID">
+<!ENTITY staff.circ.print_list.top_ui.name.label "Name">
+<!ENTITY staff.circ.print_list.top_ui.name.accesskey "N">
+<!ENTITY staff.circ.print_list.top_ui.type.label "Type">
+<!ENTITY staff.circ.print_list.top_ui.actions.label "Actions">
+<!ENTITY staff.circ.print_list.top_ui.preview.label "Preview">
+<!ENTITY staff.circ.print_list.top_ui.preview.accesskey "P">
+<!ENTITY staff.circ.print_list.top_ui.macros.label "Macros">
+<!ENTITY staff.circ.print_list.top_ui.macros.accesskey "M">
+<!ENTITY staff.circ.print_list.top_ui.default.label "Default">
+<!ENTITY staff.circ.print_list.top_ui.default.accesskey "D">
+<!ENTITY staff.circ.print_list.top_ui.save.label "Save Locally">
+<!ENTITY staff.circ.print_list.top_ui.save.accesskey "S">
+<!ENTITY staff.circ.print_list.top_ui.description "Be sure to 'Save Locally' before export">
+<!ENTITY staff.circ.print_list.top_ui.description.export.label "Export">
+<!ENTITY staff.circ.print_list.top_ui.description.export.accesskey "E">
+<!ENTITY staff.circ.print_list.top_ui.description.import.label "Import">
+<!ENTITY staff.circ.print_list.top_ui.description.import.accesskey "I">
+<!ENTITY staff.circ.print_list.header.label "Header">
+<!ENTITY staff.circ.print_list.line_item.label "Line Item">
+<!ENTITY staff.circ.print_list.footer.label "Footer">
+<!ENTITY staff.main.data.loading "Loading data...">
+<!ENTITY staff.main.ws_info.entry "Enter a workstation name and library to register this client under:">
+<!ENTITY staff.main.ws_info.name "Name">
+<!ENTITY staff.main.ws_info.register_btn.label "Register">
+<!ENTITY staff.main.ws_info.register_btn.accesskey "R">
index 51a9a08..ca15947 100644 (file)
@@ -5,6 +5,7 @@
 <!ENTITY common.check_date.description "Check today's date above.">
 <!ENTITY common.check_barcode.description "Check barcode?">
 <!ENTITY common.date_helper 'or choose one of these'>
+<!ENTITY common.date_helper.normal 'Normal'>
 <!ENTITY common.date_helper.3_days 'Today + 3 days'>
 <!ENTITY common.date_helper.7_days 'Today + 7 days'>
 <!ENTITY common.date_helper.14_days 'Today + 14 days'>
@@ -39,6 +40,7 @@
 <!ENTITY common.username "Username">
 <!ENTITY common.username.label "Username:">
 <!ENTITY common.password "Password">
+<!ENTITY common.refresh "Refresh">
 <!ENTITY common.submit "Submit">
 <!ENTITY common.user_not_found "User not found">
 <!ENTITY common.unimplemented 'Not Yet Implemented'>
 <!ENTITY staff.patron_navbar.info.accesskey 'o'>
 <!ENTITY staff.patron_navbar.items 'Items Out'>
 <!ENTITY staff.patron_navbar.items.accesskey 'I'>
+<!ENTITY staff.patron_navbar.items.problem_items.caption 'Lost / Claimed Returned / Long Overdue / Has Unpaid Billings'>
 <!ENTITY staff.patron_navbar.refresh 'Refresh'>
 <!ENTITY staff.patron_navbar.refresh.accesskey 'R'>
 <!ENTITY staff.patron_navbar.retrieve 'Retrieve Patron'>
 <!ENTITY staff.z39_50.search_class.tcn "Accession #">
 <!ENTITY staff.z39_50.search_class.title "Title">
 <!ENTITY staff.z39_50_import_interface_label "Z39.50 IMPORT">
+<!ENTITY staff.server.admin.offline.xacts.caption "Offline Sessions">
+<!ENTITY staff.server.admin.offline.xacts.refresh.accesskey "R">
+<!ENTITY staff.server.admin.offline.xacts.create.label "Create">
+<!ENTITY staff.server.admin.offline.xacts.execute.label "Process">
+<!ENTITY staff.server.admin.offline.xacts.update.label "Update">
+<!ENTITY staff.server.admin.offline.xacts.status.label "Uploaded Transaction Files">
+<!ENTITY staff.server.admin.offline.xacts.status.desc "The transactions from the following workstations have been uploaded, but not processed.  When all expected workstations are present here, use the Process button above.">
+<!ENTITY staff.server.admin.offline.xacts.errors.label "Exceptions">
+<!ENTITY staff.server.admin.offline.xacts.errors.desc "All transactions from this session have been processed.  The errors, if any, are listed below.">
+<!ENTITY staff.server.admin.offline.xacts.export.label "Export List">
+<!ENTITY staff.server.admin.offline.xacts.print.label "Print Export">
+<!ENTITY staff.server.admin.offline.xacts.get_item.label "Retrieve Item">
+<!ENTITY staff.server.admin.offline.xacts.get_patron.label "Retrieve Patron">
+<!ENTITY staff.server.admin.offline.xacts.get_details.label "Details">
+<!ENTITY staff.server.admin.offline.xacts.errors.caption "The session is now processing.  Hit Refresh to check its status.">
+<!ENTITY staff.server.admin.font.sound.caption "Adjust Sound">
+<!ENTITY staff.server.admin.font.sound.checkbox "Disable sound?">
+<!ENTITY staff.server.admin.save_disk "Save to Disk">
+<!ENTITY staff.server.admin.font.global.caption "Adjust Global Font">
+<!ENTITY staff.server.admin.font.smaller "Smaller than Default">
+<!ENTITY staff.server.admin.font.default "Default">
+<!ENTITY staff.server.admin.font.larger "Larger than Default">
+<!ENTITY staff.server.admin.font.xxsmall "XX-Small">
+<!ENTITY staff.server.admin.font.xsmall "X-Small">
+<!ENTITY staff.server.admin.font.small "Small">
+<!ENTITY staff.server.admin.font.medium "Medium">
+<!ENTITY staff.server.admin.font.large "Large">
+<!ENTITY staff.server.admin.font.xlarge "X-Large">
+<!ENTITY staff.server.admin.font.xxlarge "XX-Large">
+<!ENTITY staff.server.admin.font.5pt "5pt">
+<!ENTITY staff.server.admin.font.6pt "6pt">
+<!ENTITY staff.server.admin.font.7pt "7pt">
+<!ENTITY staff.server.admin.font.8pt "8pt">
+<!ENTITY staff.server.admin.font.9pt "9pt">
+<!ENTITY staff.server.admin.font.10pt "10pt">
+<!ENTITY staff.server.admin.font.11pt "11pt">
+<!ENTITY staff.server.admin.font.12pt "12pt">
+<!ENTITY staff.server.admin.font.13pt "13pt">
+<!ENTITY staff.server.admin.font.14pt "14pt">
+<!ENTITY staff.server.admin.font.15pt "15pt">
+<!ENTITY staff.server.admin.font.16pt "16pt">
+<!ENTITY staff.server.admin.font.17pt "17pt">
+<!ENTITY staff.server.admin.font.18pt "18pt">
+<!ENTITY staff.server.admin.font.restore "Restore Default">
+<!ENTITY staff.server.admin.font.restore "Restore Default">
+<!ENTITY staff.server.admin.transit.filter.caption "Transit Filter">
+<!ENTITY staff.server.admin.transit.library.label "Transit Library">
+<!ENTITY staff.server.admin.transit.to.label "Transit to">
+<!ENTITY staff.server.admin.transit.from.label "Transit from">
+<!ENTITY staff.server.admin.transit.date.label "Transit Date falls between">
+<!ENTITY staff.server.admin.transit.date.today "Today">
+<!ENTITY staff.server.admin.transit.date.week "Today - 7 days">
+<!ENTITY staff.server.admin.transit.date.2weeks "Today - 14 days">
+<!ENTITY staff.server.admin.transit.date.3weeks "Today - 21 days">
+<!ENTITY staff.server.admin.transit.date.30days "Today - 30 days">
+<!ENTITY staff.server.admin.transit.date.start "The Beginning">
+<!ENTITY staff.server.admin.transit.retrieve.label "Retrieve Transits">
+<!ENTITY staff.server.admin.transit.retrieve.accesskey "T">
+<!ENTITY staff.server.admin.transit.list.label "Transits">
+<!ENTITY staff.server.admin.transit.list.print "Print Transits">
+<!ENTITY staff.server.admin.transit.list.actions "Actions for Selected Transits">
+<!ENTITY staff.server.admin.transit.list.actions.accesskey "S">
+<!ENTITY staff.server.admin.transit.list.copy.label "Copy to Clipboard">
+<!ENTITY staff.server.admin.transit.list.copy.accesskey "C">
+<!ENTITY staff.server.admin.transit.list.add.label "Add to Item Bucket">
+<!ENTITY staff.server.admin.transit.list.add.accesskey "A">
+<!ENTITY staff.server.admin.transit.list.show.label "Show in Catalog">
+<!ENTITY staff.server.admin.transit.list.show.accesskey "S">
+<!ENTITY staff.server.admin.transit.list.details.label "Show Item Details">
+<!ENTITY staff.server.admin.transit.list.details.accesskey "I">
+<!ENTITY staff.server.admin.transit.list.circs.label "Show Last Few Circulations">
+<!ENTITY staff.server.admin.transit.list.circs.accesskey "L">
+<!ENTITY staff.server.admin.transit.list.edit.label "Edit Item Attributes">
+<!ENTITY staff.server.admin.transit.list.edit.accesskey "E">
+<!ENTITY staff.server.admin.transit.list.abort.label "Abort Transits">
+<!ENTITY staff.server.admin.transit.list.save.label "Save Columns">
+<!ENTITY staff.server.admin.cash.title "Evergreen: Cash Reports">
+<!ENTITY staff.server.admin.cash.welcome "Welcome ">
+<!ENTITY staff.server.admin.cash.start_date "Start Date:">
+<!ENTITY staff.server.admin.cash.date.select "Date selector">
+<!ENTITY staff.server.admin.cash.end_date "End Date:">
+<!ENTITY staff.server.admin.cash.date_format "(YYYY-MM-DD)">
+<!ENTITY staff.server.admin.cash.view "View reports for : ">
+<!ENTITY staff.server.admin.cash.submit "Go!">
+<!ENTITY staff.server.admin.cash.desk "Desk Payments">
+<!ENTITY staff.server.admin.cash.user "User Payments">
+<!ENTITY staff.server.admin.closed_dates.title "Evergreen: Library Closed Dates Editor">
+<!ENTITY staff.server.admin.closed_dates.welcome "Welcome ">
+<!ENTITY staff.server.admin.closed_dates.editor.title " Closed Dates Editor ">
+<!ENTITY staff.server.admin.closed_dates.editor.for "Edit Closed Dates for: ">
+<!ENTITY staff.server.admin.closed_dates.editor.duration "Closed Duration">
+<!ENTITY staff.server.admin.closed_dates.editor.reason "Reason for Closing">
+<!ENTITY staff.server.admin.closed_dates.editor.delete "Delete">
+<!ENTITY staff.server.admin.closed_dates.editor.allmultiday.delete "delete">
+<!-- Translators: do not translate "<b>YYYY-MM-DD</b>" or "<b>HH:MM</b>" -->
+<!ENTITY staff.server.admin.closed_dates.editor.allmultiday.format "Note: All dates must have the form <b>YYYY-MM-DD</b>.  Times must have the form <b>HH:MM</b>">
+<!ENTITY staff.server.admin.closed_dates.add.allday "Add Single Day Closing">
+<!ENTITY staff.server.admin.closed_dates.add.multiday "Add Multiple Date Closing">
+<!ENTITY staff.server.admin.closed_dates.add.detailed "Add Detailed Closing">
+<!ENTITY staff.server.admin.closed_dates.date.start "Start Date">
+<!ENTITY staff.server.admin.closed_dates.time.start "Start Time">
+<!ENTITY staff.server.admin.closed_dates.date.end "End Date">
+<!ENTITY staff.server.admin.closed_dates.time.end "End Time">
+<!ENTITY staff.server.admin.closed_dates.allday.label "All Day">
+<!ENTITY staff.server.admin.closed_dates.editor.reason.label "Reason for closing: ">
+<!ENTITY staff.server.admin.closed_dates.apply_all "Apply to all of my libraries">
+<!ENTITY staff.server.admin.closed_dates.save "Save">
+<!ENTITY staff.server.admin.closed_dates.cancel "Cancel">
+<!ENTITY staff.server.admin.closed_dates.confirm_delete "Are you sure you wish to delete the selected close date?">
+<!ENTITY staff.server.admin.closed_dates.date.invalid "Invalid date format">
+<!ENTITY staff.server.admin.closed_dates.time.invalid "Invalid time format">
+<!ENTITY staff.server.admin.closed_dates.success "Closed date successfully updated">
+<!ENTITY staff.server.admin.copy_locations.title "Evergreen: Copy Locations Editor">
+<!ENTITY staff.server.admin.copy_locations.editor " Copy Locations Editor ">
+<!ENTITY staff.server.admin.copy_locations.editor.create "Create a new copy location">
+<!ENTITY staff.server.admin.copy_locations.editor.name "Name: ">
+<!ENTITY staff.server.admin.copy_locations.editor.holdable.label "Holdable: ">
+<!ENTITY staff.server.admin.copy_locations.editor.yes "Yes">
+<!ENTITY staff.server.admin.copy_locations.editor.no "No">
+<!ENTITY staff.server.admin.copy_locations.editor.opac_visible.label "OPAC Visible: ">
+<!ENTITY staff.server.admin.copy_locations.editor.circulate.label "Circulate: ">
+<!ENTITY staff.server.admin.copy_locations.editor.library.label "Owning Library:">
+<!ENTITY staff.server.admin.copy_locations.editor.name "Name">
+<!ENTITY staff.server.admin.copy_locations.editor.library "Owning Library">
+<!ENTITY staff.server.admin.copy_locations.editor.holdable "Holdable">
+<!ENTITY staff.server.admin.copy_locations.editor.help "Help">
+<!ENTITY staff.server.admin.copy_locations.editor.opac_visible "OPAC Visible">
+<!ENTITY staff.server.admin.copy_locations.editor.circulate "Circulate">
+<!ENTITY staff.server.admin.copy_locations.editor.edit "Edit">
+<!ENTITY staff.server.admin.copy_locations.editor.delete "Delete">
+<!ENTITY staff.server.admin.copy_locations.editor.help.holdable "If a copy location is 'Holdable', copies in that location may have holds placed on them.">
+<!ENTITY staff.server.admin.copy_locations.editor.delete.confirm "Are you sure you wish to delete the selected copy location?  Note: If copies are currently attached to this location, the delete operation will fail.">
+<!ENTITY staff.server.admin.copy_locations.submit "Submit">
+<!ENTITY staff.server.admin.copy_locations.cancel "Cancel">
+<!ENTITY staff.server.admin.copy_locations.update_success "Update Succeeded">
+<!ENTITY staff.server.admin.hold_pull.title "Evergreen Holds Pull List">
+<!-- This will be followed by the org_unit name -->
+<!ENTITY staff.server.admin.hold_pull.header "Evergreen Holds Pull List : ">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.hold_pull.greeting "Welcome ">
+<!ENTITY staff.server.admin.hold_pull.sort.note "Note: Click on a column header to sort the column">
+<!ENTITY staff.server.admin.hold_pull.title "Title">
+<!ENTITY staff.server.admin.hold_pull.author "Author">
+<!ENTITY staff.server.admin.hold_pull.copy_location "Copy Location">
+<!ENTITY staff.server.admin.hold_pull.call_number "Call Number">
+<!ENTITY staff.server.admin.hold_pull.barcode "Item Barcode">
+<!ENTITY staff.server.admin.hold_pull.copy "Copy Number">
+<!ENTITY staff.server.admin.hold_pull.format "Format">
+<!ENTITY staff.server.admin.hold_pull.patron_barcode "Patron Barcode">
+<!ENTITY staff.server.admin.hold_pull.hold_date "Hold Placement Date">
+<!ENTITY staff.server.admin.hold_pull.hold_type "Hold Type">
+<!ENTITY staff.server.admin.hold_pull.book "Book">
+<!ENTITY staff.server.admin.hold_pull.large_book "Large Print Book">
+<!ENTITY staff.server.admin.hold_pull.audiobook "Audiobook">
+<!ENTITY staff.server.admin.hold_pull.video "Video Recording">
+<!ENTITY staff.server.admin.hold_pull.music "Music">
+<!ENTITY staff.server.admin.hold_pull.eresource "Electronic Resource">
+<!ENTITY staff.server.admin.hold_pull.copy_hold "Copy Hold">
+<!ENTITY staff.server.admin.hold_pull.volume_hold "Volume Hold">
+<!ENTITY staff.server.admin.hold_pull.title_hold "Title Hold">
+<!ENTITY staff.server.admin.hold_pull.metarecord_hold "Metarecord Hold">
+<!ENTITY staff.server.admin.non_cat_types.title "Evergreen: Non Cataloged Types Editor">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.non_cat_types.greeting "Welcome ">
+<!ENTITY staff.server.admin.non_cat_types.editor.title " Non Cataloged Types Editor ">
+<!ENTITY staff.server.admin.non_cat_types.editor.header "Create a new non-cataloged type">
+<!ENTITY staff.server.admin.non_cat_types.editor.minutes "Minutes">
+<!ENTITY staff.server.admin.non_cat_types.editor.hours "Hours">
+<!ENTITY staff.server.admin.non_cat_types.editor.days "Days">
+<!ENTITY staff.server.admin.non_cat_types.editor.weeks "Weeks">
+<!ENTITY staff.server.admin.non_cat_types.editor.months "Months">
+<!ENTITY staff.server.admin.non_cat_types.in_house_circ "Circulate In-House?">
+<!ENTITY staff.server.admin.non_cat_types.in_house_circ "Help">
+<!ENTITY staff.server.admin.non_cat_types.editor.create "Create">
+<!ENTITY staff.server.admin.non_cat_types.name "Name">
+<!ENTITY staff.server.admin.non_cat_types.owning_location "Owning Location">
+<!ENTITY staff.server.admin.non_cat_types.duration "Duration">
+<!ENTITY staff.server.admin.non_cat_types.in_house.circulate "Circulate In House">
+<!ENTITY staff.server.admin.non_cat_types.edit "Edit">
+<!ENTITY staff.server.admin.non_cat_types.delete "Delete">
+<!ENTITY staff.server.admin.non_cat_types.submit "Submit">
+<!ENTITY staff.server.admin.non_cat_types.cancel "Cancel">
+<!ENTITY staff.server.admin.non_cat_types.delete.confirm "Are you sure you wish to delete the selected non-cataloged type?">
+<!ENTITY staff.server.admin.non_cat_types.in_house.help 'If the "In-House" flag is set on a non-cataloged type, items that circulate as that type will create "In-House" circulations.  This is ideal for computer use, room "rentals", etc.'>
+<!ENTITY staff.server.admin.non_cat_types.update.success "Non-cataloged type successfully updated">
+<!ENTITY staff.server.admin.non_cat_types.name_exists "A non-cataloged type with the selected name already exists.">
+<!ENTITY staff.server.admin.index.title "Local System Administration">
+<!ENTITY staff.server.admin.index.workstation_configuration "Workstation Configuration">
+<!ENTITY staff.server.admin.index.library_configuration "Library Configuration">
+<!ENTITY staff.server.admin.index.maintenance_reports "Maintenance Reports">
+<!ENTITY staff.server.admin.index.fonts_and_sounds "Global Font and Sound Settings">
+<!ENTITY staff.server.admin.index.printer "Printer Settings Editor">
+<!ENTITY staff.server.admin.index.closed_dates "Closed Dates Editor">
+<!ENTITY staff.server.admin.index.copy_locations "Copy Locations Editor">
+<!ENTITY staff.server.admin.index.library_settings "Library Settings Editor">
+<!ENTITY staff.server.admin.index.non_cataloged_types "Non-cataloged Types Editor">
+<!ENTITY staff.server.admin.index.statistical_categories "Statistical Categories Editor">
+<!ENTITY staff.server.admin.index.hold_pull_list "Pull List for Hold Requests">
+<!ENTITY staff.server.admin.index.testing "(Testing)">
+<!ENTITY staff.server.admin.index.hold_pull_list_classic "Pull List for Hold Requests (Classic)">
+<!ENTITY staff.server.admin.index.reports "Reports">
+<!ENTITY staff.server.admin.index.cash_reports "Cash Reports">
+<!ENTITY staff.server.admin.index.transits "Transits">
+<!ENTITY staff.server.admin.index.transit_list "Transit List">
+<!ENTITY staff.server.admin.org_settings.title "Evergreen: Library Settings Editor">
+<!-- This will be followed by the user's name -->
+<!ENTITY staff.server.admin.org_settings.greeting "Welcome ">
+<!ENTITY staff.server.admin.org_settings.header " Library Settings Editor ">
+<!-- This will be followed by the library's name -->
+<!ENTITY staff.server.admin.org_settings.select_library "Edit Settings for : ">
+<!-- This will be followed by the library's name -->
+<!ENTITY staff.server.admin.org_settings.selected_library "Library Settings for ">
+<!ENTITY staff.server.admin.org_settings.opac_timeout "OPAC Inactivity Timeout (in seconds)">
+<!ENTITY staff.server.admin.org_settings.apply "Apply">
+<!ENTITY staff.server.admin.org_settings.apply_all "Apply to all Locations">
+<!ENTITY staff.server.admin.org_settings.staff_timeout "Staff Login Inactivity Timeout (in seconds)">
+<!ENTITY staff.server.admin.org_settings.lost_fee "Lost Materials Processing Fee">
+<!ENTITY staff.server.admin.org_settings.default_price "Default Item Price">
+<!ENTITY staff.server.admin.org_settings.from_address '"FROM" email address for patron notices'>
+<!ENTITY staff.server.admin.org_settings.bounce_note "(note: delivery failures will be returned this address)">
+<!ENTITY staff.server.admin.org_settings.apply_all.note 'I. "Apply to all Locations" will force the new setting to be applied to all locations in the location dropdown.'>
+<!ENTITY staff.server.admin.org_settings.update_success "Update succeeded.">
+<!ENTITY staff.server.admin.org_settings.apply_all.confirm "This will update the setting for all of the locations listed in the dropdown menu. Are you sure you wish to continue?">
+<!ENTITY staff.server.admin.stat_cat.title "Evergreen: Statistical Category Editor">
+<!ENTITY staff.server.admin.stat_cat.greeting "Welcome ">
+<!ENTITY staff.server.admin.stat_cat.heading " Statistical Category Editor">
+<!ENTITY staff.server.admin.stat_cat.create "Create a new statistical category">
+<!ENTITY staff.server.admin.stat_cat.name "Enter the name: ">
+<!ENTITY staff.server.admin.stat_cat.owning_library "Owning Library: ">
+<!ENTITY staff.server.admin.stat_cat.opac_visibility "OPAC Visibility: ">
+<!ENTITY staff.server.admin.stat_cat.on "On">
+<!ENTITY staff.server.admin.stat_cat.off "Off">
+<!ENTITY staff.server.admin.stat_cat.type "Type: ">
+<!ENTITY staff.server.admin.stat_cat.patron "Patron">
+<!ENTITY staff.server.admin.stat_cat.copy "Copy">
+<!ENTITY staff.server.admin.stat_cat.create.submit "Create new statistical category">
+<!ENTITY staff.server.admin.stat_cat.loading_status "Loading permissions and statistical categories...">
+<!ENTITY staff.server.admin.stat_cat.copy_stat_cats "Copy Statistical Categories">
+<!ENTITY staff.server.admin.stat_cat.patron_stat_cats "Patron Statistical Categories">
+<!ENTITY staff.server.admin.stat_cat.info_prompt "* To edit or view information about an entry, click on the entry in the drop-down menu">
+<!ENTITY staff.server.admin.stat_cat.none_defined "No statistical categories are defined">
+<!ENTITY staff.server.admin.stat_cat.name.label "Statistical Category Name">
+<!ENTITY staff.server.admin.stat_cat.owning_library.label "Owning Library">
+<!ENTITY staff.server.admin.stat_cat.opac_visibility.label "OPAC Visibility">
+<!ENTITY staff.server.admin.stat_cat.entries.label "Entries">
+<!ENTITY staff.server.admin.stat_cat.add_entry "Add Entry">
+<!ENTITY staff.server.admin.stat_cat.edit "Edit">
+<!ENTITY staff.server.admin.stat_cat.none "(none)">
+<!ENTITY staff.server.admin.stat_cat.add.label "Add">
+<!ENTITY staff.server.admin.stat_cat.add.prompt "Enter the value for the new statistical category entry">
+<!ENTITY staff.server.admin.stat_cat.delete.confirm "This will delete the selected statistical category and all attached entries. Are you sure you wish to continue?">
+<!ENTITY staff.server.admin.stat_cat.entry_delete.confirm "Are you sure you wish to remove this statistical category entry?">
+<!ENTITY staff.server.admin.stat_cat.edit_submit "Update Statistical Category">
+<!ENTITY staff.server.admin.stat_cat.edit_delete "Delete Statistical Category">
+<!ENTITY staff.server.admin.stat_cat.cancel "Cancel">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_owner "Owned By ">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_name_submit "Update Entry Value">
+<!ENTITY staff.server.admin.stat_cat.edit_entry_delete "Delete Entry">
+<!ENTITY staff.server.admin.stat_cat.new_entry_name "Enter the value of the new entry: ">
+<!ENTITY staff.server.admin.stat_cat.new_entry_create "Create new entry">
+<!ENTITY staff.server.admin.stat_cat.update_success "Update succeeded">
+<!ENTITY staff.server.admin.upload_xacts.title "Upload Offline Transactions">
+<!ENTITY staff.server.admin.upload_xacts.header "Uploading transactions...">
+<!ENTITY staff.server.admin.upload_xacts.upload "Upload">
+<!ENTITY staff.circ.checkin_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.checkin_overlay.sel_clip.accesskey "C">
+<!ENTITY staff.circ.checkin_overlay.sel_bucket.label "Add to Item Bucket">
+<!ENTITY staff.circ.checkin_overlay.sel_bucket.accesskey "A">
+<!ENTITY staff.circ.checkin_overlay.sel_opac.label "Show in Catalog">
+<!ENTITY staff.circ.checkin_overlay.sel_opac.accesskey "S">
+<!ENTITY staff.circ.checkin_overlay.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.circ.checkin_overlay.sel_copy_details.accesskey "I">
+<!ENTITY staff.circ.checkin_overlay.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.circ.checkin_overlay.sel_patron.accesskey "L">
+<!ENTITY staff.circ.checkin_overlay.sel_last_patron.label "Retrieve Last Patron who circulated item">
+<!ENTITY staff.circ.checkin_overlay.sel_last_patron.accesskey "R">
+<!ENTITY staff.circ.checkin_overlay.sel_edit.label "Edit Item Attributes">
+<!ENTITY staff.circ.checkin_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.checkin_overlay.sel_transit_abort.label "Abort Transit">
+<!ENTITY staff.circ.checkin_overlay.sel_spine.label "Print Spine Label">
+<!ENTITY staff.circ.checkin_overlay.sel_spine.accesskey "P">
+<!ENTITY staff.circ.checkin_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.checkin_overlay.background_text "Check In / Process Item">
+<!ENTITY staff.circ.checkin_overlay.background_text.hold_capture "Auto-Print Hold and Transit Slips">
+<!ENTITY staff.circ.checkin_overlay.effective_date.label "Effective Date:">
+<!ENTITY staff.circ.checkin_overlay.actions.label "Actions for Selected Items">
+<!ENTITY staff.circ.checkin_overlay.actions.accesskey "S">
+<!ENTITY staff.circ.checkin_overlay.checkin_export.label "Export">
+<!ENTITY staff.circ.checkin_overlay.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.checkin_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.checkin_overlay.do_not_alert_on_precat.label "Ignore Pre-cataloged Items">
+<!ENTITY staff.circ.checkin_overlay.checkin_auto.label "Auto-Print Hold and Transit Slips">
+<!ENTITY staff.circ.checkin_overlay.checkin_auto.accesskey "P">
+<!ENTITY staff.circ.checkout_overlay.duedate_menu.label "Normal">
+<!ENTITY staff.circ.checkout_overlay.duedate_menu.accesskey "u">
+<!ENTITY staff.circ.checkout_overlay.barcode.accesskey "C">
+<!ENTITY staff.circ.checkout_overlay.export.accesskey "">
+<!ENTITY staff.circ.checkout_overlay.export.label "Export">
+<!ENTITY staff.circ.checkout_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.checkout_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.checkout_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.circ_brief.patron_id.label "Circ ID: ">
+<!ENTITY staff.circ.circ_brief.add_billing.label "Add Billing">
+<!ENTITY staff.circ.circ_brief.xact_start.label "Check Out Time">
+<!ENTITY staff.circ.circ_brief.due_date.label "Due Date">
+<!ENTITY staff.circ.circ_brief.stop_fines_time.label "Stop Fines Time">
+<!ENTITY staff.circ.circ_brief.checkin_time.label "Check In Time">
+<!ENTITY staff.circ.circ_brief.circ_lib.label "Check Out Library">
+<!ENTITY staff.circ.circ_brief.renewal.label "Renewal">
+<!ENTITY staff.circ.circ_brief.stop_fines.label "Stop Fines Reason">
+<!ENTITY staff.circ.circ_brief.checkin_lib.label "Check In Library">
+<!ENTITY staff.circ.circ_summary.caption "Last Few Circulations">
+<!ENTITY staff.circ.circ_summary.retrieve_last.label "Retrieve Last Patron">
+<!ENTITY staff.circ.circ_summary.retrieve_last.accesskey "L">
+<!ENTITY staff.circ.circ_summary.retrieve_all.label "Retrieve All These Patrons">
+<!ENTITY staff.circ.circ_summary.retrieve_all.accesskey "A">
+<!ENTITY staff.circ.circ_summary.done.label "Done">
+<!ENTITY staff.circ.circ_summary.done.accesskey "D">
+<!ENTITY staff.circ.copy_details.hold_caption "Captured for Hold">
+<!ENTITY staff.circ.copy_details.transit_caption "In Transit">
+<!ENTITY staff.circ.copy_details.circ_caption "Last or Current Circulation">
+<!ENTITY staff.circ.copy_details.r_last.label "Retrieve Last Patron">
+<!ENTITY staff.circ.copy_details.r_last.accesskey "L">
+<!ENTITY staff.circ.copy_details.r_hold.label "Retrieve Hold Patron">
+<!ENTITY staff.circ.copy_details.r_hold.accesskey "H">
+<!ENTITY staff.circ.copy_details.done.label "Done">
+<!ENTITY staff.circ.copy_details.done.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.copy_status_overlay.sel_clip.accesskey "C">
+<!ENTITY staff.circ.copy_status_overlay.sel_bucket.label "Add to Item Bucket">
+<!ENTITY staff.circ.copy_status_overlay.sel_bucket.accesskey "A">
+<!ENTITY staff.circ.copy_status_overlay.sel_opac.label "Show in Catalog">
+<!ENTITY staff.circ.copy_status_overlay.sel_opac.accesskey "S">
+<!ENTITY staff.circ.copy_status_overlay.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.circ.copy_status_overlay.sel_copy_details.accesskey "I">
+<!ENTITY staff.circ.copy_status_overlay.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.circ.copy_status_overlay.sel_patron.accesskey "L">
+<!ENTITY staff.circ.copy_status_overlay.sel_edit.label "Edit Item Attributes">
+<!ENTITY staff.circ.copy_status_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.sel_transit_abort.label "Abort Transits">
+<!ENTITY staff.circ.copy_status_overlay.sel_checkin.label "Check In Items">
+<!ENTITY staff.circ.copy_status_overlay.sel_checkin.accesskey "N">
+<!ENTITY staff.circ.copy_status_overlay.sel_renew.label "Renew Items">
+<!ENTITY staff.circ.copy_status_overlay.sel_renew.accesskey "R">
+<!ENTITY staff.circ.copy_status_overlay.sel_spine.label "Print Spine Label">
+<!ENTITY staff.circ.copy_status_overlay.sel_spine.accesskey "P">
+<!ENTITY staff.circ.copy_status_overlay.cmd_replace_barcode.label "Replace Barcode">
+<!ENTITY staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_items.label "Transfer Items to Previously Marked Volume">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_items.accesskey "T">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_volumes.label "Add Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_volumes.accesskey "V">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_library.label "Mark Library as Volume Transfer Destination">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_library.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_items.label "Add Items">
+<!ENTITY staff.circ.copy_status_overlay.cmd_add_items.accesskey "A">
+<!ENTITY staff.circ.copy_status_overlay.cmd_edit_volumes.label "Edit Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_edit_volumes.accesskey "E">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_volume.label "Mark Volume as Item Transfer Destination">
+<!ENTITY staff.circ.copy_status_overlay.cmd_mark_volume.accesskey "M">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_volumes.label "Transfer Volumes to Previously Marked Library">
+<!ENTITY staff.circ.copy_status_overlay.cmd_transfer_volumes.accesskey "T">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_items.label "Delete Items">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_items.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_volumes.label "Delete Volumes">
+<!ENTITY staff.circ.copy_status_overlay.cmd_delete_volumes.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey "g">
+<!ENTITY staff.circ.copy_status_overlay.item_status.label "Item Status">
+<!ENTITY staff.circ.copy_status_overlay.last_scanned.caption "Scan Item">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_scan_barcode.label "Barcode:">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_scan_barcode.accesskey "B">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_submit_barcode.label "Submit">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_submit_barcode.accesskey "t">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_upload_file.label "Upload From File">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_upload_file.accesskey "U">
+<!ENTITY staff.circ.copy_status_overlay.cataloger_actions.label "Actions for Catalogers">
+<!ENTITY staff.circ.copy_status_overlay.cataloger_actions.accesskey "f">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print.label "Print">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print.accesskey "P">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_export.label "Export">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_export.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print_export.label "Print Export">
+<!ENTITY staff.circ.copy_status_overlay.copy_status_print_export.accesskey "">
+<!ENTITY staff.circ.copy_status_overlay.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.copy_status_overlay.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.chrome.menu_frame_overlay.tab1.label "Tab 1">
+<!ENTITY staff.chrome.menu_frame_overlay.tab1.accesskey "1">
+<!ENTITY staff.chrome.menu_frame_overlay.tab2.label "Tab 2">
+<!ENTITY staff.chrome.menu_frame_overlay.tab2.accesskey "2">
+<!ENTITY staff.chrome.menu_frame_overlay.tab3.label "Tab 3">
+<!ENTITY staff.chrome.menu_frame_overlay.tab3.accesskey "3">
+<!ENTITY staff.chrome.menu_frame_overlay.tab4.label "Tab 4">
+<!ENTITY staff.chrome.menu_frame_overlay.tab4.accesskey "4">
+<!ENTITY staff.chrome.menu_frame_overlay.tab5.label "Tab 5">
+<!ENTITY staff.chrome.menu_frame_overlay.tab5.accesskey "5">
+<!ENTITY staff.chrome.menu_frame_overlay.tab6.label "Tab 6">
+<!ENTITY staff.chrome.menu_frame_overlay.tab6.accesskey "6">
+<!ENTITY staff.chrome.menu_frame_overlay.tab7.label "Tab 7">
+<!ENTITY staff.chrome.menu_frame_overlay.tab7.accesskey "7">
+<!ENTITY staff.chrome.menu_frame_overlay.tab8.label "Tab 8">
+<!ENTITY staff.chrome.menu_frame_overlay.tab8.accesskey "8">
+<!ENTITY staff.chrome.menu_frame_overlay.tab9.label "Tab 9">
+<!ENTITY staff.chrome.menu_frame_overlay.tab9.accesskey "9">
+<!ENTITY staff.circ.in_house_use.main.label "Record In-House Use">
+<!ENTITY staff.circ.in_house_use.cmgb1.caption "In-House Use">
+<!ENTITY staff.circ.in_house_use.multiplier_label.value "# of uses:">
+<!ENTITY staff.circ.in_house_use.multiplier_label.accesskey "u">
+<!ENTITY staff.circ.in_house_use.submit.label "Submit">
+<!ENTITY staff.circ.in_house_use.submit.accesskey "S">
+<!ENTITY staff.circ.in_house_use.print.label "Print List">
+<!ENTITY staff.circ.in_house_use.export.label "Export">
+<!ENTITY staff.circ.in_house_use.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.in_house_use.strict_barcode.label "Strict Barcode">
+<!ENTITY staff.circ.in_house_use.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.in_house_use.save_cols_btn.label "Save Columns">
+<!ENTITY staff.circ.pre_cat.window.title "Pre-Catalog Fields">
+<!ENTITY staff.circ.pre_cat.caption.label "Pre-Catalog Field Entry">
+<!ENTITY staff.circ.pre_cat.dummy_title.value "Title">
+<!ENTITY staff.circ.pre_cat.dummy_author.value "Author">
+<!ENTITY staff.circ.pre_cat.cancel.label "Cancel">
+<!ENTITY staff.circ.pre_cat.cancel.accesskey "C">
+<!ENTITY staff.circ.pre_cat.checkout.label "Checkout">
+<!ENTITY staff.circ.pre_cat.checkout.accesskey "o">
+<!ENTITY staff.circ.print_list.main.label "Templates">
+<!ENTITY staff.circ.print_list.top_ui.label "ID">
+<!ENTITY staff.circ.print_list.top_ui.name.label "Name">
+<!ENTITY staff.circ.print_list.top_ui.name.accesskey "N">
+<!ENTITY staff.circ.print_list.top_ui.type.label "Type">
+<!ENTITY staff.circ.print_list.top_ui.actions.label "Actions">
+<!ENTITY staff.circ.print_list.top_ui.preview.label "Preview">
+<!ENTITY staff.circ.print_list.top_ui.preview.accesskey "P">
+<!ENTITY staff.circ.print_list.top_ui.macros.label "Macros">
+<!ENTITY staff.circ.print_list.top_ui.macros.accesskey "M">
+<!ENTITY staff.circ.print_list.top_ui.default.label "Default">
+<!ENTITY staff.circ.print_list.top_ui.default.accesskey "D">
+<!ENTITY staff.circ.print_list.top_ui.save.label "Save Locally">
+<!ENTITY staff.circ.print_list.top_ui.save.accesskey "S">
+<!ENTITY staff.circ.print_list.top_ui.description "Be sure to 'Save Locally' before export">
+<!ENTITY staff.circ.print_list.top_ui.description.export.label "Export">
+<!ENTITY staff.circ.print_list.top_ui.description.export.accesskey "E">
+<!ENTITY staff.circ.print_list.top_ui.description.import.label "Import">
+<!ENTITY staff.circ.print_list.top_ui.description.import.accesskey "I">
+<!ENTITY staff.circ.print_list.header.label "Header">
+<!ENTITY staff.circ.print_list.line_item.label "Line Item">
+<!ENTITY staff.circ.print_list.footer.label "Footer">
+<!ENTITY staff.main.data.loading "Loading data...">
+<!ENTITY staff.main.ws_info.entry "Enter a workstation name and library to register this client under:">
+<!ENTITY staff.main.ws_info.name "Name">
+<!ENTITY staff.main.ws_info.register_btn.label "Register">
+<!ENTITY staff.main.ws_info.register_btn.accesskey "R">
+<!ENTITY staff.cat.bib_brief.record_summary "Record Summary">
+<!ENTITY staff.cat.bib_brief.title "Title:">
+<!ENTITY staff.cat.bib_brief.view_marc "View MARC">
+<!ENTITY staff.cat.bib_brief.author "Author:">
+<!ENTITY staff.cat.bib_brief.edition "Edition:">
+<!ENTITY staff.cat.bib_brief.pub_date "Publication Date:">
+<!ENTITY staff.cat.bib_brief.title_control_number "TCN:">
+<!ENTITY staff.cat.bib_brief.created_by "Created By:">
+<!ENTITY staff.cat.bib_brief.last_edited_by "Last Edited By:">
+<!ENTITY staff.cat.bib_brief.last_edited_on "Last Edited On:">
+<!ENTITY staff.circ.holds.copy_to_clipboard "Copy to Clipboard">
+<!ENTITY staff.circ.holds.copy_to_clipboard.accesskey "C">
+<!ENTITY staff.circ.holds.show_in_catalog "Show in Catalog">
+<!ENTITY staff.circ.holds.show_in_catalog.accesskey "S">
+<!ENTITY staff.circ.holds.show_item_details "Show Item Details">
+<!ENTITY staff.circ.holds.show_item_details.accesskey "I">
+<!ENTITY staff.circ.holds.show_last_few_circulations "Show Last Few Circulations">
+<!ENTITY staff.circ.holds.show_last_few_circulations.accesskey "L">
+<!ENTITY staff.circ.holds.retrieve_patron "Retrieve Patron">
+<!ENTITY staff.circ.holds.retrieve_patron.accesskey "P">
+<!ENTITY staff.circ.holds.show_notices "Show Notices">
+<!ENTITY staff.circ.holds.show_notices.accesskey "N">
+<!ENTITY staff.circ.holds.edit_pickup_library "Edit Pickup Library">
+<!ENTITY staff.circ.holds.edit_pickup_library.accesskey "L">
+<!ENTITY staff.circ.holds.edit_phone_notification "Edit Phone Notification">
+<!ENTITY staff.circ.holds.edit_phone_notification.accesskey "P">
+<!ENTITY staff.circ.holds.set_email_notification "Set Email Notification">
+<!ENTITY staff.circ.holds.set_email_notification.accesskey "E">
+<!ENTITY staff.circ.holds.edit_activation_date "Edit Activation Date">
+<!ENTITY staff.circ.holds.edit_activation_date.accesskey "D">
+<!ENTITY staff.circ.holds.activate_hold "Activate Hold">
+<!ENTITY staff.circ.holds.activate_hold.accesskey "A">
+<!ENTITY staff.circ.holds.suspend_hold "Suspend Hold">
+<!ENTITY staff.circ.holds.suspend_hold.accesskey "S">
+<!ENTITY staff.circ.holds.edit_hold_range "Edit Hold Range">
+<!ENTITY staff.circ.holds.edit_hold_range.accesskey "R">
+<!ENTITY staff.circ.holds.edit_hold_focus "Edit Hold Focus">
+<!ENTITY staff.circ.holds.edit_hold_focus.accesskey "F">
+<!ENTITY staff.circ.holds.mark_item_damaged "Mark Item Damaged">
+<!ENTITY staff.circ.holds.mark_item_damaged.accesskey "D">
+<!ENTITY staff.circ.holds.mark_item_missing "Mark Item Missing">
+<!ENTITY staff.circ.holds.mark_item_missing.accesskey "M">
+<!ENTITY staff.circ.holds.retarget "Find Another Target">
+<!ENTITY staff.circ.holds.retarget.accesskey "T">
+<!ENTITY staff.circ.holds.cancel "Cancel Hold">
+<!ENTITY staff.circ.holds.cancel.accesskey "C">
+<!ENTITY staff.circ.holds.save_columns "Save Columns">
+<!ENTITY staff.circ.holds.save_columns.accesskey "">
+<!ENTITY staff.cat.copy_browser.actions.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.cat.copy_browser.actions.sel_clip.accesskey "C">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_items_to_buckets.label "Add Items to Buckets">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_items_to_buckets.accesskey "B">
+<!ENTITY staff.cat.copy_browser.actions.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.cat.copy_browser.actions.sel_copy_details.accesskey "I">
+<!ENTITY staff.cat.copy_browser.actions.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.cat.copy_browser.actions.sel_patron.accesskey "L">
+<!ENTITY staff.cat.copy_browser.actions.cmd_edit_items.label "Edit Item Attributes">
+<!ENTITY staff.cat.copy_browser.actions.cmd_edit_items.accesskey "E">
+<!ENTITY staff.cat.copy_browser.actions.cmd_transfer_items.label "Transfer Items to Previously Marked Volume">
+<!ENTITY staff.cat.copy_browser.actions.cmd_transfer_items.accesskey "T">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_volumes.label "Add Volumes">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_volumes.accesskey "V">
+<!ENTITY staff.cat.copy_browser.actions.cmd_mark_library.label "Mark Library as Volume Transfer Destination">
+<!ENTITY staff.cat.copy_browser.actions.cmd_mark_library.accesskey "M">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_items.label "Add Items">
+<!ENTITY staff.cat.copy_browser.actions.cmd_add_items.accesskey "A">
+<!ENTITY staff.cat.copy_browser.actions.cmd_edit_volumes.label "Edit Volumes">
+<!ENTITY staff.cat.copy_browser.actions.cmd_edit_volumes.accesskey "E">
+<!ENTITY staff.cat.copy_browser.actions.cmd_mark_volume.label "Mark Volume as Item Transfer Destination">
+<!ENTITY staff.cat.copy_browser.actions.cmd_mark_volume.accesskey "M">
+<!ENTITY staff.cat.copy_browser.actions.cmd_transfer_volume.label "Transfer Volumes to Previously Marked Library">
+<!ENTITY staff.cat.copy_browser.actions.cmd_transfer_volume.accesskey "T">
+<!ENTITY staff.cat.copy_browser.actions.cmd_delete_items.label "Delete Items">
+<!ENTITY staff.cat.copy_browser.actions.cmd_delete_volumes.label "Delete Volumes">
+<!ENTITY staff.cat.copy_browser.actions.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.cat.copy_browser.actions.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.cat.copy_browser.actions.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.cat.copy_browser.actions.sel_mark_items_missing.accesskey "g">
+<!ENTITY staff.cat.copy_browser.actions.cmd_print_spine_labels.label "Print Item Spine Labels">
+<!ENTITY staff.cat.copy_browser.actions.cmd_print_spine_labels.accesskey "P">
+<!ENTITY staff.cat.copy_browser.actions.cmd_replace_barcode.label "Replace Barcode">
+<!ENTITY staff.cat.copy_browser.actions.save_columns.label "Save Columns">
+<!ENTITY staff.cat.copy_browser.actions.cmd_refresh_list.label "Refresh Listing">
+<!ENTITY staff.cat.copy_browser.actions.cmd_refresh_list.accesskey "R">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.caption "Holdings Maintenance">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.legend "Green in the list below means the library has volumes for this record.">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.consortial_total "Consortial Total:">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.consortial_available "Available:">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.show_acns "Show Volumes">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.show_acps "Show Items">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.refresh_button.label "Refresh">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.show_libs.label "Show Libraries With Items">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.show_libs.accesskey "L">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.actions.label "Actions for Selected Rows">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.actions.accesskey "f">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_clip.accesskey "C">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.add_items_to_bucket.label "Add Items to Buckets">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.add_items_to_bucket.accesskey "B">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_copy_details.accesskey "I">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_patron.accesskey "L">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_edit_items.label "Edit Item Attributes">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_edit_items.accesskey "E">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_transfer_items.label "Transfer Items to Previously Marked Volume">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_transfer_items.accesskey "T">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.label "Add Volumes">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.accesskey "V">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_mark_library.label "Mark Library as Volume Transfer Destination">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_mark_library.accesskey "M">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_add_items.label "Add Items">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_add_items.accesskey "A">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_edit_volumes.label "Edit Volumes">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_edit_volumes.accesskey "E">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_mark_volume.label "Mark Volume as Item Transfer Destination">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_mark_volume.accesskey "M">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_transfer_volume.label "Transfer Volumes to Previously Marked Library">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_transfer_volume.accesskey "T">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_delete_items.label "Delete Items">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_delete_volumes.label "Delete Volumes">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_mark_items_missing.label "Mark Item Missing">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.sel_mark_items_missing.accesskey "g">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_print_spine_labels.label "Print Item Spine Labels">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_print_spine_labels.accesskey "P">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_replace_barcode.label "Replace Barcode">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.save_columns.label "Save Columns">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.label "Refresh Listing">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.accesskey "R">
+<!ENTITY staff.cat.copy_buckets.window_title "Copy Buckets">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_copies "Pending Copies">
+<!ENTITY staff.cat.copy_buckets_overlay.bucket_view "Bucket View">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.save_columns1 "Save Columns">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.sel_clip1 "Copy to Clipboard">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.cmd_print_export1 "Print Export">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.cmd_export1 "Export">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_add.label "Add All">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_add.accesskey "A">
+<!ENTITY staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_sel_add.label "Add Selected">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_new_bucket.label "New Bucket">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_delete_bucket.label "Delete Bucket">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.refresh.label "Refresh">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.save_columns2.label "Save Columns">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.sel_clip2.label "Copy to Clipboard">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.delete_item.label "Remove Selected From Bucket">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.export.label "Add Selected">
+<!ENTITY staff.cat.copy_buckets_overlay.info_box.bucket.label "Bucket #">
+<!ENTITY staff.cat.copy_buckets_overlay.info_box.owner.label "Owner:">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.print.label "Print">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.print.accesskey "P">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.print_export.label "Print Export">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.cmd_copy_buckets_export.label "Export">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.batch.label "Batch:">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.cmd_export_to_copy_status.label "Show Status">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_transfer_to_volume.label "Transfer to Specific Volume">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_batch_copy_edit.label "Edit Item Attributes">
+<!ENTITY staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_batch_copy_delete.label "Delete All from Catalog">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.label "Item Buckets">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.add_to_bucket.label "Add to Selected Bucket">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.add_to_bucket.accesskey "A">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.new_bucket.label "Add to New Bucket">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.new_bucket.accesskey "N">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.cancel.label "Cancel">
+<!ENTITY staff.cat.copy_buckets_quick.item_buckets.cancel.accesskey "C">
+<!ENTITY staff.cat.copy_editor.window.label "Copies">
+<!ENTITY staff.cat.copy_editor.groupbox1.label "Copy Viewer">
+<!ENTITY staff.cat.copy_editor.templates.label "Templates:">
+<!ENTITY staff.cat.copy_editor.templates.apply_template.label "Apply">
+<!ENTITY staff.cat.copy_editor.templates.apply_template.accesskey "y">
+<!ENTITY staff.cat.copy_editor.templates.delete_template.label "Delete">
+<!ENTITY staff.cat.copy_editor.templates.import_template.label "Import">
+<!ENTITY staff.cat.copy_editor.templates.export_template.label "Export">
+<!ENTITY staff.cat.copy_editor.templates.save_template.label "Save">
+<!ENTITY staff.cat.copy_editor.templates.reset.label "Reset">
+<!ENTITY staff.cat.copy_editor.templates.reset.accesskey "R">
+<!ENTITY staff.cat.copy_editor.identification.label "Identification">
+<!ENTITY staff.cat.copy_editor.identification.location.label "Location">
+<!ENTITY staff.cat.copy_editor.identification.location.accesskey "1">
+<!ENTITY staff.cat.copy_editor.identification.circulation.label "Circulation">
+<!ENTITY staff.cat.copy_editor.identification.circulation.accesskey "2">
+<!ENTITY staff.cat.copy_editor.identification.miscellaneous.label "Miscellaneous">
+<!ENTITY staff.cat.copy_editor.identification.miscellaneous.accesskey "3">
+<!ENTITY staff.cat.copy_editor.identification.statistics.label "Statistics">
+<!ENTITY staff.cat.copy_editor.identification.statistics.accesskey "4">
+<!ENTITY staff.cat.copy_editor.stat_cat_lib_filter_menu.label "Library Filter">
+<!ENTITY staff.cat.copy_editor.copy_notes.label "Copy Notes">
+<!ENTITY staff.cat.copy_editor.copy_notes.accesskey "N">
+<!ENTITY staff.cat.copy_editor.save.label "Modify Copies">
+<!ENTITY staff.cat.copy_editor.save.accesskey "M">
+<!ENTITY staff.cat.copy_editor.cancel.label "Close">
+<!ENTITY staff.cat.copy_editor.cancel.accesskey "C">
+<!ENTITY staff.cat.copy_summary.label "Item Summary">
+<!ENTITY staff.cat.copy_summary.barcode.label "Barcode:">
+<!ENTITY staff.cat.copy_summary.location.label "Location:">
+<!ENTITY staff.cat.copy_summary.call_number.label "Call Number:">
+<!ENTITY staff.cat.copy_summary.status.label "Status:">
+<!ENTITY staff.cat.copy_summary.circulate.label "Circulate:">
+<!ENTITY staff.cat.copy_summary.reference.label "Reference:">
+<!ENTITY staff.cat.copy_summary.holdable.label "Holdable:">
+<!ENTITY staff.cat.copy_summary.opac_visible.label "OPAC Visible:">
+<!ENTITY staff.cat.copy_summary.created.label "Created:">
+<!ENTITY staff.cat.copy_summary.edited.label "Edited:">
+<!ENTITY staff.cat.copy_summary.age_protect.label "Age Protect:">
+<!ENTITY staff.cat.copy_summary.total_circs.label "Total Circs:">
+<!ENTITY staff.cat.copy_summary.alternate_view.label "Alternate View">
+<!ENTITY staff.cat.copy_summary.save_columns.label "Save Columns">
+<!ENTITY staff.cat.copy_summary.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.cat.copy_summary.print_export.label "Print Export">
+<!ENTITY staff.cat.marcedit.options.label "Options">
+<!ENTITY staff.cat.marcedit.stackSubfields.label "Stack subfields">
+<!ENTITY staff.cat.marcedit.stackSubfields.accesskey "s">
+<!ENTITY staff.cat.marcedit.validate.label "Validate">
+<!ENTITY staff.cat.marcedit.validate.accesskey "V">
+<!ENTITY staff.cat.marcedit.save-button.accesskey "d">
+<!ENTITY staff.cat.marcedit.help.label "Help">
+<!ENTITY staff.cat.marcedit.help.accesskey "H">
+<!ENTITY staff.cat.marcedit.caption.label "MARC Record">
+<!ENTITY staff.cat.marcedit.toggleFFE.label "Fixed Fields -- Record type: ">
+<!ENTITY staff.cat.marc_new.load.label "Load">
+<!ENTITY staff.cat.marc_new.load.accesskey "L">
+<!ENTITY staff.cat.marc_view.title "MARC View">
index 44f535b..3100a85 100644 (file)
@@ -42,7 +42,7 @@
 <!ENTITY common.user_not_found "User not found">
 <!ENTITY opac.advanced.wizard.title "Advanced Search">
 <!ENTITY common.nowSearching "Now searching ">
-<!ENTITY common.ofAtLeast " of at least ">
+<!ENTITY common.ofAtLeast " of about ">
 <!ENTITY common.relevancy "Match Score: ">
 <!ENTITY common.tips "Tips:">
 <!ENTITY common.tips.tip1 "Click on a folder icon in the sidebar to access related quick searches">
 <!ENTITY opac.style.reddish "Reddish">
 
 <!ENTITY holds.where_am_i
-       "PINES is a statewide system with both patrons and items
-       associated with over 250 libraries, holds lists are not as simple as
-       'first come, first served' in PINES.  A complex matrix combining
+       "Holds lists are not as simple as
+       'first come, first served.'  A complex matrix combining
        consideration of item ownership, patron home library, and item purchase
        date determines  priorities for holds; the list is dynamic, changing
        with every hold placed.  Therefore, any indication of a place in the
-       holds list would be inaccurate.  The PINES holds system is designed to
+       holds list would be inaccurate.  The holds system is designed to
        obtain a requested item in the fastest and most efficient way possible.
-       Your PINES library will contact you when you hold items become
+       Your library will contact you when you hold items become
        available.">
 
 <!ENTITY holds.advanced_options 
@@ -146,7 +145,7 @@ To see the public view of a shared Bookbag, click the "View" link in the
 "Shared" column of the Bookbag list at the top of this page.'>
 <!ENTITY myopac.item.confirm "Are you sure you wish to remove this bookbag item?">
 <!ENTITY myopac.publish.confirm "Sharing this bookbag will allow the contents 
-of the bookback to be seen by others.  Are you sure you wish to share this bookbag?">
+of the bookbag to be seen by others.  Are you sure you wish to share this bookbag?">
 <!ENTITY myopac.unpublish.confirm "Are you sure you wish to hide this bookbag?">
 <!ENTITY myopac.update.success "The Bookbag was successfully updated.">
 <!ENTITY myopac.updated.success "Bookbag successfully updated">
@@ -174,7 +173,7 @@ avoid using bookbags all together.  Thank you.">
 <!ENTITY myopac.checked.renew.success "item(s) successfully renewed">
 <!ENTITY myopac.checked.renew.confirm "Are you sure you wish to renew the selected item(s)?">
 <!ENTITY myopac.checked.renew.fail "The system is unable to renew the selected item at this time.  This usually means the item is needed to fulfill a hold.  Please see a librarian for further help.">
-<!ENTITY myopac.checked.renew.fail2 "PINES policy prevents the renewal of this item at this time.  Please see a librarian for further details.">
+<!ENTITY myopac.checked.renew.fail2 "Library policy prevents the renewal of this item at this time.  Please see a librarian for further details.">
 
 <!--   ================================================================= 
        MyOPAC Fines Page 
@@ -209,23 +208,22 @@ avoid using bookbags all together.  Thank you.">
 <!ENTITY myopac.holds.edit "Edit">
 <!ENTITY myopac.holds.cancel "Cancel">
 <!ENTITY myopac.holds.verify "If you wish to cancel the selected hold, click OK, otherwise click Cancel.">
-<!ENTITY myopac.holds.freeze_selected "Freeze">
-<!ENTITY myopac.holds.thaw_selected "Un-freeze">
-<!ENTITY myopac.holds.thaw_date_selected "Set Un-freeze date">
+<!ENTITY myopac.holds.freeze_selected "Suspend">
+<!ENTITY myopac.holds.thaw_selected "Activate">
+<!ENTITY myopac.holds.thaw_date_selected "Set Active Date">
 <!ENTITY myopac.holds.cancel_selected "Cancel">
 <!ENTITY myopac.holds.processing "Processing holds... This may take a moment.">
 <!ENTITY myopac.holds.actions 'Actions for selected holds'>
 <!ENTITY myopac.holds.cancel.confirm 'Are you sure you wish to cancel the selected holds?'>
-<!ENTITY myopac.holds.freeze.confirm 'Are you sure you wish to freeze the selected holds?
-Note that if an item has already been selected to fulfill the hold, it will not be frozen'>
-<!ENTITY myopac.holds.thaw.confirm 'Are you sure you wish to un-freeze the selected holds?'>
-<!ENTITY myopac.holds.thaw_date.confirm 'Are you sure you wish to change the un-freeze date for the selected holds?'>
-<!ENTITY myopac.holds.freeze.select_thaw "Select an 'Un-Freeze' date.  This is the date at which the holds will become active again.
-If no date is chosen, the holds will remain frozen until they are manually un-frozen.">
-
-<!ENTITY opac.holds.freeze "Freeze this hold">
-<!ENTITY opac.holds.freeze.help "A 'frozen' will retain its place in the queue, but will not be fulfilled until it has been unfrozen.">
-<!ENTITY opac.holds.freeze.thaw_date "Automatically un-freeze hold on:">
+<!ENTITY myopac.holds.freeze.confirm 'Are you sure you wish to suspend the selected holds?
+If an item has already been selected to fulfill the hold, it will not be suspended'>
+<!ENTITY myopac.holds.thaw.confirm 'Are you sure you wish to activate the selected holds?'>
+<!ENTITY myopac.holds.thaw_date.confirm 'Are you sure you wish to change the activate date for the selected holds?'>
+<!ENTITY myopac.holds.freeze.select_thaw "Select an automatic activation date.  If no date is chosen, the holds will remain suspended until they are manually activated.">
+
+<!ENTITY opac.holds.freeze "Suspend this hold">
+<!ENTITY opac.holds.freeze.help "A suspended hold will retain its place in the queue, but will not be fulfilled until it has been activated.">
+<!ENTITY opac.holds.freeze.thaw_date "Automatically activate hold on:">
 <!ENTITY opac.holds.freeze.thaw_date.format "YYYY-MM-DD">
 
 <!--   ================================================================= 
@@ -249,8 +247,8 @@ If no date is chosen, the holds will remain frozen until they are manually un-fr
 <!ENTITY myopac.prefs.help "This setting defines how you will be notified of holds that are ready to be picked up from the library.
 By default, holds will use the notification style you choose here.  
 However, you will still have the option to change individual holds regardless of this setting.">
-<!ENTITY myopac.holds.unfrozen "Un-Frozen">
-<!ENTITY myopac.holds.frozen.until "Frozen Until">
+<!ENTITY myopac.holds.unfrozen "Active">
+<!ENTITY myopac.holds.frozen.until "Activate on...">
 
 <!--   ================================================================= 
         MyOPAC Summary page
@@ -380,7 +378,7 @@ Please see a librarian to renew your account.">
 <!ENTITY footer.library.about "About PINES">
 <!ENTITY footer.union.url "http://www.galileo.usg.edu/">
 <!ENTITY footer.union "GALILEO">
-<!ENTITY footer.copyright "Copyright &#xA9; 2006 Georgia Public Library Service">
+<!ENTITY footer.copyright "Copyright &#xA9; 2006-2008 Georgia Public Library Service">
 <!ENTITY footer.logo "Powered by"> <!-- Introduces the logo for the project -->
 
 <!--   ================================================================= 
@@ -556,12 +554,13 @@ We recommend that you remove this title from any bookbags it may have been added
 
 <!ENTITY result.table.keyword "View titles for this record">
 <!ENTITY result.table.author "Perform an Author Search">
+<!ENTITY result.googleBooks.browse "Browse in Google Books Search">
 
 <!ENTITY common.call.number.label "Call Number:">
 <!ENTITY common.isbn.label "ISBN:">
 <!ENTITY common.issn.label "ISSN:">
 <!ENTITY common.copy.barcode.label "Copy Barcode:">
-<!ENTITY common.hold.place "Place hold for me">
+<!ENTITY common.hold.place "Place hold for my account">
 <!ENTITY common.hold.check "Checking for possibility of hold fulfillment...">
 <!ENTITY common.hold.create "Create / Edit a Hold">
 <!ENTITY common.hold.update "Update Hold">
index 2f170e5..c112356 100644 (file)
@@ -244,4 +244,7 @@ table { border-collapse: collapse; }
 
 #opac.result.sort { margin-left: 5px; }
 
+#xul_recipient_me { margin-left: 25px; }
+#myopac_holds_thaw_date_form {padding: 10px; text-align: center;}
+#myopac_holds_freeze_select_thaw {margin-right: 100px; margin-left: 100px; }
 
index 1dd7dd9..f844450 100644 (file)
@@ -15,7 +15,9 @@ function advgInit() {
                FETCH_LIT_FORMS, 
                FETCH_ITEM_FORMS, 
                FETCH_ITEM_TYPES, 
-               FETCH_AUDIENCES ];
+               FETCH_AUDIENCES,
+               FETCH_BIB_LEVELS 
+    ];
 
        for( var x in extras ) {
 
@@ -25,6 +27,7 @@ function advgInit() {
                if(x == 1) req.request.sel = $('adv_global_item_form');
                if(x == 2) req.request.sel = $('adv_global_item_type');
                if(x == 3) req.request.sel = $('adv_global_audience');
+               if(x == 4) req.request.sel = $('adv_global_bib_level');
 
                req.callback(advDrawBibExtras);
                req.send();
@@ -137,6 +140,7 @@ function advSubmitGlobal() {
        var itemforms = advGetVisSelectorVals('adv_global_item_form');
        var itemtypes = advGetVisSelectorVals('adv_global_item_type');
        var audiences = advGetVisSelectorVals('adv_global_audience');
+       var biblevels = advGetVisSelectorVals('adv_global_bib_level');
        var languages = getSelectedList($('adv_global_lang')) + '';     
     var limit2avail = $('opac.result.limit2avail').checked ? 1 : ''
 
@@ -149,6 +153,7 @@ function advSubmitGlobal() {
        args.page = MRESULT;
        args[PARAM_ITEMFORM] = itemforms;
        args[PARAM_ITEMTYPE] = itemtypes;
+       args[PARAM_BIBLEVEL] = biblevels;
        args[PARAM_LITFORM]     = litforms;
        args[PARAM_AUDIENCE]    = audiences;
        args[PARAM_LANGUAGE] = languages;
index aa3792e..1e400e2 100644 (file)
@@ -306,13 +306,35 @@ function cpdShowNotes(copy, args) {
 function cpdShowStats(copy, args) {
        var entries = copy.stat_cat_entry_copy_maps();
        if(!entries || entries.length == 0) return;
-               
+
+       var visibleStatCat = false;
+
+       /*
+               check all copy stat cats; if we find one that's OPAC visible,
+               set the flag and break the loop. If we've found one, or we're
+               in the staff client, build the table. if not, we return doing
+               nothing, as though the stat_cat_entry_copy_map was empty or null
+       */
+
+       for( var n in entries )
+       {
+                       var entry = entries[n];
+                       if(isTrue(entry.stat_cat().opac_visible()))
+                       {
+                               visibleStatCat = true;
+                               break;
+                       }
+       }
+
+       if(!(isXUL() || visibleStatCat)) return;
+
        var a = _cpdExtrasInit(args);
        var tbody = a[0];
        var rowt = a[1];
 
        for( var n in entries ) {
                var entry = entries[n];
+               if(!(isXUL() || isTrue(entry.stat_cat().opac_visible()))) continue;
                var row = rowt.cloneNode(true);
                $n(row, 'key').appendChild(text(entry.stat_cat().name()));
                $n(row, 'value').appendChild(text(entry.stat_cat_entry().value()));
index ea865e7..1bd983e 100644 (file)
@@ -75,7 +75,8 @@ function buildLocationSelector(newLoc) {
        removeChildren(selector);
        
        var location = findOrgUnit(loc);
-       var type = findOrgType(location.ou_type());
+       var type;
+       if (location) type = findOrgType(location.ou_type());
 
        while( type && location ) {
                var n = node.cloneNode(true);   
index e6a1bd6..9b8dddc 100644 (file)
@@ -18,8 +18,20 @@ function holdsHandleStaff() {
                {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
        $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
        $('xul_recipient_me').onclick = _holdsHandleStaffMe;
+
+       $('xul_recipient_barcode').onkeyup = function(evt) {
+        if($('xul_recipient_barcode').value == '') 
+            $('xul_recipient_me').disabled = false;
+        else
+            $('xul_recipient_me').disabled = true;
+    };
 }
 
+$('holds_frozen_thaw_input').onchange = 
+        function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
+$('holds_frozen_thaw_input').onkeyup = 
+        function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
+
 function _holdsHandleStaffMe() {
        holdArgs.recipient = G.user;
        holdsDrawEditor();
@@ -457,6 +469,10 @@ function __holdsDrawWindow() {
        if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
 
        holdsSetFormatSelector();
+
+    $('holds_frozen_chkbox').checked = false;
+    hideMe($('hold_frozen_thaw_row'));
+
 }
 
 function holdsParseMRFormats(str) {
@@ -700,10 +716,18 @@ function holdsBuildHoldFromWindow() {
         hold.frozen('t');
         unHideMe($('hold_frozen_thaw_row'));
         thawDate = $('holds_frozen_thaw_input').value;
-        if(thawDate) 
-            hold.thaw_date(thawDate);
-        else
+        if(thawDate) {
+            thawDate = holdsVerifyThawDate(thawDate); 
+            if(thawDate) 
+                hold.thaw_date(thawDate);
+            else
+                return;
+        } else {
             hold.thaw_date(null);
+        }
+    } else {
+        hold.frozen('f');
+        hold.thaw_date(null);
     }
 
        //check for alternate hold formats 
@@ -727,8 +751,8 @@ function holdHandleCreateResponse(r, recurse) {
 
        if(!recurse) {
                var res = r.getResultObject();
-               if(!res || checkILSEvent(res) ) {
-                       if(!res) {
+               if(checkILSEvent(res) || res.success != 1) {
+                       if(res.success != 1) {
                                alert($('hold_not_allowed').innerHTML);
                        } else {
                                if( res.textcode == 'PATRON_BARRED' ) {
@@ -740,6 +764,7 @@ function holdHandleCreateResponse(r, recurse) {
                        swapCanvas($('holds_box'));
                        return;
                }
+        r._hold.selection_depth(res.depth);
        }       
 
        holdCreateHold(r._recurse, r._hold);
@@ -807,3 +832,34 @@ function holdsUpdate(hold, user) {
 }
 
 
+/* verify that the thaw date is valid and after today */
+function holdsVerifyThawDate(dateString) {
+    thawDate = Date.parseIso8601(dateString);
+    if(thawDate && holdGreaterThanToday(dateString)) 
+        return thawDate.iso8601Format('YMD', false, false, true);
+    return null;
+}
+
+function holdGreaterThanToday(dateString) {
+    thawDate = Date.parseIso8601(dateString);
+    var today = new Date();
+    today = new Date(today.getFullYear(), today.getMonth(), today.getDate())
+    return thawDate > today;
+}
+
+
+function holdsVerifyThawDateUI(element) {
+    value = $(element).value;
+
+    if(!value) {
+        removeCSSClass($(element), 'invalid_field');
+        return;
+    }
+
+    if(!holdsVerifyThawDate(value)) {
+        addCSSClass($(element), 'invalid_field');
+    } else {
+        removeCSSClass($(element), 'invalid_field');
+    }
+}
+
index aaad90d..5185052 100644 (file)
@@ -47,11 +47,12 @@ function mresultCollectAdvIds() {
 
 function mresultHandleMRIds(r) {
        var res = r.getResultObject();
+    resultCompiledSearch = res.compiled_search;
+    cookieManager.write(COOKIE_SEARCH, js2JSON(res.compiled_search), -1);
        if(res.count != null) {
                if( getOffset() == 0 ) HITCOUNT = res.count;
                runEvt('result', 'hitCountReceived');
        } 
-    cookieManager.write(COOKIE_SEARCH, js2JSON(res.compiled_search), -1);
        runEvt('result', 'idsReceived', res.ids);
 }
 
index 362834a..21d0b2d 100644 (file)
@@ -19,6 +19,11 @@ function clearNodes( node, keepArray ) {
 function myOPACInit() {
        if(!(G.user && G.user.session)) initLogin();
        else myOPACChangePage( "summary" );
+
+    $('myopac_holds_thaw_date_input').onkeyup = 
+        function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
+    $('myopac_holds_thaw_date_input').onchange = 
+        function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
 }
 
 function myopacReload() {
@@ -859,7 +864,14 @@ function myOPACUpdateUsername() {
        var req = new Request(CHECK_USERNAME, G.user.session, username);
        req.send(true);
        var res = req.result();
-       if( res && res != G.user.id() ) {
+       /* If the username does not already exist, res will be null;
+        * we can move on to updating the username.
+        * 
+        * If the username does exist, then res will be the user ID.
+        * G.user.id() gives us the currently authenticated user ID.
+        * If res == G.user.id(), we try to update the username anyways.
+        */
+       if( res !== null && res != G.user.id() ) {
                alertId('myopac_username_dup');
                return;
        }
@@ -973,7 +985,7 @@ function myOPACShowBookbags(force) {
                        unHideMe(link);
 
                        link = $n(row, 'myopac_bb_published_atom');
-                       link.setAttribute('href', buildExtrasLink( 'feed/bookbag/atom-full/'+cont.id(), false));  
+                       link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));  
                        link.setAttribute('target', '_blank' );
                        unHideMe(link);
 
@@ -1333,7 +1345,7 @@ function myopacSelectedHoldsRows() {
 }
 
 var myopacProcessedHolds = 0;
-var myopacTotalHoldsToProcess = 0;
+var myopacHoldsToProcess = 0;
 function myopacDoHoldAction() {
 
     var selectedRows = myopacSelectedHoldsRows();
@@ -1344,7 +1356,6 @@ function myopacDoHoldAction() {
     myopacProcessedHolds = 0;
 
     if(!confirmId('myopac.holds.'+action+'.confirm')) return;
-
     myopacSelectNoneHolds(); /* clear the selection */
 
 
@@ -1369,17 +1380,23 @@ function myopacDoHoldAction() {
                 break;
         }
     }
-    myopacTotalHoldsToProcess = holds.length;
-    if(myopacTotalHoldsToProcess == 0) return;
-    myopacShowHoldProcessing();
+    myopacHoldsToProcess = holds;
+    if(myopacHoldsToProcess.length == 0) return;
+
+    if(action == 'thaw_date' || action == 'freeze') 
+        myopacDrawHoldThawDateForm();
+    else
+    myopacProcessHolds(action);
+}
+
 
-    var thawDate = null;
-    var thawDateSet = false;
+function myopacProcessHolds(action, thawDate) {
 
+    myopacShowHoldProcessing();
     /* now we process them */
-    for(var i = 0; i < holds.length; i++) {
+    for(var i = 0; i < myopacHoldsToProcess.length; i++) {
 
-        hold = holds[i];
+        hold = myopacHoldsToProcess[i];
         
         var req;
         switch(action) { 
@@ -1395,23 +1412,12 @@ function myopacDoHoldAction() {
                 break;
 
             case 'thaw_date':
-                if(!thawDateSet)
-                    thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML) || null;
-                thawDateSet = true;
-                hold.thaw_date(thawDate);
-                req = new Request(UPDATE_HOLD, G.user.session, hold);
-                break;
-
-
             case 'freeze':
-                if(!thawDateSet)
-                    thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML);
-                thawDateSet = true;
                 hold.frozen('t');
-                if(thawDate) 
-                    hold.thaw_date(thawDate); 
+                hold.thaw_date(thawDate); 
                 req = new Request(UPDATE_HOLD, G.user.session, hold);
                 break;
+                //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML);
 
         }
 
@@ -1421,6 +1427,30 @@ function myopacDoHoldAction() {
     }
 }
 
+function myopacDrawHoldThawDateForm() {
+    hideMe($('myopac_holds_main_table'));
+    unHideMe($('myopac_holds_thaw_date_form'));
+    $('myopac_holds_thaw_date_input').focus();
+    Calendar.setup({
+        inputField  : "myopac_holds_thaw_date_input",
+        ifFormat    : "%Y-%m-%d",
+        button      : "myopac_holds_thaw_date_img",
+        align       : "Tl",
+        singleClick : true
+    });
+}
+
+function myopacApplyThawDate() {
+    var dateString = $('myopac_holds_thaw_date_input').value;
+    if(dateString) {
+        dateString = holdsVerifyThawDate(dateString);
+        if(!dateString) return;
+    } else {
+        dateString = null;
+    }
+    myopacProcessHolds('freeze', dateString);
+}
+
 function myopacHoldIDFromRow(row) {
     return row.id.replace(/.*_(\d+)$/, '$1');
 }
@@ -1433,11 +1463,13 @@ function myopacShowHoldProcessing() {
 function myopacHideHoldProcessing() {
     hideMe($('myopac_holds_processing'));
     unHideMe($('myopac_holds_main_table'));
+    hideMe($('myopac_holds_thaw_date_form'));
 }
 
 function myopacBatchHoldCallback(r) {
-    r.getResultObject();
-    if(++myopacProcessedHolds >= myopacTotalHoldsToProcess) {
+    if(r) /* force load any exceptions */
+        r.getResultObject();
+    if(++myopacProcessedHolds >= myopacHoldsToProcess.length) {
         myopacHideHoldProcessing();
         holdCache = {};
         holdStatusCache = {};
index 3df7c48..b7a210d 100644 (file)
@@ -2,8 +2,11 @@
 var recordsHandled = 0;
 var recordsCache = [];
 var lowHitCount = 4;
+var isbnList = '';
+var googleBooks = true;
 
 var resultFetchAllRecords = false;
+var resultCompiledSearch = null;
 
 /* set up the event handlers */
 if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {
@@ -11,7 +14,9 @@ if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {
        G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
        G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
        G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, 
-      resultDrawAuthors, resultDrawSeries, function(){unHideMe($('result_info_2'))});
+      resultDrawAuthors, resultDrawSeries, function(){unHideMe($('result_info_2'))},
+         fetchGoogleBooks);
+
        attachEvt('result','lowHits',resultLowHits);
        attachEvt('result','zeroHits',resultZeroHits);
        attachEvt( "common", "locationUpdated", resultSBSubmit );
@@ -58,7 +63,11 @@ function resultCollectSearchIds( type, method, handler ) {
                        limit = getHitCount() - getOffset();
        }
 
-       args.org_unit = getLocation();
+       var lasso = getLasso();
+
+       if (lasso) args.org_unit = -lasso;
+       else args.org_unit = getLocation();
+
        args.depth    = getDepth();
        args.limit    = limit;
        args.offset   = getOffset();
@@ -75,6 +84,7 @@ function resultCollectSearchIds( type, method, handler ) {
        if(getAudience()) args.audience  = getAudience().split(/,/);
        if(getLitForm()) args.lit_form  = getLitForm().split(/,/);
        if(getLanguage()) args.language = getLanguage().split(/,/);
+       if(getBibLevel()) args.bib_level        = getBibLevel().split(/,/);
 
        _debug('Search args: ' + js2JSON(args));
        _debug('Raw query: ' + getTerm());
@@ -92,19 +102,21 @@ function resultCollectSearchIds( type, method, handler ) {
        displaying, links to the next/prev pages, etc. */
 function resultSetHitInfo() { 
 
-
-       /* tell the user where the results are coming from */
-       var baseorg = findOrgUnit(getLocation());
-       var depth = getDepth();
-       var mydepth = findOrgDepth(baseorg);
-       if( findOrgDepth(baseorg) != depth ) {
-               var tmporg = baseorg;
-               while( mydepth > depth ) {
-                       mydepth--;
-                       tmporg = findOrgUnit(tmporg.parent_ou());
+       var lasso = getLasso();
+       if (!lasso) {
+               /* tell the user where the results are coming from */
+               var baseorg = findOrgUnit(getLocation());
+               var depth = getDepth();
+               var mydepth = findOrgDepth(baseorg);
+               if( findOrgDepth(baseorg) != depth ) {
+                       var tmporg = baseorg;
+                       while( mydepth > depth ) {
+                               mydepth--;
+                               tmporg = findOrgUnit(tmporg.parent_ou());
+                       }
+                       unHideMe($('including_results_for'));
+                       $('including_results_location').appendChild(text(tmporg.name()));
                }
-               unHideMe($('including_results_for'));
-               $('including_results_location').appendChild(text(tmporg.name()));
        }
 
 
@@ -171,16 +183,16 @@ function resultLowHits() {
        if(getHitCount() > 0)
                unHideMe($('result_low_hits_msg'));
 
-       var sreq = new Request(CHECK_SPELL, getTerm());
+    var words = [];
+    for(var key in resultCompiledSearch.searches) 
+        words.push(resultCompiledSearch.searches[key].term);
+
+       var sreq = new Request(CHECK_SPELL, words.join(' '));
        sreq.callback(resultSuggestSpelling);
        sreq.send();
 
-    /* XXX patch to use the search results */
-
-       var words = getTerm().split(' ');
-       var word;
-       while( word = words.shift() ) {
-               var areq = new Request(FETCH_CROSSREF, getStype(), getTerm() );
+    for(var key in resultCompiledSearch.searches) {
+               var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);
                areq.callback(resultLowHitXRef);
                areq.send();
        }
@@ -339,11 +351,13 @@ function resultPaginate() {
                if( getHitCount() % getDisplayCount() == 0 ) 
                        args[PARAM_OFFSET] -= getDisplayCount();
 
+        /*
                G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
                addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
 
                $('end_link2').setAttribute("href", buildOPACLink(args)); 
                addCSSClass($('end_link2'), config.css.result.nav_active);
+        */
        }
 
        if( o > 0 ) {
@@ -391,6 +405,21 @@ function buildunAPISpan (span, type, id) {
        );
 }
 
+function unhideGoogleBooks (data) {
+    for ( var i in data ) {
+        //if (data[i].preview == 'noview') continue;
+
+        var gbspan = $n(document.documentElement, 'googleBooks-' + i);
+        var gba = $n(gbspan, "googleBooks-link");
+
+        gba.setAttribute(
+            'href',
+            data[i].info_url
+        );
+        removeCSSClass( gbspan, 'hide_me' );
+    }
+}
+
 /* display the record info in the record display table 'pos' is the 
                zero based position the record should have in the display table */
 function resultDisplayRecord(rec, pos, is_mr) {
@@ -400,8 +429,22 @@ function resultDisplayRecord(rec, pos, is_mr) {
        recordsCache.push(rec);
 
        var r = table.rows[pos + 1];
-
-       
+    var currentISBN = cleanISBN(rec.isbn());
+
+    if (googleBooks) {
+           var gbspan = $n(r, "googleBooks");
+        if (currentISBN) {
+            gbspan.setAttribute(
+                'name',
+                gbspan.getAttribute('name') + '-' + currentISBN
+            );
+
+            if (isbnList) isbnList += ', ';
+            isbnList += currentISBN;
+        }
+    }
+
+/*
        try {
                var rank = parseFloat(ranks[pos + getOffset()]);
                rank            = parseInt( rank * 100 );
@@ -409,9 +452,10 @@ function resultDisplayRecord(rec, pos, is_mr) {
                relspan.appendChild(text(rank));
                unHideMe(relspan.parentNode);
        } catch(e){ }
+*/
 
        var pic = $n(r, config.names.result.item_jacket);
-       pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
+       pic.setAttribute("src", buildISBNSrc(currentISBN));
 
        var title_link = $n(r, config.names.result.item_title);
        var author_link = $n(r, config.names.result.item_author);
@@ -545,8 +589,21 @@ function resultBuildFormatIcons( row, rec, is_mr ) {
        }
 }
 
+function fetchGoogleBooks () {
+    if (isbnList && googleBooks) {
+        var scriptElement = document.createElement("script");
+        scriptElement.setAttribute("id", "jsonScript");
+        scriptElement.setAttribute("src",
+            "http://books.google.com/books?bibkeys=" + 
+            escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooks");
+        scriptElement.setAttribute("type", "text/javascript");
+        // make the request to Google Book Search
+        document.documentElement.firstChild.appendChild(scriptElement);
+    }
+}
 
 function resultPageIsDone(pos) {
+
        return (recordsHandled == getDisplayCount() 
                || recordsHandled + getOffset() == getHitCount());
 }
@@ -576,7 +633,7 @@ function resultAddCopyCounts(rec, pagePosition) {
 
        var cchead = null;
        var ccheadcell = null;
-       if(!resultCCHeaderApplied) {
+       if(!resultCCHeaderApplied && !getLasso()) {
                ccrow = $('result_thead_row');
                ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));
                var t = ccheadcell.cloneNode(true);
@@ -622,7 +679,12 @@ function resultAddCopyCounts(rec, pagePosition) {
 /* collect copy counts for a record using method 'methodName' */
 function resultCollectCopyCounts(rec, pagePosition, methodName) {
        if(rec == null || rec.doc_id() == null) return;
-       var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
+
+       var loc = getLasso();
+       if (loc) loc = -loc;
+       else loc= getLocation();
+
+       var req = new Request(methodName, loc, rec.doc_id(), getForm() );
        req.request.userdata = [ rec, pagePosition ];
        req.callback(resultHandleCopyCounts);
        req.send();
@@ -633,9 +695,31 @@ function resultHandleCopyCounts(r) {
 }
 
 
+/* XXX Needs to understand Lasso copy counts... */
 /* display the collected copy counts */
 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
        if(copy_counts == null || rec == null) return;
+
+       if (getLasso()) {
+               var copy_counts_lasso = {
+                       transcendant : null,
+                       count : 0,
+                       unshadow : 0,
+                       available : 0,
+                       depth : -1,
+                       org_unit : getLasso()
+               };
+
+               for (var i in copy_counts) {
+                       copy_counts_lasso.transcendant = copy_counts[i].transcendant;
+                       copy_counts_lasso.count += parseInt(copy_counts[i].count);
+                       copy_counts_lasso.unshadow += parseInt(copy_counts[i].unshadow);
+                       copy_counts_lasso.available += parseInt(copy_counts[i].available);
+               }
+
+               copy_counts = [ copy_counts_lasso ];
+       }
+
        var i = 0;
        while(copy_counts[i] != null) {
                var cell = $("copy_count_cell_" + i +"_" + pagePosition);
index 0b11da9..a0aeafe 100644 (file)
@@ -76,6 +76,10 @@ function rresultCollectIds() {
                defaut:
                        var form = rresultGetForm();
                        var args = { format : form, org : getLocation(), depth : rresultGetDepth() };
+
+                       var lasso = getLasso();
+                       if (lasso) args.org = -lasso;
+
                        var req = new Request(FETCH_RIDS, getMrid(), args);
                        req.callback( rresultHandleRIds );
                        req.send();
@@ -210,6 +214,10 @@ function rresultHandleRIds(r) {
                rresultTries++;
                var form = rresultGetForm();
                var args = { format : form, org : getLocation(), depth : findOrgDepth(globalOrgTree) };
+
+               var lasso = getLasso();
+               if (lasso) args.org = -lasso;
+
                var req = new Request(FETCH_RIDS, getMrid(), args );
                req.callback( rresultHandleRIds );
                req.send();
@@ -223,7 +231,7 @@ function rresultHandleRIds(r) {
 }
 
 function _rresultHandleIds(ids, count) {
-       var json = js2JSON({ids:ids,count:count});
+       //var json = js2JSON({ids:ids,count:count});
        /*
        cookieManager.write(COOKIE_SRIDS, json, '+1d');
        */
@@ -300,6 +308,7 @@ function rresultFilterSearchResults(r) {
                        ids.push(result.ids[i][0]);
        }
 
+    resultCompiledSearch = result.compiled_search;
     cookieManager.write(COOKIE_SEARCH, js2JSON(result.compiled_search), -1);
        _rresultHandleIds( ids, result.count );
 }
index 0369744..c87d494 100644 (file)
@@ -48,7 +48,7 @@ function searchBarInit() {
     }
 }
 
-function searchBarSubmit() {
+function searchBarSubmit(isFilterSort) {
 
        var text = G.ui.searchbar.text.value;
 
@@ -60,7 +60,7 @@ function searchBarSubmit() {
 
        var args = {};
 
-       if(SHOW_MR_DEFAULT) {
+       if(SHOW_MR_DEFAULT || (isFilterSort && findCurrentPage() == MRESULT)) {
                args.page                               = MRESULT;
        } else {
                args.page                               = RRESULT;
index f09d760..021c6bf 100644 (file)
                                                        </select>
                                                </td>
                                        </tr>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>Bib Level</span>
+                                               </td>
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_bib_level'>
+                                                       </select>       
+                                               </td>
+                                       </tr>
+
                                </tbody>
                        </table>
                </td>
index bd4e8e8..fdd251c 100644 (file)
@@ -3,6 +3,7 @@
 <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/calendar.js'></script>
 <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/lang/calendar-en.js'></script>
 <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/calendar-setup.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/common/js/DP_DateExtensions.js'></script>
 
 <div>
        <div id='xulholds_box' class='hide_me canvas' style='margin-top: 6px;'>
                                        <tr>
                                                <td>&opac.holds.xulRecipient;:</td>
                                                <td><input type='text' id='xul_recipient_barcode' /></td>
-                                               <td><input type='submit' value='&common.submit;' 
-                                                       id='xul_recipient_barcode_submit' /></td>
-                                               <td><input type='submit' value='&common.hold.place;' 
-                                                       id='xul_recipient_me' /></td>
+                                               <td><input type='submit' value='&common.submit;' id='xul_recipient_barcode_submit' /></td>
                                                <td><input type='submit' value='&common.cancel;' onclick='showCanvas();' /></td>
+                                               <td><input type='submit' value='&common.hold.place;' id='xul_recipient_me' /></td>
                                        </tr>
-
                                </tbody>
                        </table>
                </center>
                 <tr>
                     <td class='holds_cell'>
                         &opac.holds.freeze;
-                        (<a class='classic_link' href='javascript:alert("&opac.holds.freeze.help;");'>&common.help;</a>)
+                        <a class='classic_link' href='javascript:alert("&opac.holds.freeze.help;");'>&common.help;</a>
                         </td>
                     <td class='holds_cell'>
                         <input type='checkbox' id='holds_frozen_chkbox' 
index 59b2d8d..d1c17ab 100644 (file)
@@ -11,6 +11,7 @@
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/fmgen.js' type='text/javascript'></script>
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/opac_utils.js' type='text/javascript'></script>
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/OrgTree.js' type='text/javascript'></script>
+       <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/OrgLasso.js' type='text/javascript'></script>
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/org_utils.js' type='text/javascript'></script>
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/RemoteRequest.js' type='text/javascript'></script>
        <script language='javascript' src='<!--#echo var="OILS_JS_BASE"-->/init.js' type='text/javascript'></script>
index a6462c0..237be62 100644 (file)
@@ -13,7 +13,7 @@
                                        </i>
                                </td>
                 <td align='right'>
-                    <!--#if expr="$OILS_PAGE='rresult.xml'"-->
+                    <!--#if expr="$OILS_PAGE='rresult.xml' || $OILS_PAGE='mresult.xml'"-->
                     <!--#include virtual="../result/filtersort.xml" -->
                     <!--#endif -->
                 </td>
index 7b81763..3d98e39 100644 (file)
         <tr><td>&myopac.holds.processing;</td></tr>
     </table>
 
+    <div id='myopac_holds_thaw_date_form' class='hide_me'>
+        <div id='myopac_holds_freeze_select_thaw'>&myopac.holds.freeze.select_thaw;</div>
+        <p>
+            <input type='text' id='myopac_holds_thaw_date_input'/> 
+            <img src="<!--#echo var='OILS_OPAC_JS_HOST'-->/common/js/jscalendar/img.gif"  id='myopac_holds_thaw_date_img' class='cal_img'/>
+            (&opac.holds.freeze.thaw_date.format;)
+        </p>
+        <p>
+            <button onclick='myopacApplyThawDate();'>&common.submit;</button>
+        </p>
+    </div>
+
        <table width='100%' class='light_border data_grid data_grid_center' id='myopac_holds_main_table'>
 
                <thead class='color_3'>
                                </td>
 
                 <td>
+                    <!-- These characaters do not display in Internet Exploror, *sigh*
                     <span name='myopac_hold_unfrozen_false' class='x_mark'>&#x2717;</span>
                     <span name='myopac_hold_unfrozen_true' class='hide_me check_mark'>&#x2713;</span>
+                    -->
+                    <span name='myopac_hold_unfrozen_false' class='x_mark'>&common.no;</span>
+                    <span name='myopac_hold_unfrozen_true' class='hide_me check_mark'>&common.yes;</span>
                 </td>
 
                 <td name='myopac_holds_frozen_until'></td>
index 6177b52..27eb382 100644 (file)
@@ -1,6 +1,6 @@
 <span>
-    &result.limit2avail;<input type='checkbox' id='opac.result.limit2avail' onclick='searchBarSubmit();'/>
-    <select id='opac.result.sort' onchange='searchBarSubmit();'>
+    &result.limit2avail;<input type='checkbox' id='opac.result.limit2avail' onclick='searchBarSubmit(true);'/>
+    <select id='opac.result.sort' onchange='searchBarSubmit(true);'>
         <option selected='selected' value=''>&result.sort_by;</option>
         <optgroup label='&result.sort_by.title;'>
             <option id='opac.result.title.a2z' label='&common.a2z.titla;' value='title.asc'>&common.a2z.title;</option>
index fd1201e..0bdac8e 100644 (file)
                                        <span class='search_page_nav_link' id='page_numbers'> </span>
 
                                        <a  class='search_page_nav_link' id='next_link' 
-                                               title='&rdetail.page.next;'>&#187;</a><a class='search_page_nav_link' 
+                                               title='&rdetail.page.next;'>&#187;</a>
+                        <!--
+                        <a class='search_page_nav_link' 
                                                        id='end_link' title="&rdetail.page.last;">&rdetail.end;</a>
+                            -->
                                </span>
 
                        </td>
index cd1137b..53d24a6 100644 (file)
                                                                        </span>
 
                                                                        <span class='hide_me' name='place_hold_span'>
-                                                                               <a style='padding-left: 8px; padding-right: 10px;' href='javascript:void(0);' 
+                                                                               <a style='padding-left: 8px;' href='javascript:void(0);' 
                                                                                        class='classic_link' name='place_hold_link'>&opac.holds.placeHold;</a>
                                                                        </span>
 
                                                                        <!-- Empty span used for creating unAPI links -->
-                                                                       <abbr name="unapi" class="unapi-id">
+                                                                       <abbr style='padding-left: 8px;' name="unapi" class="unapi-id">
                                                                                <!-- unAPI URI goes here -->
                                                                        </abbr>
 
+                                                                       <!-- Empty span used for creating Google Book Search-->
+                                                                       <span name="googleBooks" class="hide_me">
+                                                                               <a style='padding-left: 8px;' class='classic_link' name="googleBooks-link">&result.googleBooks.browse;</a>
+                                                                       </span>
+
+
                                                                </td>
                                                        </tr>
 
             
                    <span class='search_page_nav_link' id='page_numbers2'> </span>
                       <a  class='search_page_nav_link' id='next_link2' 
-                         title='&rdetail.page.next;'>&#187;</a><a class='search_page_nav_link' 
+                         title='&rdetail.page.next;'>&#187;</a>
+                      <!--
+                      <a class='search_page_nav_link' 
                          id='end_link2' title="&rdetail.page.last;">&rdetail.end;</a>
+                      -->
                    </span>
                         
                 </td>
index 9c62201..9bfe478 100644 (file)
@@ -93,3 +93,6 @@ a:focus { background: #E0F0E0; color: #000000;}
 .x_mark { color: red; }
 .check_mark { color: green; }
 
+#myopac_holds_thaw_date_form { border: 1px solid #E0E0E0; } 
+
+.invalid_field { border: 3px solid red; }
index e890204..38781f8 100644 (file)
@@ -51,6 +51,16 @@ var OILS_RPT_TRANSFORMS = {
                label : 'Upper case'
        },
 
+       first5 : {
+               datatype : [OILS_RPT_DTYPE_STRING, 'text'],
+               label : 'First 5 characters (for US ZIP code)'
+       },
+
+       first_word : {
+               datatype : [OILS_RPT_DTYPE_STRING, 'text'],
+               label : 'First contiguous non-space string'
+       },
+
        /* timestamp transforms ----------------------- */
        dow : {
                datatype : OILS_RPT_DTYPE_TIMESTAMP,
index c901f34..b81b684 100644 (file)
@@ -88,6 +88,16 @@ var OILS_RPT_TRANSFORMS = {
                label : 'Upper case'
        },
 
+       firt5 : {
+               datatype : [ OILS_RPT_DTYPE_STRING ],
+               label : 'First 5 characters (for US ZIP code)'
+       },
+
+        first_word : {
+                datatype : [OILS_RPT_DTYPE_STRING, 'text'],
+                label : 'First contiguous non-space string'
+        },
+
        /* timestamp transforms ----------------------- */
        dow : {
                datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
diff --git a/Open-ILS/xsl/locDoc2xml.xsl b/Open-ILS/xsl/locDoc2xml.xsl
new file mode 100644 (file)
index 0000000..596fef1
--- /dev/null
@@ -0,0 +1,180 @@
+<!--
+
+Copyright (C) 2008 Equinox Software, Inc.
+Mike Rylander <miker@esilibrary.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.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+-->
+
+
+<!--
+
+This XSLT will take the MARC21 Concise Format for Bibliographic Data
+documentation maintained by the Library of Congress and turn it into an XML
+document for use by Evergreen (and others, if you so desire, under the terms
+of the GPL).  The LoC docs are available from:
+
+ http://www.loc.gov/marc/bibliographic/
+
+The format of the output XML is similar to that produced sometime during
+2005 by Ed Summers and shared at textualize.com.  That site was not available
+at the time of this XSLT's creation, and thus this exists.
+
+Please report any problems to Mike Rylander at <miker@esilibrary.com>.
+
+Here's an easy way to use this:
+
+curl -o - http://www.loc.gov/marc/bibliographic/ecbd{ldrd,cntr,007s,008s,numb,clas,main,tils,impr,phys,sers,not1,not2,subj,adde,link,srae,hold}.html | \
+ tidy -asxml -n -q -utf8 | \
+ xsltproc -\-html -\-novalid locDoc2xml.xsl - | \
+ xmllint -\-format -\-noblanks - > marcedit-tooltips.xml
+
+-->
+
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output omit-xml-declaration="yes" method="xml" encoding="UTF-8" media-type="text/plain" />
+
+    <xsl:template match="/">
+    <fields>
+        <xsl:for-each select="//a[substring(@href,1,5)='#mrcb']">
+            <xsl:call-template name="field">
+                <xsl:with-param name="datafieldLabel" select="substring-after(@href,'#')"/>
+            </xsl:call-template>
+        </xsl:for-each>
+    </fields>
+    </xsl:template>
+
+    <xsl:template name="field">
+        <xsl:param name="datafieldLabel"/>
+        <xsl:variable name="locatorAnchor" select="//a[@name=$datafieldLabel]"/>
+
+        <xsl:variable name="tagValue" select="substring-before($locatorAnchor, ' - ')"/>
+        <xsl:if test="$tagValue != ''">
+
+            <xsl:variable name="nameStart" select="substring-after($locatorAnchor, ' - ')"/>
+
+            <xsl:variable name="nameValue" select="substring-before($nameStart, '(')"/>
+
+            <xsl:variable name="repeatable" select="substring-after($nameStart, '(')"/>
+            <xsl:variable name="description" select="$locatorAnchor/parent::node()/following-sibling::node()/descendant-or-self::*"/>
+
+            <field>
+                <xsl:attribute name="tag">
+                    <xsl:value-of select="$tagValue"/>
+                </xsl:attribute>
+                <xsl:attribute name="repeatable">
+                    <xsl:choose>
+                        <xsl:when test="substring($repeatable,1,1)='R'">
+                            <xsl:text>true</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>false</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+
+                <name>
+                    <xsl:value-of select="normalize-space($nameValue)"/>
+                </name>
+
+                <description>
+                    <xsl:value-of select="normalize-space($description)"/>
+                </description>
+
+                <xsl:call-template name="indicators">
+                    <xsl:with-param name="indUL" select="$locatorAnchor/parent::node()/following-sibling::h3[.='Indicators'][1]/following-sibling::ul[1]"/>
+                </xsl:call-template>
+
+                <xsl:if test="substring($tagValue,1,2) != '00'">
+                    <xsl:call-template name="subfields">
+                        <xsl:with-param name="sfUL" select="$locatorAnchor/parent::node()/following-sibling::h3[.='Subfield Codes'][1]/following-sibling::ul[1]"/>
+                    </xsl:call-template>
+                </xsl:if>
+
+            </field>
+
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="indicators">
+        <xsl:param name="indUL"/>
+        <xsl:for-each select="$indUL/li">
+            <xsl:if test="string-length(substring-after(.,' - Undefi')) = 0">
+
+                <xsl:variable name="indPos">
+                    <xsl:choose>
+                        <xsl:when test="starts-with(.,'First')">
+                            <xsl:text>1</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>2</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:variable>
+
+                <xsl:for-each select="./ul/li">
+                    <indicator>
+                        <xsl:attribute name="position">
+                            <xsl:value-of select="$indPos"/>
+                        </xsl:attribute>
+
+                        <xsl:attribute name="value">
+                            <xsl:value-of select="substring-before(.,' - ')"/>
+                        </xsl:attribute>
+
+                        <description>
+                            <xsl:value-of select="normalize-space(substring-after(.,' - '))"/>
+                        </description>
+                    </indicator>
+                </xsl:for-each>
+            </xsl:if>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template name="subfields">
+        <xsl:param name="sfUL"/>
+        <xsl:for-each select="$sfUL/li">
+            <xsl:variable name="sfCode" select="substring-before(., ' - ')"/>
+            <xsl:variable name="descStart" select="substring-after(., ' - ')"/>
+            <xsl:variable name="descValue" select="substring-before($descStart, '(')"/>
+            <xsl:variable name="sfRepeatable" select="substring-after(., '(')"/>
+
+            <subfield>
+                <xsl:attribute name="code">
+                    <xsl:value-of select="substring($sfCode,2,1)"/>
+                </xsl:attribute>
+
+                <xsl:attribute name="repeatable">
+                    <xsl:choose>
+                        <xsl:when test="substring($sfRepeatable,1,1)='R'">
+                            <xsl:text>true</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>false</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+
+                <description>
+                    <xsl:value-of select="normalize-space($descValue)"/>
+                </description>
+            </subfield>
+        </xsl:for-each>
+    </xsl:template>
+
+</xsl:stylesheet>
+
index 10428ac..05edd2f 100644 (file)
@@ -9,19 +9,14 @@ else
 endif
 
 all: build 
-       @echo
-       @echo
 
 build: build_dir generated open-ils custom stamp 
-       @echo
-       @echo 
        @echo To test the staff client:
        @echo "  cd build/"
        @echo "  xulrunner application.ini"
 
 build_dir:
-       @echo
-       @echo '*********************************************************  Creating and populating build/ '
+       @echo ' * Creating and populating build/ '
        mkdir -p build/
        cp -R chrome build/
        cp -R server build/
@@ -34,13 +29,11 @@ build_dir:
        cp build/chrome/content/main/simple_auth.xul build/server/main/simple_auth.xul
        cp build/chrome/content/OpenILS/data.js build/server/OpenILS/data.js
        cp build/chrome/content/OpenILS/global_util.js build/server/OpenILS/global_util.js
-       @echo 
        # Is the following portable?
        for i in `cd ../../../Evergreen/xul/staff_client/server/ && find -type f |grep -v \.svn|cut -f2- -d/`; do cp ../../../Evergreen/xul/staff_client/server/$$i build/server/$$i; done
        external/prune_dirs.sh build/
 
 stamp: 
-       @echo
        @/bin/date +"%Y%m%d.%H%M%S" > build/BUILD_ID
        @if [ -n "${STAFF_CLIENT_BUILD_ID}" ]; then ( echo "Stamping with Build ID: ${STAFF_CLIENT_BUILD_ID}" ; echo ${STAFF_CLIENT_BUILD_ID} > build/BUILD_ID ) ; fi
        @if [ -z "${STAFF_CLIENT_BUILD_ID}" ]; then ( echo "No Build ID for versioning" ; echo "none" > build/BUILD_ID ) ; fi
@@ -53,28 +46,20 @@ stamp:
        @if [ -n "${STAFF_CLIENT_BUILD_ID}" ]; then find build/ -name '*.xml' -exec sed -i s/xul\\\/server/xul\\\/${STAFF_CLIENT_BUILD_ID}\\\/server/g {} \; ; fi
 
 generated:
-       @echo
-       @echo '********************************************************* Grabbing lang.dtd from the OPAC code '
+       @echo ' * Grabbing lang.dtd from the OPAC code '
        cp ../../../Open-ILS/web/opac/locale/en-US/lang.dtd build/chrome/locale/en-US/
-       # Generate the lang.js file for the stamped build
-       external/dtd2js.pl build/chrome/locale/en-US/lang.dtd > build/chrome/content/main/lang.js
-       cp build/chrome/content/main/lang.js build/server/main/lang.js
 
 open-ils:
-       @echo
-       @echo '********************************************************* Grabbing more OPAC code and legacy code and custom code'
+       @echo ' * Grabbing more OPAC code and legacy code and custom code'
        #cp ../../../OpenSRF/src/javascript/*.js build/chrome/content/OpenSRF/
        cp ../../../Open-ILS/web/opac/common/js/*.js build/chrome/content/OpenILS/util/
        cp $(OPENSRF_JSLIBS)/*.js build/chrome/content/OpenILS/util/
        external/prune_dirs.sh build/
 
 custom:
-       @echo
-       @echo
-       @echo '********************************************************* Placeholder for debugging tweaks '
+       @echo ' * Placeholder for debugging tweaks '
        #(cd chrome/content/OpenILS/util; cp RemoteRequest.js~ RemoteRequest.js)
 
 clean: 
-       @echo
-       @echo '********************************************************* Removing build/ '
+       @echo ' * Removing build/ '
        rm -rf build/
index c6e1159..4565aba 100644 (file)
@@ -172,7 +172,7 @@ OpenILS.data.prototype = {
                        if (obj.hash[key] && obj.hash[key][value]) return obj.hash[key][value];
                        switch(key) {
                                case 'acpl': 
-                                       found = obj.network.simple_request('FM_ACPL_RETRIEVE_VIA_ID',[ value ]);
+                                       found = obj.network.simple_request('FM_ACPL_RETRIEVE_VIA_ID.authoritative',[ value ]);
                                break;
                                default: return undefined; break;
                        }
@@ -704,6 +704,28 @@ OpenILS.data.prototype = {
                this.chain.push(
                        function() {
                                var f = gen_fm_retrieval_func(
+                                       'my_cnct',
+                                       [
+                                               api.FM_CNCT_RETRIEVE.app,
+                                               api.FM_CNCT_RETRIEVE.method,
+                                               [ obj.list.au[0].ws_ou() ], 
+                                               false
+                                       ]
+                               );
+                               try {
+                                       f();
+                               } catch(E) {
+                                       var error = 'Error: ' + js2JSON(E);
+                                       obj.error.sdump('D_ERROR',error);
+                                       throw(E);
+                               }
+                       }
+               );
+
+
+               this.chain.push(
+                       function() {
+                               var f = gen_fm_retrieval_func(
                                        'acpl',
                                        [
                                                api.FM_ACPL_RETRIEVE.app,
index 987c2b7..6302446 100644 (file)
@@ -27,7 +27,8 @@
                        removeCSSClass(document.documentElement,'ALL_FONTS_XX_LARGE');
                        addCSSClass(document.documentElement,data.global_font_adjust);
                } catch(E) {
-                       alert("Error with adjusting the font size: " + E);
+            var Strings = $('offlineStrings') || $('commonStrings');
+                       alert(Strings.getFormattedString('openils.global_util.font_size.error', [E]));
                }
        }
 
             netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
             if (frame && frame.contentWindow) {
                 try {
-                    if (typeof frame.contentWindow.wrappedJSObject != 'undefined') return frame.contentWindow.wrappedJSObject;
+                    if (typeof frame.contentWindow.wrappedJSObject != 'undefined') {
+                                                                        return frame.contentWindow.wrappedJSObject;
+                                                 }
                 } catch(E) {
-                    alert("Error with get_contentWindow("+frame+") and wrappedJSObject:" + E);
+                    var Strings = $('offlineStrings') || $('commonStrings');
+                    alert(Strings.getFormattedString('openils.global_util.content_window_jsobject.error', [frame, E]));
                 }
                 return frame.contentWindow;
             } else {
                 return null;
             }
         } catch(E) {
-            alert("Error with get_contentWindow("+frame+"): " + E);
+            var Strings = $('offlineStrings') || $('commonStrings');
+            alert(Strings.getFormattedString('openils.global_util.content_window.error', [frame, E]));
         }
        }
 
                        const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
                                .getService(Components.interfaces.nsIClipboardHelper);
                        gClipboardHelper.copyString(text);
-                       alert('Copied "'+text+'" to clipboard.');
+            var Strings = $('offlineStrings') || $('commonStrings');
+                       alert(Strings.getFormattedString('openils.global_util.clipboard', [text]));
                } catch(E) {
-                       alert('Clipboard action failed: ' + E); 
+            var Strings = $('offlineStrings') || $('commonStrings');
+                       alert(Strings.getFormattedString('openils.global_util.clipboard.error', [E]));  
                }
        }
 
                        cacheService.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
                        cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
                } catch(E) {
-                       alert('Problem clearing the cache: ' + E);
+            var Strings = $('offlineStrings') || $('commonStrings');
+                       alert(Strings.getFormattedString('openils.global_util.clear_cache.error', [E]));
                }
        }
 
                window.open(uri, "_blank", winopts);
        }
 
+       function url_prefix(url) {
+               if (url.match(/^\//)) url = urls.remote + url;
+               if (! url.match(/^(http|chrome):\/\//) && ! url.match(/^data:/) ) url = 'http://' + url;
+               dump('url_prefix = ' + url + '\n');
+               return url;
+       }
 
index 88fe4dc..2032b12 100644 (file)
@@ -1,5 +1,7 @@
 try {
-       if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+       if (typeof JSAN == 'undefined') { 
+               throw(document.getElementById('offlineStrings').getString('common.jsan.missing'));
+       }
        JSAN.errorLevel = "die"; // none, warn, or die
        JSAN.addRepository('..');
        JSAN.use('OpenILS.data');
index 9dccae7..24bdcba 100644 (file)
@@ -247,10 +247,10 @@ function add_question_row(my_asvq) {
        g_row_2.appendChild(g_tb);
        if (last_button) last_button.setAttribute('accesskey','');
        var g_b = document.createElement('button');
-       var strbundle = document.getElementById("adminStrings");
-               g_b.setAttribute('label', strbundle.getString('staff.admin.survey.save_response.label'));
-               g_b.setAttribute('accesskey', strbundle.getString('staff.admin.survey.save_response.label'));
-               g_b.setAttribute('oncommand','add_answer(event,' + my_asvq.id() + ');');
+       var strbundle = document.getElementById("offlineStrings");
+       g_b.setAttribute('label', strbundle.getString('staff.admin.survey.save_response.label'));
+       g_b.setAttribute('accesskey', strbundle.getString('staff.admin.survey.save_response.label'));
+       g_b.setAttribute('oncommand','add_answer(event,' + my_asvq.id() + ');');
        g_row_2.appendChild(g_b);
 
        var blank = document.createElement('row');
index 0061170..a7ec139 100644 (file)
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <scripts id="openils_util_scripts"/>
 
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/lang.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/admin/survey.js" />
        <script type="text/javascript">
        <![CDATA[
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing'); }
+                       if (typeof JSAN == 'undefined') { throw( document.getElementById("offlineStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('..');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -48,7 +47,7 @@
                                document.getElementById('survey_add').canAdvance = false; 
        
                        } catch(E) {
-                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['survey_wizard.xul', E]);
+                               var err_msg = document.getElementById("offlineStrings").getFormattedString('common.exception', ['survey_wizard.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
        ]]>
        </script>
 
-       
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="adminStrings" src="chrome://open_ils_staff_client/locale/admin.properties"/>
-       
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <!-- Layout to be filled in by overlays and javascript -->
        <wizardpage id="page1"/>
index 482c98e..f49f3c1 100644 (file)
@@ -1,4 +1,5 @@
 dump('entering auth/controller.js\n');
+// vim:sw=4:ts=4:noet:
 
 if (typeof auth == 'undefined') auth = {};
 auth.controller = function (params) {
@@ -130,7 +131,7 @@ auth.controller.prototype = {
                                                                } else {
                                                                        x.appendChild(
                                                                                document.createTextNode(
-                                                                                       'Not yet configured for the specified server.'
+                                                                                       document.getElementById('authStrings').getString('staff.auth.controller.not_configured')
                                                                                )
                                                                        );
                                                                }
@@ -211,11 +212,11 @@ auth.controller.prototype = {
                obj.controller.view.submit_button.disabled = true;
                obj.controller.view.server_prompt.disabled = true;
                var s = document.getElementById('status');
-               s.setAttribute('value','Testing hostname...');
+               s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.testing_hostname'));
                s.setAttribute('style','color: orange;');
                document.getElementById('version').value = '';
                if (!url) {
-                       s.setAttribute('value','Please enter a server hostname.');
+                       s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.prompt_hostname'));
                        s.setAttribute('style','color: red;');
                        obj.controller.view.server_prompt.disabled = false;
                        obj.controller.view.server_prompt.focus();
@@ -229,7 +230,7 @@ auth.controller.prototype = {
                        x.onreadystatechange = function() {
                                try {
                                        if (x.readyState != 4) return;
-                                       s.setAttribute('value',x.status + ' : ' + x.statusText);
+                                       s.setAttribute('value', document.getElementById('authStrings').getFormattedString('staff.auth.controller.status', [x.status, x.statusText]));
                                        if (x.status == 200) {
                                                s.setAttribute('style','color: green;');
                                        } else {
@@ -239,14 +240,14 @@ auth.controller.prototype = {
                                } catch(E) {
                                        obj.controller.view.server_prompt.disabled = false;
                                        obj.controller.view.server_prompt.focus();
-                                       s.setAttribute('value','There was an error testing this hostname.');
+                                       s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_hostname'));
                                        s.setAttribute('style','color: red;');
                                        obj.error.sdump('D_ERROR',E);
                                }
                        }
                        x.send(null);
                } catch(E) {
-                       s.setAttribute('value','There was an error testing this hostname.');
+                       s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_hostname'));
                        s.setAttribute('style','color: brown;');
                        obj.error.sdump('D_ERROR',E);
                        obj.controller.view.server_prompt.disabled = false;
@@ -257,7 +258,7 @@ auth.controller.prototype = {
        'test_version' : function(url) {
                var obj = this;
                var s = document.getElementById('version');
-               s.setAttribute('value','Testing version...');
+               s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.testing_version'));
                s.setAttribute('style','color: orange;');
                try {
                        var x = new XMLHttpRequest();
@@ -267,7 +268,7 @@ auth.controller.prototype = {
                        x.onreadystatechange = function() {
                                try {
                                        if (x.readyState != 4) return;
-                                       s.setAttribute('value',x.status + ' : ' + x.statusText);
+                                       s.setAttribute('value', document.getElementById('authStrings').getFormattedString('staff.auth.controller.status', [x.status, x.statusText]));
                                        if (x.status == 200) {
                                                s.setAttribute('style','color: green;');
                                                obj.controller.view.submit_button.disabled = false;
@@ -277,7 +278,7 @@ auth.controller.prototype = {
                                        }
                                        obj.controller.view.server_prompt.disabled = false;
                                } catch(E) {
-                                       s.setAttribute('value','There was an error checking version support.');
+                                       s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_version'));
                                        s.setAttribute('style','color: red;');
                                        obj.error.sdump('D_ERROR',E);
                                        obj.controller.view.server_prompt.disabled = false;
@@ -285,7 +286,7 @@ auth.controller.prototype = {
                        }
                        x.send(null);
                } catch(E) {
-                       s.setAttribute('value','There was an error checking version support.');
+                       s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_version'));
                        s.setAttribute('style','color: brown;');
                        obj.error.sdump('D_ERROR',E);
                        obj.controller.view.server_prompt.disabled = false;
@@ -305,7 +306,7 @@ auth.controller.prototype = {
                                        if (x.status == 200) {
                                                window.open('data:text/html,'+window.escape(x.responseText),'upgrade','chrome,resizable,modal,centered');
                                        } else {
-                                               alert('This server does not support your version of the staff client.  Please check with your system administrator.');
+                                               alert(document.getElementById('authStrings').getString('staff.auth.controller.version_mismatch'));
                                        }
                                        obj.controller.view.server_prompt.disabled = false;
                                } catch(E) {
@@ -324,10 +325,14 @@ auth.controller.prototype = {
 
                var obj = this;
 
-               this.error.sdump('D_AUTH','login with ' 
-                       + this.controller.view.name_prompt.value + ' and ' 
-                       + this.controller.view.password_prompt.value + ' at ' 
-                       + this.controller.view.server_prompt.value + '\n'
+               this.error.sdump('D_AUTH',
+                       document.getElementById('authStrings').getFormattedString(
+                               'staff.auth.controller.error_login', [
+                                       this.controller.view.name_prompt.value,
+                                       this.controller.view.password_prompt.value,
+                                       this.controller.view.server_prompt.value
+                               ]
+                       )
                ); 
                this.controller.view.server_prompt.disabled = true;
                this.controller.view.name_prompt.disabled = true;
@@ -455,7 +460,7 @@ auth.controller.prototype = {
        
                this.error.sdump('D_AUTH','close' + this.w + '\n');
 
-               if (window.confirm('Are you sure you would like to exit the program completely?')) {
+               if (window.confirm(document.getElementById('authStrings').getString('staff.auth.controller.confirm_close'))) {
                        this.logoff();
                        this.w.close(); /* Probably won't go any further */
 
index 80baa7b..db1cff8 100644 (file)
@@ -1,4 +1,5 @@
 dump('entering auth/session.js\n');
+// vim:sw=4:ts=4:noet:
 
 if (typeof auth == 'undefined') auth = {};
 auth.session = function (view,login_type) {
@@ -46,13 +47,13 @@ auth.session.prototype = {
 
                                var robj = this.network.simple_request( 'AUTH_COMPLETE', [ params ]);
 
-                               switch (robj.ilsevent) {
+                               switch (Number(robj.ilsevent)) {
                                        case 0:
                                                this.key = robj.payload.authtoken;
                                                this.authtime = robj.payload.authtime;
                                        break;
                                        case 1520 /* WORKSTATION_NOT_FOUND */:
-                                               alert(params.workstation + ' is not registered with this server.');
+                                               alert(document.getElementById('authStrings').getFormattedString('staff.auth.session.unregistered', [params.workstation]));
                                                delete(params.workstation);
                                                delete(data.ws_info[ this.view.server_prompt.value ]);
                                                data.stash('ws_info');
@@ -82,13 +83,13 @@ auth.session.prototype = {
 
                        } else {
 
-                               var error = 'open-ils.auth.authenticate.init returned false\n';
+                               var error = document.getElementById('authStrings').getString('staff.auth.session.init_false') + '\n';
                                this.error.sdump('D_ERROR',error);
                                throw(error);
                        }
 
                } catch(E) {
-                       alert('Login failed.  Please check your Server Hostname, Username, Password, and your CAPS LOCK key.');
+                       alert(document.getElementById('authStrings').getString('staff.auth.session.login_failed'));
                        //obj.error.standard_unexpected_error_alert('Error on auth.session.init()',E); 
 
                        if (typeof this.on_init_error == 'function') {
index 3675a68..b11012d 100644 (file)
@@ -5,7 +5,7 @@ function $(id) { return document.getElementById(id); }
 function my_init() {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw(document.getElementById('commonStrings').getString('common.jsan.missing')); }
+               if (typeof JSAN == 'undefined') { throw(document.getElementById('offlineStrings').getString('common.jsan.missing')); }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('..');
                JSAN.use('util.error'); g.error = new util.error();
@@ -28,7 +28,7 @@ function my_init() {
                set_opac();
 
        } catch(E) {
-               var err_msg = document.getElementById("commonStrings").getFormattedString("common.exception", ["cat/opac.xul", E]);
+               var err_msg = document.getElementById("offlineStrings").getFormattedString("common.exception", ["cat/opac.xul", E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                alert(err_msg);
        }
@@ -43,7 +43,7 @@ function set_brief_view(reset) {
                { 
                        'set_tab_name' : function(n) { 
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name(document.getElementById('catStrings').getFormattedString("cat.bib_record", [n])); } catch(E) { alert(E); }
+                                       try { window.xulG.set_tab_name(document.getElementById('offlineStrings').getFormattedString("cat.bib_record", [n])); } catch(E) { alert(E); }
                                } else {
                                        dump('no set_tab_name\n');
                                }
@@ -62,24 +62,23 @@ function set_marc_view(reset) {
 }
 
 function set_marc_edit(reset) {
-       var strbundle = document.getElementById('catStrings');
        g.view = 'marc_edit';
        var a = xulG.url_prefix( urls.XUL_MARC_EDIT );
        var b = {};
        var c = {
                        'record' : { 'url' : '/opac/extras/supercat/retrieve/marcxml/record/' + docid },
                        'save' : {
-                               'label' : strbundle.getString('cat.save_record'),
+                               'label' : document.getElementById('offlineStrings').getString('cat.save_record'),
                                'func' : function (new_marcxml) {
                                        try {
                                                var r = g.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), docid, new_marcxml ]);
                                                if (typeof r.ilsevent != 'undefined') {
                                                        throw(r);
                                                } else {
-                                                       alert(strbundle.getString("cat.save.success"));
+                                                       alert(document.getElementById('offlineStrings').getString("cat.save.success"));
                                                }
                                        } catch(E) {
-                                                       g.error.standard_unexpected_error_alert(strbundle.getString("cat.save.failure"), E);
+                                                       g.error.standard_unexpected_error_alert(document.getElementById('offlineStrings').getString("cat.save.failure"), E);
                                        }
                                }
                        }
@@ -158,7 +157,7 @@ function set_opac(reset) {
 
                                win.attachEvt("rdetail", "nextPrevDrawn",
                                        function(rIndex,rCount){
-                                               $('record_pos').setAttribute('value', document.getElementById('catStrings').getFormattedString('cat.record.counter', [(1+rIndex), rCount]));
+                                               $('record_pos').setAttribute('value', document.getElementById('offlineStrings').getFormattedString('cat.record.counter', [(1+rIndex), rCount]));
                                                if (win.rdetailNext) {
                                                        g.f_record_next = function() { 
                                                                g.view_override = g.view; 
@@ -232,12 +231,19 @@ function mark_for_overlay() {
 }
 
 function delete_record() {
-       if (g.error.yns_alert('Are you sure you want to delete title record #' + docid + ' from the catalog?','Delete Record','Delete','Cancel',null,'Check here to confirm this action.') == 0) {
+       if (g.error.yns_alert(
+               document.getElementById('offlineStrings').getFormattedString('cat.opac.delete_record.confirm', [docid]),
+               document.getElementById('offlineStrings').getString('cat.opac.delete_record'),
+               document.getElementById('offlineStrings').getString('cat.opac.delete'),
+               document.getElementById('offlineStrings').getString('cat.opac.cancel'),
+               null,
+               document.getElementById('offlineStrings').getString('cat.opac.record_deleted.confirm')) == 0) {
                var robj = g.network.simple_request('FM_BRE_DELETE',[ses(),docid]);
                if (typeof robj.ilsevent != 'undefined') {
-                       alert('Error deleting Record #' + docid + ' : ' + robj.textcode + ' : ' + robj.desc + '\n');
+                       alert(document.getElementById('offlineStrings').getFormattedString('cat.opac.record_deleted.error',  [docid, robj.textcode, robj.desc]) + '\n');
                } else {
-                       alert('Record deleted.'); refresh_display(docid,true);
+                       alert(document.getElementById('offlineStrings').getString('cat.opac.record_deleted'));
+                       refresh_display(docid,true);
                }
        }
 }
@@ -280,7 +286,7 @@ function set_default() {
                [ ses(), g.data.list.au[0].id(), { 'staff_client.catalog.record_view.default' : g.view } ]
        )
        if (typeof robj.ilsevent != 'undefined') {
-               if (robj.ilsevent != 0) g.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('cat.preference.error'), robj);
+               if (robj.ilsevent != 0) g.error.standard_unexpected_error_alert(document.getElementById('offlineStrings').getString('cat.preference.error'), robj);
        }
 }
 
index a5a5e2b..8ecf5dd 100644 (file)
@@ -30,9 +30,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/cat/opac.js"/>
        
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="catStrings" src="chrome://open_ils_staff_client/locale/cat.properties"/>
-       
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <vbox flex="1">
                <deck id="top_pane"/>
index f95e756..e9d8992 100644 (file)
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script>
        <![CDATA[
-               var circStrings;
-               var commonStrings;
+               var offlineStrings;
 
                function my_init() {
                        try {
-                               circStrings = document.getElementById('circStrings');
-                               commonStrings = document.getElementById('commonStrings');
+                               offlineStrings = document.getElementById('offlineStrings');
 
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw(commonStrings.getString('common.jsan.missing')); }
+                               if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('..');
                                JSAN.use('util.error'); g.error = new util.error();
                                g.error.sdump('D_TRACE','my_init() for offline.xul');
 
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name(circStrings.getString('circ.standalone')); } catch(E) { alert(E); }
+                                       try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
                                }
 
                                g.cgi = new CGI();
@@ -68,7 +66,7 @@
                                update_clock();
 
                        } catch(E) {
-                               var err_msg = commonStrings.getFormattedString('common.exception', ["circ/offline.xul", E]);
+                               var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline.xul", E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
        ]]>
        </script>
 
-       <stringbundleset id="circBundleSet">
-               <stringbundle id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-               <stringbundle id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
-       </stringbundleset>
+    <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1" class="my_overflow">
                <caption label="&staff.circ.offline.main.label;"/>
index 26fa0fe..8c74f39 100644 (file)
@@ -1,20 +1,18 @@
-var commonStrings;
-var circStrings;
+var offlineStrings;
 
 function my_init() {
        try {
-               commonStrings = $('commonStrings');
-               circStrings = $('circStrings');
+               offlineStrings = $('offlineStrings');
 
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw(commonStrings.getString('common.jsan.missing')); }
+               if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('..');
                JSAN.use('util.error'); g.error = new util.error();
                g.error.sdump('D_TRACE','my_init() for offline_checkin.xul');
 
                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                       try { window.xulG.set_tab_name(circStrings.getString('circ.standalone')); } catch(E) { alert(E); }
+                       try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
                }
 
                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
@@ -40,7 +38,7 @@ function my_init() {
                if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
 
        } catch(E) {
-               var err_msg = commonStrings.getFormattedString('common.exception', ["circ/offline_checkin.xul", E]);
+               var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_checkin.xul", E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                alert(err_msg);
        }
@@ -59,7 +57,7 @@ function handle_keypress(ev) {
 function handle_enter(ev) {
        JSAN.use('util.barcode');
        if ( ($('strict_i_barcode').checked) && (! util.barcode.check($('i_barcode').value)) ) {
-               var r = g.error.yns_alert(circStrings.getString('circ.bad_checkdigit'),circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+               var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                if (r == 1) {
                        setTimeout(
                                function() {
index 8211c2f..d19616d 100644 (file)
@@ -29,8 +29,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="offline_checkin.js"/>
 
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1">
                <caption label="&staff.circ.offline_checkin.main.label;"/>
index 4a90ab9..19da674 100644 (file)
@@ -1,13 +1,11 @@
-var commonStrings;
-var circStrings;
+var offlineStrings;
 
 function my_init() {
        try {
-               commonStrings = $('commonStrings');
-               circStrings = $('circStrings');
+               offlineStrings = $('offlineStrings');
 
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw(commonStrings.getString('common.jsan.missing')); }
+               if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('..');
                JSAN.use('util.error'); g.error = new util.error();
@@ -16,7 +14,7 @@ function my_init() {
                JSAN.use('util.widgets'); JSAN.use('util.file');
 
                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                       try { window.xulG.set_tab_name(circStrings.getString('circ.standalone')); } catch(E) { alert(E); }
+                       try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
                }
 
                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
@@ -59,28 +57,28 @@ function my_init() {
                if (file._file.exists()) {
                        list_data = file.get_object(); file.close();
                        ml = util.widgets.make_menulist( 
-                               [ [circStrings.getString('circ.offline_checkout.nonbarcoded'), ''] ].concat(list_data[0]), 
+                               [ [offlineStrings.getString('circ.offline_checkout.nonbarcoded'), ''] ].concat(list_data[0]), 
                                list_data[1] 
                        );
                        ml.setAttribute('id','noncat_type_menu'); $('x_noncat_type').appendChild(ml);
                        ml.addEventListener(
                                'command',
                                function(ev) { 
-                                       var count = window.prompt(circStrings.getString('circ.offline_checkout.items'),1,ml.getAttribute('label'));
+                                       var count = window.prompt(offlineStrings.getString('circ.offline_checkout.items'),1,ml.getAttribute('label'));
                                        append_to_list('noncat',count); 
                                        ml.value = '';
                                },
                                false
                        );
                } else {
-                       alert(circStrings.getString('circ.offline_checkout.download.warning'));
+                       alert(offlineStrings.getString('circ.offline_checkout.download.warning'));
                }
 
                var file = new util.file('offline_delta'); 
                if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
 
        } catch(E) {
-               var err_msg = commonStrings.getFormattedString('common.exception', ["circ/offline_checkout.xul", E]);
+               var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_checkout.xul", E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                alert(err_msg);
        }
@@ -93,7 +91,7 @@ function test_patron(ev) {
                var barcode = ev.target.value;
                JSAN.use('util.barcode');
                if ( ($('strict_p_barcode').checked) && (! util.barcode.check(barcode)) ) {
-                       var r = g.error.yns_alert(circStrings.getString('circ.bad_checkdigit'),circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+                       var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                        if (r == 1) {
                                setTimeout(
                                        function() {
@@ -108,15 +106,15 @@ function test_patron(ev) {
                if (g.data.bad_patrons[barcode]) {
                        var code;
                        switch(g.data.bad_patrons[barcode]) {
-                               case 'L' : code = commonStrings.getString('common.barcode.status.warning.lost'); break;
-                               case 'E' : code = commonStrings.getString('common.barcode.status.warning.expired'); break;
-                               case 'B' : code = commonStrings.getString('common.barcode.status.warning.barred'); break;
-                               case 'D' : code = commonStrings.getString('common.barcode.status.warning.blocked'); break;
-                               default : code = commonStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
+                               case 'L' : code = offlineStrings.getString('common.barcode.status.warning.lost'); break;
+                               case 'E' : code = offlineStrings.getString('common.barcode.status.warning.expired'); break;
+                               case 'B' : code = offlineStrings.getString('common.barcode.status.warning.barred'); break;
+                               case 'D' : code = offlineStrings.getString('common.barcode.status.warning.blocked'); break;
+                               default : code = offlineStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
                        }
 
-                       var msg = commonStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
-                       var r = g.error.yns_alert(msg,circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+                       var msg = offlineStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
+                       var r = g.error.yns_alert(msg,offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                        if (r == 1) {
                                setTimeout(
                                        function() {
@@ -134,9 +132,9 @@ function test_patron(ev) {
 function check_date(ev) {
        JSAN.use('util.date');
        try {
-               if (! util.date.check('YYYY-MM-DD',ev.target.value) ) { throw(commonStrings.getString('common.date.invalid')); }
-               if (util.date.check_past('YYYY-MM-DD',ev.target.value) ) { throw(circStrings.getString('circ.offline_checkout.date.early')); }
-               if (util.date.formatted_date(new Date(),'%F') == ev.target.value) { throw(circStrings.getString('circ.offline_checkout.date.early')); }
+               if (! util.date.check('YYYY-MM-DD',ev.target.value) ) { throw(offlineStrings.getString('common.date.invalid')); }
+               if (util.date.check_past('YYYY-MM-DD',ev.target.value) ) { throw(offlineStrings.getString('circ.offline_checkout.date.early')); }
+               if (util.date.formatted_date(new Date(),'%F') == ev.target.value) { throw(offlineStrings.getString('circ.offline_checkout.date.early')); }
        } catch(E) {
                alert(E);
                var today = new Date();
@@ -158,7 +156,7 @@ function handle_keypress(ev) {
 function handle_enter(ev) {
        JSAN.use('util.barcode');
        if ( ($('strict_i_barcode').checked) && (! util.barcode.check($('i_barcode').value)) ) {
-               var r = g.error.yns_alert(circStrings.getString('circ.bad_checkdigit'),circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+               var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                if (r == 1) {
                        setTimeout(
                                function() {
@@ -197,7 +195,7 @@ function append_to_list(checkout_type,count) {
 
                var p_barcode = $('p_barcode').value;
                if (! p_barcode) {
-                       g.error.yns_alert(circStrings.getString('circ.barcode.enter'),circStrings.getString('circ.offline_checkout.required_field'),commonStrings.getString('common.ok'),null,null,commonStrings.getString('common.confirm'));
+                       g.error.yns_alert(offlineStrings.getString('circ.barcode.enter'),offlineStrings.getString('circ.offline_checkout.required_field'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
                        return;
                } else {
 
@@ -216,7 +214,7 @@ function append_to_list(checkout_type,count) {
                                var rows = g.list.dump_with_keys();
                                for (var i = 0; i < rows.length; i++) {
                                        if (rows[i].barcode == i_barcode) {
-                                               g.error.yns_alert(circStrings.getString('circ.duplicate_scan.msg'),circStrings.getString('circ.duplicate_scan.field'),commonStrings.getString('common.ok'),null,null,commonStrings.getString('common.confirm'));
+                                               g.error.yns_alert(offlineStrings.getString('circ.duplicate_scan.msg'),offlineStrings.getString('circ.duplicate_scan.field'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
                                                return;
                                        }
                                }
@@ -225,7 +223,7 @@ function append_to_list(checkout_type,count) {
                        break;
                        case 'noncat' :
                                count = parseInt(count); if (! (count>0) ) {
-                                       g.error.yns_alert(circStrings.getString('circ.offline_checkout.valid_count'),circStrings.getString('circ.offline_checkout.required_value'),commonStrings.getString('common.ok'),null,null,commonStrings.getString('common.confirm'));
+                                       g.error.yns_alert(offlineStrings.getString('circ.offline_checkout.valid_count'),offlineStrings.getString('circ.offline_checkout.required_value'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
                                        return;
                                }
                                my.barcode = $('noncat_type_menu').getAttribute('label');
@@ -233,7 +231,7 @@ function append_to_list(checkout_type,count) {
                                my.noncat_type = JSON2js($('noncat_type_menu').value)[0];
                                my.noncat_count = count;
                        break;
-                       default: alert(commonStrings.getString('common.error.default')); break;
+                       default: alert(offlineStrings.getString('common.error.default')); break;
                }
        
                g.list.append( { 'row' : { 'my' : my }, 'to_top' : true } );
index 4d0aede..b4d23df 100644 (file)
@@ -29,8 +29,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="offline_checkout.js"/>
 
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1">
                <caption label="&staff.circ.offline_checkout.main.label;"/>
index 9f825cc..8aa5d2a 100644 (file)
@@ -1,20 +1,18 @@
-var commonStrings;
-var circStrings;
+var offlineStrings;
 
 function my_init() {
        try {
-               commonStrings = document.getElementById('commonStrings');
-               circStrings = document.getElementById('circStrings');
+               offlineStrings = document.getElementById('offlineStrings');
 
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw(commonStrings.getString('common.jsan.missing')); }
+               if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('..');
                JSAN.use('util.error'); g.error = new util.error();
                g.error.sdump('D_TRACE','my_init() for offline_checkout.xul');
 
                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                       try { window.xulG.set_tab_name(circStrings.getString('circ.standalone')); } catch(E) { alert(E); }
+                       try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
                }
 
                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
@@ -37,7 +35,7 @@ function my_init() {
                if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
 
        } catch(E) {
-               var err_msg = commonStrings.getFormattedString('common.exception', ["circ/offline_in_house_use.xul", E]);
+               var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_in_house_use.xul", E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                alert(err_msg);
        }
@@ -56,7 +54,7 @@ function handle_keypress(ev) {
 function handle_enter(ev) {
        JSAN.use('util.barcode');
        if ( ($('strict_i_barcode').checked) && (! util.barcode.check($('i_barcode').value)) ) {
-               var r = g.error.yns_alert(circStrings.getString('circ.bad_checkdigit'),circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+               var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                if (r == 1) {
                        setTimeout(
                                function() {
index fb6f7a1..91ec999 100644 (file)
@@ -29,8 +29,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="offline_in_house_use.js"/>
 
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1">
                <caption label="&staff.circ.offline_in_house_use.main.label;"/>
index 4f2a8f7..f2c94d0 100644 (file)
@@ -1,13 +1,11 @@
-var commonStrings;
-var circStrings;
+var offlineStrings;
 
 function my_init() {
        try {
-               commonStrings = $('commonStrings');
-               circStrings = $('circStrings');
+               offlineStrings = $('offlineStrings');
 
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw(commonStrings.getString('common.jsan.missing')); }
+               if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('..');
                JSAN.use('util.error'); g.error = new util.error();
@@ -16,7 +14,7 @@ function my_init() {
                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
 
                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                       try { window.xulG.set_tab_name(circStrings.getString('circ.standalone')); } catch(E) { alert(E); }
+                       try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
                }
 
                $('barcode').addEventListener('change',test_patron,false);
@@ -34,7 +32,7 @@ function my_init() {
                        ml = util.widgets.make_menulist( list_data[0], list_data[1] );
                        ml.setAttribute('id','home_ou'); $('x_home_ou').appendChild(ml);
                } else {
-                       errors += circStrings.getString('circ.offline_register.missing.library.list') + "\n";
+                       errors += offlineStrings.getString('circ.offline_register.missing.library.list') + "\n";
                }
 
                file = new util.file('offline_pgt_list');
@@ -43,7 +41,7 @@ function my_init() {
                        ml = util.widgets.make_menulist( list_data[0], list_data[1] );
                        ml.setAttribute('id','profile'); $('x_profile').appendChild(ml);
                } else {
-                       errors += circStrings.getString('circ.offline_register.missing.profile.list') + "\n";
+                       errors += offlineStrings.getString('circ.offline_register.missing.profile.list') + "\n";
                }
 
                file = new util.file('offline_cit_list'); 
@@ -52,7 +50,7 @@ function my_init() {
                        ml = util.widgets.make_menulist( list_data[0], list_data[1] );
                        ml.setAttribute('id','ident_type'); $('x_ident_type').appendChild(ml);
                } else {
-                       errors += circStrings.getString('circ.offline_register.missing.id.type.list') + "\n";
+                       errors += offlineStrings.getString('circ.offline_register.missing.id.type.list') + "\n";
                }
 
                file = new util.file('offline_asv_list'); 
@@ -60,11 +58,11 @@ function my_init() {
                        list_data = file.get_object(); file.close();
                        render_surveys('x_surveys', list_data);
                } else {
-                       errors += circStrings.getString('circ.offline_register.missing.required.surveys');
+                       errors += offlineStrings.getString('circ.offline_register.missing.required.surveys');
                }
 
                if (errors != '') {
-                       alert(circStrings.getString('circ.offline_register.missing.files.error') + errors);
+                       alert(offlineStrings.getString('circ.offline_register.missing.files.error') + errors);
                        location.href = 'about:blank';
                }
 
@@ -77,7 +75,7 @@ function my_init() {
                if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
 
        } catch(E) {
-               var err_msg = commonStrings.getFormattedString('common.exception', ["circ/offline_register.xul", E]);
+               var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_register.xul", E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                alert(err_msg);
        }
@@ -90,7 +88,7 @@ function test_patron(ev) {
                var barcode = ev.target.value;
                JSAN.use('util.barcode');
                if ( ! util.barcode.check(ev.target.value) ) {
-                       var r = g.error.yns_alert(circStrings.getString('circ.bad_checkdigit'),circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+                       var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                        if (r == 1) {
                                setTimeout(
                                        function() {
@@ -104,15 +102,15 @@ function test_patron(ev) {
                if (g.data.bad_patrons[barcode]) {
                        var code;
                        switch(g.data.bad_patrons[barcode]) {
-                               case 'L' : code = commonStrings.getString('common.barcode.status.warning.lost'); break;
-                               case 'E' : code = commonStrings.getString('common.barcode.status.warning.expired'); break;
-                               case 'B' : code = commonStrings.getString('common.barcode.status.warning.barred'); break;
-                               case 'D' : code = commonStrings.getString('common.barcode.status.warning.blocked'); break;
-                               default : code = commonStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
+                               case 'L' : code = offlineStrings.getString('common.barcode.status.warning.lost'); break;
+                               case 'E' : code = offlineStrings.getString('common.barcode.status.warning.expired'); break;
+                               case 'B' : code = offlineStrings.getString('common.barcode.status.warning.barred'); break;
+                               case 'D' : code = offlineStrings.getString('common.barcode.status.warning.blocked'); break;
+                               default : code = offlineStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
                        }
 
-                       var msg = commonStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
-                       var r = g.error.yns_alert(msg,circStrings.getString('circ.barcode.warning'),commonStrings.getString('common.ok'),commonStrings.getString('common.clear'),null,commonStrings.getString('common.confirm'));
+                       var msg = offlineStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
+                       var r = g.error.yns_alert(msg,offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
                        if (r == 1) {
                                setTimeout(
                                        function() {
@@ -134,9 +132,9 @@ function handle_check_date(ev) {
 function check_date(value) {
        JSAN.use('util.date');
        try {
-               if (! util.date.check('YYYY-MM-DD',value) ) { throw(commonStrings.getString('common.date.invalid')); }
-               if (! util.date.check_past('YYYY-MM-DD',value) ) { throw(circStrings.getString('circ.offline_register.future.birth.date')); }
-               if ( util.date.formatted_date(new Date(),'%F') == value) { throw(circStrings.getString('circ.offline_register.invalid.birth.date')); }
+               if (! util.date.check('YYYY-MM-DD',value) ) { throw(offlineStrings.getString('common.date.invalid')); }
+               if (! util.date.check_past('YYYY-MM-DD',value) ) { throw(offlineStrings.getString('circ.offline_register.future.birth.date')); }
+               if ( util.date.formatted_date(new Date(),'%F') == value) { throw(offlineStrings.getString('circ.offline_register.invalid.birth.date')); }
        } catch(E) {
                alert(E);
                value = '';
@@ -164,7 +162,7 @@ function render_surveys(node,obj) {
                        x_gb.appendChild(x_hb);
                        var x_spacer = document.createElement('spacer'); x_spacer.setAttribute('flex','1');
                        x_hb.appendChild(x_spacer);
-                       var x_ml = util.widgets.make_menulist( [ [circStrings.getString('circ.offline_register.survey.prompt'),''] ].concat(question.answers) );
+                       var x_ml = util.widgets.make_menulist( [ [offlineStrings.getString('circ.offline_register.survey.prompt'),''] ].concat(question.answers) );
                        x_ml.setAttribute('name','survey'); x_hb.appendChild(x_ml);
                }
        }
@@ -181,91 +179,91 @@ function handle_keypress(ev) {
 function check_patron(obj) {
        var errors = '';
        if (! obj.user.billing_address.post_code ) {
-               errors += circStrings.getString('circ.offline_register.missing.post_code') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.post_code') + "\n";
                $('post_code').focus();
                $('post_code').parentNode.setAttribute('style','background-color: red');
        } else {
                $('post_code').parentNode.setAttribute('style','');
        }
        if (! obj.user.billing_address.state ) {
-               errors += circStrings.getString('circ.offline_register.missing.state') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.state') + "\n";
                $('state').focus();
                $('state').parentNode.setAttribute('style','background-color: red');
        } else {
                $('state').parentNode.setAttribute('style','');
        }
        if (! obj.user.billing_address.city ) {
-               errors += circStrings.getString('circ.offline_register.missing.city') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.city') + "\n";
                $('city').focus();
                $('city').parentNode.setAttribute('style','background-color: red');
        } else {
                $('city').parentNode.setAttribute('style','');
        }
        if (! obj.user.billing_address.street1 ) {
-               errors += circStrings.getString('circ.offline_register.missing.street1') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.street1') + "\n";
                $('street1').focus();
                $('street1').parentNode.setAttribute('style','background-color: red');
        } else {
                $('street1').parentNode.setAttribute('style','');
        }
        if (! obj.user.ident_value ) {
-               errors += circStrings.getString('circ.offline_register.missing.ident_value') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.ident_value') + "\n";
                $('ident_value').focus();
                $('ident_value').parentNode.setAttribute('style','background-color: red');
        } else {
                $('ident_value').parentNode.setAttribute('style','');
        }
        if (! obj.user.ident_type ) {
-               errors += circStrings.getString('circ.offline_register.missing.ident_type') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.ident_type') + "\n";
                $('ident_type').focus();
                $('ident_type').parentNode.setAttribute('style','background-color: red');
        } else {
                $('ident_type').parentNode.setAttribute('style','');
        }
        if (! obj.user.dob ) {
-               errors += circStrings.getString('circ.offline_register.missing.dob') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.dob') + "\n";
                $('dob').focus();
                $('dob').parentNode.parentNode.setAttribute('style','background-color: red');
        } else {
                $('dob').parentNode.parentNode.setAttribute('style','');
        }
        if (! obj.user.first_given_name ) {
-               errors += circStrings.getString('circ.offline_register.missing.first_given_name') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.first_given_name') + "\n";
                $('first_given_name').focus();
                $('first_given_name').parentNode.setAttribute('style','background-color: red');
        } else {
                $('first_given_name').parentNode.setAttribute('style','');
        }
        if (! obj.user.family_name ) {
-               errors += circStrings.getString('circ.offline_register.missing.family_name') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.family_name') + "\n";
                $('family_name').focus();
                $('family_name').parentNode.setAttribute('style','background-color: red');
        } else {
                $('family_name').parentNode.setAttribute('style','');
        }
        if (! obj.user.passwd ) {
-               errors += circStrings.getString('circ.offline_register.missing.passwd') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.passwd') + "\n";
                $('passwd').focus();
                $('passwd').parentNode.setAttribute('style','background-color: red');
        } else {
                $('passwd').parentNode.setAttribute('style','');
        }
        if (! obj.user.card.barcode ) {
-               errors += circStrings.getString('circ.offline_register.missing.barcode') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.barcode') + "\n";
                $('barcode').focus();
                $('barcode').parentNode.setAttribute('style','background-color: red');
        } else {
                $('barcode').parentNode.setAttribute('style','');
        }
        if (! obj.user.profile ) {
-               errors += circStrings.getString('circ.offline_register.missing.profile') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.profile') + "\n";
                $('profile').focus();
                $('profile').parentNode.setAttribute('style','background-color: red');
        } else {
                $('profile').parentNode.setAttribute('style','');
        }
        if (! obj.user.home_ou ) {
-               errors += circStrings.getString('circ.offline_register.missing.home_ou') + "\n";
+               errors += offlineStrings.getString('circ.offline_register.missing.home_ou') + "\n";
                $('home_ou').focus();
                $('home_ou').parentNode.setAttribute('style','background-color: red');
        } else {
@@ -309,7 +307,7 @@ function next_patron() {
                try {
                        check_patron(obj);
                } catch(E) {
-                       alert(circStrings.getString('circ.offline_register.missing.alert') + "\n" + E);
+                       alert(offlineStrings.getString('circ.offline_register.missing.alert') + "\n" + E);
                        return;
                }
 
@@ -318,7 +316,7 @@ function next_patron() {
                file.append_object(obj);
                file.close();
 
-               alert(circStrings.getString('circ.offline_register.patron.saved'));
+               alert(offlineStrings.getString('circ.offline_register.patron.saved'));
 
                $('passwd').value = parseInt(Math.random()*8999+1000);
                $('barcode').value = ''; $('ident_value').value = ''; $('first_given_name').value = '';
index a1d4287..e6d9fdc 100644 (file)
@@ -29,8 +29,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="offline_register.js"/>
 
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1">
                <caption label="&staff.circ.offline_register.main.label;"/>
index 1892e1e..a877f0c 100644 (file)
@@ -1,5 +1,7 @@
+var offlineStrings;
 function my_init() {
        try {
+               offlineStrings = $('offlineStrings');
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
                JSAN.errorLevel = "die"; // none, warn, or die
index e8a27bf..44332d4 100644 (file)
@@ -29,8 +29,7 @@
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="offline_renew.js"/>
 
-       <messagecatalog id="commonStrings" src="chrome://open_ils_staff_client/locale/common.properties"/>
-       <messagecatalog id="circStrings" src="chrome://open_ils_staff_client/locale/circ.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
 
        <groupbox flex="1">
                <caption label="&staff.circ.offline_renew.main.label;"/>
diff --git a/Open-ILS/xul/staff_client/chrome/content/legacy/_browse.xul b/Open-ILS/xul/staff_client/chrome/content/legacy/_browse.xul
deleted file mode 100644 (file)
index 93837ae..0000000
+++ /dev/null
@@ -1,646 +0,0 @@
-<?xml version="1.0"?>
-<!-- Application: Evergreen Staff Client -->
-<!-- Screen: Cataloger's Search Result Screen -->
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- PRESENTATION -->
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- LOCALIZATION -->
-<!DOCTYPE window SYSTEM "chrome://open_ils_staff_client/locale/lang.dtd">
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- OVERLAYS -->
-<?xul-overlay href="chrome://open_ils_staff_client/content/OpenILS/util_overlay.xul"?>
-<?xul-overlay href="chrome://open_ils_staff_client/content/legacy/browse_list_overlay.xul"?>
-
-<window id="browse_list_win"
-       orient="vertical" style="overflow: scroll" 
-       onload="try { my_pre_init(); } catch(E) { alert(E); }"
-       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-       <!-- BEHAVIOR -->
-       <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/constants.js"/>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/OpenILS/util/fmall.js"/>
-       <scripts id="openils_util_scripts"/>
-       <script type="text/javascript">
-       <![CDATA[
-
-               var parentWindow = {};
-               var params = {};
-               var mw = {};
-               var find_this_id;
-
-               var org_shortname2id = {};
-               var my_treerow;
-               var browse_meter_per = 0;
-               var orgs_with_copies = [];
-               var orgs_with_copies_hash = {};
-
-               function my_pre_init() {
-                       try {
-                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
-                               JSAN.errorLevel = "die"; // none, warn, or die
-                               JSAN.addRepository('..');
-                               JSAN.use('util.error'); g.error = new util.error();
-                               g.error.sdump('D_TRACE','my_pre_init() for legacy/_browse.xul');
-
-                               mw.G = {};
-                               mw.G.main_test_variable = 'Hello World';
-                               g.cgi = new CGI();
-                               mw.G.auth_ses = [ ses() ];
-                               mw.sdump = function(a,b) { g.error.sdump(a,b); }
-
-                               find_this_id = g.cgi.param('docid');
-
-                               JSAN.use('util.network');
-                               g.network = new util.network();
-
-                               JSAN.use('OpenILS.data');
-                               g.data = new OpenILS.data(); g.data.init({'via':'stash'});
-                               XML_HTTP_SERVER = g.data.server_unadorned;
-
-                               mw.G.my_orgs = g.data.list.my_aou;
-                               mw.G.my_orgs_hash = g.data.hash.my_aou;
-                               mw.G.org_tree = g.data.tree.aou;
-                               mw.G.user_ou = g.data.hash.aou[ g.data.list.au[0].home_ou() ];
-                               mw.G.aout_list = g.data.list.aout;
-                               mw.G.aout_hash = g.data.hash.aout;
-                               mw.G.ccs_list = g.data.list.ccs;
-                               mw.G.ccs_hash = g.data.hash.ccs;
-
-                               var x = document.getElementById('cmd_copy_edit');
-                               x.setAttribute('oncommand','try{spawn_copy_editor();}catch(E){alert(E);}');
-
-                               x = document.getElementById('cmd_copy_add');
-                               x.setAttribute('oncommand','try{spawn_copy_add_wizard();}catch(E){alert(E);}');
-
-                               x = document.getElementById('cmd_volume_edit');
-                               x.setAttribute('oncommand','try{spawn_volume_editor();}catch(E){alert(E);}');
-
-                               x = document.getElementById('cmd_volume_add');
-                               x.setAttribute('oncommand','try{spawn_volume_add_wizard();}catch(E){alert(E);}');
-
-                               x = document.getElementById('browse_list_tree');
-                               x.setAttribute('seltype','multiple');
-
-                               my_init();
-       
-                       } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\nlegacy/_browse.xul\n" + E + '\n';
-                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
-                               alert(err_msg);
-                       }
-               }
-
-               function timer_init() {
-                       return '';
-               }
-
-               function timer_elapsed() {
-                       return '';
-               }
-
-               function handle_error(err) {
-                       try { alert(js2JSON(err)); } catch(E) { alert(err); }
-               }
-
-               function user_request(a,b,c,d) {
-                       return [ g.network.request(a,b,c,d) ];
-               }
-
-               function user_async_request(a,b,c,d) {
-                       return [ g.network.request(a,b,c,d) ];
-               }
-
-               var counter = {};
-
-               function counter_init(id) {
-                       counter[id] = 0;
-               }
-
-               function counter_incr(id) {
-                       if (! counter[id]) { counter_init(id); }
-                       return ++counter[id];
-               }
-
-               function counter_peek(id) {
-                       if (! counter[id]) { return 0; }
-                       return counter[id];
-               }
-
-               function disable_widgets() {
-                       var d = document; var idx = 0;
-                       if (arguments[0].nodeName == '#document') {
-                               idx = 1; d = arguments[0];
-                       }
-                       for (var i = idx; i < arguments.length; i++) {
-                               if (typeof(arguments[i]) == 'object') {
-                                       arguments[i].disabled = true;
-                               } else {
-                                       var w = d.getElementById( arguments[i] );
-                                       if (w) { 
-                                               w.disabled = true; 
-                                       }
-                               }
-                       }
-               }
-
-               function enable_widgets() {
-                       var d = document; var idx = 0;
-                       if (arguments[0].nodeName == '#document') {
-                               idx = 1; d = arguments[0];
-                       }
-                       for (var i = idx; i < arguments.length; i++) {
-                               if (typeof(arguments[i]) == 'object') {
-                                       arguments[i].disabled = false;
-                               } else {
-                                       var w = d.getElementById( arguments[i] );
-                                       if (w) { 
-                                               w.disabled = false; 
-                                       }
-                               }
-                       }
-               }
-
-               function find_ou(tree,id) {
-                       if (typeof(id)=='object') { id = id.id(); }
-                       if (tree.id()==id) {
-                               return tree;
-                       }
-                       for (var i in tree.children()) {
-                               var child = tree.children()[i];
-                               ou = find_ou( child, id );
-                               if (ou) { return ou; }
-                       }
-                       return null;
-               }
-
-               function yesno(value) {
-                       switch(value) {
-                               case true: case 'true': case '1': case 'on':
-                                       return 'Yes';
-                               default: 
-                                       return 'No';
-                       }
-               }
-
-               function empty_widget() {
-                       var d; var e;
-                       if (arguments.length == 1) {
-                               e = arguments[0];
-                       } else {
-                               d = arguments[0];
-                               e = arguments[1];
-                               if (typeof(e) != 'object') { e = d.getElementById(e); }
-                       }
-                       if (typeof(e) != 'object') { dump('Failed on empty_widget\n'); return null; }
-                       while (e.lastChild) { e.removeChild(e.lastChild); }
-               }
-
-               function get_list_from_tree_selection() {
-                       var d = document; var tree_w;
-                       if (arguments.length == 1) {
-                               tree_w = arguments[0];
-                       } else {
-                               d = arguments[0];
-                               tree_w = arguments[1];
-                       }
-                       var hitlist;
-                       if (typeof(tree_w) != 'object') {
-                               hitlist = d.getElementById(tree_w);
-                       } else {
-                               hitlist = tree_w;
-                       }
-                       var list = [];
-                       var start = new Object();
-                       var end = new Object();
-                       var numRanges = hitlist.view.selection.getRangeCount();
-                       for (var t=0; t<numRanges; t++){
-                               hitlist.view.selection.getRangeAt(t,start,end);
-                               for (var v=start.value; v<=end.value; v++){
-                                       var i = hitlist.contentView.getItemAtIndex(v);
-                                       //sdump('D_WIDGETS',i.tagName + '\n');
-                                       list.push( i );
-                               }
-                       }
-                       return list;
-               }
-
-               function filter_list(list,f) {
-                       var new_list = [];
-                       for (var i in list) {
-                               var t = f( list[i] );
-                               if (t) new_list.push( list[i] );
-                       }
-                       return new_list;
-               }
-
-               function cycle_attribute() {
-                       var d; var e; var a; var v;
-                       if (arguments.length == 3) {
-                               e = arguments[0];
-                               a = arguments[1];
-                               v = arguments[2];
-                       } else {
-                               d = arguments[0];
-                               e = arguments[1];
-                               a = arguments[2];
-                               v = arguments[3];
-                               if (typeof(e) != 'object') { e = d.getElementById(e); }
-                       }
-                       try {
-                               if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
-                               if (!a) { throw('!a : a = ' + a); }
-                               if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
-                               if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
-
-                               var toggle = e.getAttribute(a);
-                               var next_one = false;
-                               for (var i = 0; i < v.length; i++) {
-                                       if (next_one) {
-                                               e.setAttribute(a,v[i]);
-                                               return v[i];
-                                       }
-                                       if (toggle == v[i]) {
-                                               next_one = true;
-                                       }
-                               }
-                               if (next_one) {
-                                       e.setAttribute(a,v[0]);
-                                       return v[0];
-                               } else {
-                                       throw('current value not in list');
-                               }
-                       } catch(E) {
-                               return null;
-                       }
-               }
-
-
-               function mapChrome(chrome) {
-                       switch(chrome) {
-                               case 'chrome://open_ils_staff_client/content/cat/volume_copy_add_wizard.xul':
-                                       return 'chrome://open_ils_staff_client/content/legacy/_volume_copy_add_wizard.xul'; break;
-                               case 'chrome://open_ils_staff_client/content/cat/copy_add_wizard.xul':
-                                       return 'chrome://open_ils_staff_client/content/legacy/_copy_add_wizard.xul'; break;
-                               case 'chrome://open_ils_staff_client/content/cat/volume_edit_wizard.xul':
-                                       return 'chrome://open_ils_staff_client/content/legacy/_volume_edit_wizard.xul'; break;
-                       }
-                       return '';
-               }
-
-               parentWindow.new_tab = function() { };
-
-               parentWindow.replace_tab = function(a,b,c) {
-                       if (window.xulG && typeof window.xulG.new_tab == 'function') {
-                               try {
-                                       var f = window.xulG.new_tab( mapChrome(c), { 'tab_name' : b }, {} );
-                                       return f.contentWindow;
-                               } catch(E) {
-                                       alert(E);
-                               }
-                       }
-               }
-
-               mw.new_window = function(a,b,c) {
-                       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                       JSAN.use('util.window'); var win = new util.window();
-                       return win.open( mapChrome(a), b, c );
-               }
-
-               function spawn_copy_editor() {
-
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'copy';
-                               }
-                       );
-
-                       var edit = 0;
-                       try {
-                               edit = g.network.request(
-                                       api.PERM_MULTI_ORG_CHECK.app,
-                                       api.PERM_MULTI_ORG_CHECK.method,
-                                       [ 
-                                               ses(), 
-                                               g.data.list.au[0].id(), 
-                                               util.functional.map_list(
-                                                       list,
-                                                       function (o) {
-                                                               return o.getAttribute('ou_id');
-                                                       }
-                                               ),
-                                               [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                                       ]
-                               ).length == 0 ? 1 : 0;
-                       } catch(E) {
-                               g.error.sdump('D_ERROR','batch permission check: ' + E);
-                       }
-
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('copy_id');
-                               }
-                       );
-
-                       var title = list.length == 1 ? 'Copy' : 'Copies';
-
-                       JSAN.use('util.window'); var win = new util.window();
-                       g.data.temp = '';
-                       g.data.stash('temp');
-                       var w = win.open(
-                               window.xulG.url_prefix(urls.XUL_COPY_EDITOR)
-                                       +'?copy_ids='+window.escape(js2JSON(list))
-                                       +'&docid='+window.escape(find_this_id)
-                                       +'&edit='+edit
-                                       +'&handle_update=1',
-                               title,
-                               'chrome,modal,resizable'
-                       );
-                       /* FIXME -- need to unique the temp space, and not rely on modalness of window */
-                       g.data.stash_retrieve();
-                       var copies = JSON2js( g.data.temp );
-                       g.error.sdump('D_CAT','in browse, copies =\n<<' + copies + '>>');
-                       if (edit=='1' && copies!='' && typeof copies != 'undefined') {
-                               refresh_browse_list();
-                       }
-               }
-
-               function spawn_volume_editor() {
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'volume';
-                               }
-                       );
-                       
-                       var edit = 0;
-                       try {
-                               edit = g.network.request(
-                                       api.PERM_MULTI_ORG_CHECK.app,
-                                       api.PERM_MULTI_ORG_CHECK.method,
-                                       [ 
-                                               ses(), 
-                                               g.data.list.au[0].id(), 
-                                               util.functional.map_list(
-                                                       list,
-                                                       function (o) {
-                                                               return o.getAttribute('ou_id');
-                                                       }
-                                               ),
-                                               [ 'UPDATE_VOLUME' ]
-                                       ]
-                               ).length == 0 ? 1 : 0;
-                       } catch(E) {
-                               g.error.sdump('batch permission check: ' + E);
-                       }
-
-                       if (edit==0) return; // no read-only view for this interface
-
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       return [ o.getAttribute('ou_id'), o.getAttribute('volume_id'), o.getAttribute('callnumber') ];
-                               }
-                       );
-
-                       var title = list.length == 1 ? 'Volume' : 'Volumes';
-
-                       JSAN.use('util.window'); var win = new util.window();
-                       g.data.temp = '';
-                       g.data.stash('temp');
-                       var w = win.open(
-                               window.xulG.url_prefix(urls.XUL_VOLUME_EDITOR)
-                                       +'?ou_id_volume_id_callnumber_tuples=' + window.escape( js2JSON(list) ),
-                               title,
-                               'chrome,modal,resizable'
-                       );
-
-                       /* FIXME -- need to unique the temp space, and not rely on modalness of window */
-                       g.data.stash_retrieve();
-                       var volumes = JSON2js( g.data.temp );
-                       g.error.sdump('D_CAT','in browse, g.data.temp =\n' + g.data.temp);
-                       if (volumes=='') return;
-               
-                       volumes = util.functional.filter_list(
-                               volumes,
-                               function (o) {
-                                       return o.ischanged() == '1';
-                               }
-                       );
-
-                       volumes = util.functional.map_list(
-                               volumes,
-                               function (o) {
-                                       o.record( find_this_id ); // staff client 2 didn't do this.  Does it matter?
-                                       return o;
-                               }
-                       );
-
-                       if (volumes.length == 0) return;
-
-                       try {
-                               var r = g.network.request(
-                                       api.FM_ACN_TREE_UPDATE.app,
-                                       api.FM_ACN_TREE_UPDATE.method,
-                                       [ ses(), volumes ]
-                               );
-                               /* FIXME -- revisit the return value here */
-                       } catch(E) {
-                               alert('volume update error: ' + js2JSON(E));
-                       }
-                       refresh_browse_list();
-
-               }
-
-               function spawn_volume_add_wizard() {
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'org_unit';
-                               }
-                       );
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('ou_id');
-                               }
-                       )               
-                       var edit = 0;
-                       try {
-                               edit = g.network.request(
-                                       api.PERM_MULTI_ORG_CHECK.app,
-                                       api.PERM_MULTI_ORG_CHECK.method,
-                                       [ 
-                                               ses(), 
-                                               g.data.list.au[0].id(), 
-                                               list,
-                                               [ 'CREATE_VOLUME', 'CREATE_COPY' ]
-                                       ]
-                               ).length == 0 ? 1 : 0;
-                       } catch(E) {
-                               g.error.sdump('batch permission check: ' + E);
-                       }
-
-                       if (edit==0) return; // no read-only view for this interface
-
-                       var title = 'Add Volume/Copy';
-
-                       JSAN.use('util.window'); var win = new util.window();
-                       var w = win.open(
-                               window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR)
-                                       +'?doc_id=' + window.escape(find_this_id)
-                                       +'&ou_ids=' + window.escape( js2JSON(list) ),
-                               title,
-                               'chrome,modal,resizable'
-                       );
-
-                       refresh_browse_list();
-               }
-
-               function spawn_copy_add_wizard() {
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'volume';
-                               }
-                       );
-                       var copy_shortcut = {};
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       var ou_id = o.getAttribute('ou_id');
-                                       var volume_id = o.getAttribute('volume_id');
-                                       var label = o.getAttribute('callnumber');
-                                       if (!copy_shortcut[ou_id]) copy_shortcut[ou_id] = {};
-                                       copy_shortcut[ou_id][ label ] = volume_id;
-
-                                       return ou_id;
-                               }
-                       );
-                       /* quick fix */
-                       list = []; for (var i in copy_shortcut) { list.push( i ); }
-
-                       var edit = 0;
-                       try {
-                               edit = g.network.request(
-                                       api.PERM_MULTI_ORG_CHECK.app,
-                                       api.PERM_MULTI_ORG_CHECK.method,
-                                       [ 
-                                               ses(), 
-                                               g.data.list.au[0].id(), 
-                                               list,
-                                               [ 'CREATE_COPY' ]
-                                       ]
-                               ).length == 0 ? 1 : 0;
-                       } catch(E) {
-                               g.error.sdump('batch permission check: ' + E);
-                       }
-
-                       if (edit==0) return; // no read-only view for this interface
-
-                       var title = 'Add Copy';
-
-                       JSAN.use('util.window'); var win = new util.window();
-                       var w = win.open(
-                               window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR)
-                                       +'?doc_id=' + window.escape(find_this_id)
-                                       +'&ou_ids=' + window.escape( js2JSON(list) )
-                                       +'&copy_shortcut=' + window.escape( js2JSON(copy_shortcut) ),
-                               title,
-                               'chrome,modal,resizable'
-                       );
-                       refresh_browse_list();
-               }
-               
-               function mark_volume() {
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'volume';
-                               }
-                       );
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('volume_id');
-                               }
-                       );
-
-                       g.data.marked_volume = list[0];
-                       g.data.stash('marked_volume');
-                       alert('Volume marked as Copy Transfer Destination');
-               }
-
-               function add_to_bucket() {
-
-                       JSAN.use('util.widgets'); JSAN.use('util.functional');
-
-                       var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
-                       list = util.functional.filter_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('object_type') == 'copy';
-                               }
-                       );
-
-                       list = util.functional.map_list(
-                               list,
-                               function (o) {
-                                       return o.getAttribute('copy_id');
-                               }
-                       );
-                       
-                       JSAN.use('util.window'); var win = new util.window();
-                       win.open( 
-                               xulG.url_prefix(urls.XUL_COPY_BUCKETS) 
-                               + '?copy_ids=' + js2JSON( list ),
-                               'sel_bucket_win' + win.window_name_increment(),
-                               'chrome,resizable,modal,center'
-                       );
-               }
-
-       ]]>
-       </script>
-
-       <!-- The logic for this app -->
-       <Evergreen id="browse_list_js" />
-
-       <!-- XUL'ified abstraction for logic to attach to widgets -->
-       <commandset id="browse_list_cmds" />
-
-       <!-- Accelerator Keys (Accessor Keys are in DTD's) -->
-       <keyset id="browse_list_keys" />
-
-       <!-- Context menus -->
-       <popupset id="browse_list_popupset" />
-
-       <!-- Layout to be filled in by overlays and javascript -->
-       <groupbox flex="1">
-               <caption label="Holdings Maintenance"/>
-               <vbox id="browse_list_vbox" class="test_class"/>
-       </groupbox>
-
-</window>
-
diff --git a/Open-ILS/xul/staff_client/chrome/content/legacy/_marc.xul b/Open-ILS/xul/staff_client/chrome/content/legacy/_marc.xul
deleted file mode 100644 (file)
index 8668a92..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0"?>
-<!-- Application: Evergreen Staff Client -->
-<!-- Screen: Cataloger's MARC Screen -->
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- PRESENTATION -->
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- LOCALIZATION -->
-<!DOCTYPE window SYSTEM "chrome://open_ils_staff_client/locale/lang.dtd">
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- OVERLAYS -->
-<?xul-overlay href="chrome://open_ils_staff_client/content/OpenILS/util_overlay.xul"?>
-<?xul-overlay href="chrome://open_ils_staff_client/content/legacy/marc_overlay.xul"?>
-
-<window id="marc_win"
-       orient="vertical" style="overflow: scroll" 
-       onload="
-               try { my_pre_init(); } catch(E) { alert(E); }
-       "
-       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-       <!-- BEHAVIOR -->
-       <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
-       <scripts id="openils_util_scripts"/>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/constants.js"/>
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/OpenILS/util/fmall.js"/>
-       <script type="text/javascript">
-       <![CDATA[
-
-               var params = {};
-               var mw = {};
-               var find_this_id;
-               var new_node_id = -1;
-
-               var character_measure = {};
-               var tree;
-               var meta;
-               var backup_tree;
-
-               function my_pre_init() {
-                       try {
-                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
-                               JSAN.errorLevel = "die"; // none, warn, or die
-                               JSAN.addRepository('..');
-                               JSAN.use('util.error'); g.error = new util.error();
-                               g.error.sdump('D_TRACE','my_pre_init() for marc.xul');
-
-                               JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
-                               XML_HTTP_SERVER = data.server_unadorned;
-
-                               mw.G = {};
-                               mw.G.main_test_variable = 'Hello World';
-                               g.cgi = new CGI();
-                               mw.G.auth_ses = [ ses() ];
-                               mw.sdump = function(a,b) { g.error.sdump(a,b); }
-
-                               find_this_id = g.cgi.param('docid');
-
-                               if (typeof window.xulG == 'object' && window.xulG.import_tree) {
-                                       params.import_tree = window.xulG.import_tree;
-                               }
-
-                               JSAN.use('util.network');
-                               g.network = new util.network();
-
-                               disable_widgets('cmd_close_window','cmd_marc_meta_data');
-                               document.getElementById('cmd_close_window').setAttribute('hidden','true');
-                               document.getElementById('cmd_marc_meta_data').setAttribute('hidden','true');
-
-                               my_init();
-       
-                       } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\nmarc.xul\n" + E + '\n';
-                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
-                               alert(err_msg);
-                       }
-               }
-
-               function timer_elapsed() {
-                       return '';
-               }
-
-               function handle_error(err) {
-                       try { alert(js2JSON(err)); } catch(E) { alert(err); }
-               }
-
-               function user_request(a,b,c,d) {
-                       return [ g.network.request(a,b,c,d) ];
-               }
-
-               function disable_widgets() {
-                       var d = document; var idx = 0;
-                       if (arguments[0].nodeName == '#document') {
-                               idx = 1; d = arguments[0];
-                       }
-                       for (var i = idx; i < arguments.length; i++) {
-                               if (typeof(arguments[i]) == 'object') {
-                                       arguments[i].disabled = true;
-                               } else {
-                                       var w = d.getElementById( arguments[i] );
-                                       if (w) { 
-                                               w.disabled = true; 
-                                       }
-                               }
-                       }
-               }
-
-               function enable_widgets() {
-                       var d = document; var idx = 0;
-                       if (arguments[0].nodeName == '#document') {
-                               idx = 1; d = arguments[0];
-                       }
-                       for (var i = idx; i < arguments.length; i++) {
-                               if (typeof(arguments[i]) == 'object') {
-                                       arguments[i].disabled = false;
-                               } else {
-                                       var w = d.getElementById( arguments[i] );
-                                       if (w) { 
-                                               w.disabled = false; 
-                                       }
-                               }
-                       }
-               }
-
-
-       ]]>
-       </script>
-
-       <!-- The logic for this app -->
-       <Evergreen id="marc_js" />
-
-       <!-- XUL'ified abstraction for logic to attach to widgets -->
-       <commandset id="marc_cmds" />
-
-       <!-- Accelerator Keys (Accessor Keys are in DTD's) -->
-       <keyset id="marc_keys" />
-
-       <!-- Layout to be filled in by overlays and javascript -->
-       <groupbox flex="1">
-               <caption label="MARC Edit"/>
-               <vbox id="marc_vbox" class="test_class" style="overflow: scroll"/>
-       </groupbox>
-
-</window>
-
index 9d778fc..e75030b 100644 (file)
@@ -246,7 +246,7 @@ JSAN._createScript = function (js, pkg) {
     try {
         return JSAN._makeNamespace(js, pkg);
     } catch (e) {
-        JSAN._handleError("Could not create namespace[" + pkg + "]: " + e);
+        JSAN._handleError(document.getElementById('offlineStrings').getFormattedString('jsan.namespace.creation.error', [pkg, e]));
     }
     return null;
 }
@@ -276,11 +276,11 @@ JSAN.Request.prototype = {
             if (this._req.status == 200 || this._req.status == 0)
                 return this._req.responseText;
         } catch (e) {
-            JSAN._handleError("File not found: " + url);
+            JSAN._handleError(document.getElementById('offlineStrings').getFormattedString('jsan.file_not_found.error', [url]));
             return null;
         };
 
-        JSAN._handleError("File not found: " + url);
+        JSAN._handleError(document.getElementById('offlineStrings').getFormattedString('jsan.file_not_found.error', [url]));
         return null;
     }
 };
index 41ec6c4..dae16d5 100644 (file)
@@ -1,6 +1,7 @@
 <html><head><script></script></head><body onload="var x = document.getElementById('version'); var version ='/xul/server/'.split(/\//)[2]; if (version == 'server') { version = 'versionless debug build'; } x.appendChild(document.createTextNode(version));">
 <h1 style="text-decoration: underline">Evergreen</h1>
-<p>Build ID: <span id="version"></span></p>
+<p>Target Server ID: <span id="version"></span></p>
+<p>$HeadURL$</p>
 <h2>What is Evergreen?</h2>
 <blockquote>
 <p>
index 641514d..1bf2c10 100644 (file)
 
                        <constructor>
                                <![CDATA[
-                               this._load_sprintf();
-                               this._props = {};
-                               this._load_from_src();
+                try {
+                        this._load_sprintf();
+                        this._props = {};
+                        this._load_from_src();
+                } catch(E) {
+                    alert('Error constructing messagecatalog in bindings.xml: ' + E);
+                    throw(E);
+                }
                                ]]>
                        </constructor>
 
                        <property name="src">
                                <getter>
                                        <![CDATA[
-                                       return this.getAttribute('src');
+                    try {
+                                       return this.getAttribute('src');
+                    } catch(E) {
+                        alert('Error getting @src in messagecatalog in bindings.xml: ' + E);
+                        throw(E);
+                    }
                                        ]]>
                                </getter>
                                <setter>
                                        <![CDATA[
-                                       this.setAttribute('src',val);
-                                       this.load_from_src();
-                                       return val;
+                    try {
+                                           this.setAttribute('src',val);
+                                       this.load_from_src();
+                                       return val;
+                    } catch(E) {
+                        alert('Error setting @src in messagecatalog in bindings.xml: ' + E);
+                        throw(E);
+                    }
                                        ]]>
                                </setter>
                        </property>
                        <method name="_load_from_src">
                                <body>
                                        <![CDATA[
-                                       var x = new XMLHttpRequest();
-                                       x.open("GET",this.src,false);
-                                       x.send(null);
-                                       if (x.responseText) {
-                                               var props = this._props2object(x.responseText);
-                                               for (var i in props) {
-                                                       this._props[i] = props[i];
-                                               }
-                                       } else {
-                                               var msg = "messageCatalog: No text from " + this.src;
-                                               alert(msg); throw(msg);
-                                       }
+                    try {
+                            var x = new XMLHttpRequest();
+                            x.open("GET",this.src,false);
+                            x.send(null);
+                            if (x.responseText) {
+                                var props = this._props2object(x.responseText);
+                                for (var i in props) {
+                                    this._props[i] = props[i];
+                                }
+                            } else {
+                                var msg = "messageCatalog: No text from " + this.src;
+                                alert(msg); throw(msg);
+                            }
+                    } catch(E) {
+                        alert('Error loading properties in messagecatalog in bindings.xml: ' + E);
+                        throw(E);
+                    }
                                        ]]>
                                </body>
                        </method>
                                <parameter name="str"/>
                                <body>
                                        <![CDATA[
-                                       var lines = str.split("\n");
-                                       var props = {};
-                                       var line = '';
-                                       var in_comment = false;
-
-                                       for (var l in lines) {
-                                               line += lines[l];
-
-                                               // handle multi-line comments
-                                               if (line.indexOf('/*') >= 0) in_comment = true;
-
-                                               if (in_comment && line.indexOf('*/') > 0) {
-                                                       var comment_start = line.indexOf('/*');
-                                                       var comment_end = line.indexOf('*/');
-                                                       line = line.substring(0, comment_start) + line.substring(0, comment_end + 2);
-                                                       in_comment = false;
-                                               } else if (in_comment) continue;
-                                                       
-                                               // get rid of entire-line comments
-                                               if (line.indexOf('#') == 0) {
-                                                       line = '';
-                                                       continue;
-                                               }
-
-                                               // handle end-of-line comments
-                                               var end_comment = line.indexOf('//');
-                                               if (end_comment >= 0) line = line.substring(0, end_comment);
+                        try {
+                            var lines = str.split("\n");
+                            var props = {};
+                            var line = '';
+                            var in_comment = false;
+
+                            for (var l in lines) {
+                                line += lines[l];
+
+                                // handle multi-line comments
+                                if (line.indexOf('/*') >= 0) in_comment = true;
+
+                                if (in_comment && line.indexOf('*/') > 0) {
+                                    var comment_start = line.indexOf('/*');
+                                    var comment_end = line.indexOf('*/');
+                                    line = line.substring(0, comment_start) + line.substring(0, comment_end + 2);
+                                    in_comment = false;
+                                } else if (in_comment) continue;
+                                    
+                                // get rid of entire-line comments
+                                if (line.indexOf('#') == 0) {
+                                    line = '';
+                                    continue;
+                                }
+
+                                // handle end-of-line comments
+                                var end_comment = line.indexOf('//');
+                                if (end_comment >= 0) line = line.substring(0, end_comment);
+
+                                // and line concatenation
+                                if (line.charAt(line.length - 1) == '\\') {
+                                    line = line.substring(0,line.length - 1);
+                                    continue;
+                                }
+
+                                var eq_pos = line.indexOf('=');
+                                if (eq_pos < 0) continue;
+
+                                var k = line.substring(0,eq_pos);
+                                k = k.replace(/\s+/g,"");
+
+                                var v = line.substring(eq_pos + 1);
+
+                                var current_m = 0;
+                                var cont = false;
+                                do {    
+                                    if (v.indexOf( "{" + current_m + "}" ) >= 0 ) {
+                                        var mes_bund = new RegExp( "\\\{" + current_m + "\\\}", 'g' );
+                                        var sprintf_format = "%" + (current_m + 1) + "$s";
+
+                                        v = v.replace( mes_bund, sprintf_format );
+
+                                        cont = true;
+                                        current_m++;
+                                    } else {
+                                        cont = false;
+                                    }
+                                } while ( cont == true );
+
+                                props[k] = v;
+                                line = '';
+                                }
+
+                            return props;
+                        } catch(E) {
+                            alert('Error in props2object in messagecatalog in bindings.xml: ' + E);
+                            throw(E);
+                        }
+                                       ]]>
+                               </body>
+                       </method>
 
-                                               // and line concatenation
-                                               if (line.charAt(line.lenth - 1) == '\\') {
-                                                       line = line.substring(0,line.lenth - 1);
-                                                       continue;
+                       <method name="testString">
+                               <parameter name="key"/>
+                               <body>
+                                       <![CDATA[
+                                               try {
+                            var str = this._props[key];
+                            return (typeof str != 'undefined');
+                                               } catch(e) {
+                            return false;
                                                }
-
-                                               var eq_pos = line.indexOf('=');
-                                               if (eq_pos < 0) continue;
-
-                                               var k = line.substring(0,eq_pos);
-                                               k = k.replace(/\s+/g,"");
-
-                                               var v = line.substring(eq_pos + 1);
-
-                                               var current_m = 0;
-                                               var cont = false;
-                                               do {    
-                                                       if (v.indexOf( "{" + current_m + "}" ) >= 0 ) {
-                                                               var mes_bund = new RegExp( "\\\{" + current_m + "\\\}", 'g' );
-                                                               var sprintf_format = "%" + (current_m + 1) + "$s";
-
-                                                               v = v.replace( mes_bund, sprintf_format );
-
-                                                               cont = true;
-                                                               current_m++;
-                                                       } else {
-                                                               cont = false;
-                                                       }
-                                               } while ( cont == true );
-
-                                               props[k] = v;
-                                               line = '';
-                                       }
-
-                                       return props;
                                        ]]>
                                </body>
                        </method>
 
+
                        <method name="getString">
                                <parameter name="key"/>
                                <body>
                                        <![CDATA[
                                                try {
-                                                       return this._props[key];
+                            var str = this._props[key];
+                            if (typeof str == 'undefined') throw(str);
+                                                       return str;
                                                } catch(e) {
-                                                       alert("*** Failed to get string " + key + " in bundle: " + this.src + "\n");
+                                                       alert("*** Failed to get string " + key + " in bundle: " + this.src + "\n" + e);
                                                        throw(e);
                                                }
                                        ]]>
                                <body>
                                        <![CDATA[
                                                try {
-                                                       var str = this._props[key]; if (!str) throw("messageCatalog: Failed to get string " + key + " in bundle.");
+                                                       var str = this._props[key]; 
+                            if (typeof str == 'undefined') throw(str);
                                                        var these = [ str ].concat(params);
                                                        var v = this.sprintf.apply(this,these);
 
index 52b21ec..dc3841f 100644 (file)
@@ -46,21 +46,27 @@ const api = {
        'CHECKOUT_RENEW' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.renew' },
        'CIRC_MODIFIER_LIST' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circ_modifier.retrieve.all' },
        'FM_ACN_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.callnumber.retrieve', 'secure' : false },
+       'FM_ACN_RETRIEVE.authoritative' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.callnumber.retrieve.authoritative', 'secure' : false },
        'FM_ACN_TREE_UPDATE' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.asset.volume.fleshed.batch.update' },
        'FM_ACN_TREE_LIST_RETRIEVE_VIA_RECORD_ID_AND_ORG_IDS' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.asset.copy_tree.retrieve', 'secure' : false },
+       'FM_ACN_TREE_LIST_RETRIEVE_VIA_RECORD_ID_AND_ORG_IDS.authoritative' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.asset.copy_tree.retrieve.authoritative', 'secure' : false },
        'FM_ACN_TRANSFER' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.asset.volume.batch.transfer' },
        'FM_ACN_FIND_OR_CREATE' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.call_number.find_or_create', 'secure' : false },
        'FM_ACP_DETAILS' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve' },
        'FM_ACP_DETAILS_VIA_BARCODE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve.barcode' },
+       'FM_ACP_DETAILS_VIA_BARCODE.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve.barcode.authoritative' },
        //'FM_ACP_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.fleshed.retrieve' },
        'FM_ACP_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.fleshed2.retrieve', 'secure' : false },
        //'FM_ACP_RETRIEVE_VIA_BARCODE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.find_by_barcode' },
        'FM_ACP_RETRIEVE_VIA_BARCODE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.fleshed2.find_by_barcode', 'secure' : false },
        'FM_ACP_FLESHED_BATCH_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.fleshed.batch.retrieve', 'secure' : false },
+       'FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.asset.copy.fleshed.batch.retrieve.authoritative', 'secure' : false },
        'FM_ACP_FLESHED_BATCH_UPDATE' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.asset.copy.fleshed.batch.update' },
        'FM_ACP_COUNT' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.record.copy_count.staff', 'secure' : false },
+       'FM_ACP_COUNT.authoritative' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.record.copy_count.staff.authoritative', 'secure' : false },
        'FM_ACPL_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_location.retrieve.all', 'secure' : false },
        'FM_ACPL_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_location.retrieve', 'secure' : false },
+       'FM_ACPL_RETRIEVE_VIA_ID.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_location.retrieve.authoritative', 'secure' : false },
        'FM_ACPN_RETRIEVE_ALL' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_note.retrieve.all', 'secure' : false },
        'FM_ACPN_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_note.create' },
        'FM_ACPN_DELETE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_note.delete', 'secure' : false },
@@ -70,8 +76,10 @@ const api = {
        'FM_AHN_RETRIEVE_VIA_AHR' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold_notification.retrieve_by_hold' },
        'FM_AHR_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.retrieve_by_id' },
        'FM_AHR_BLOB_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.details.retrieve' },
+       'FM_AHR_BLOB_RETRIEVE.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.details.retrieve.authoritative' },
        'FM_AHR_RETRIEVE_VIA_AU' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.retrieve' },
        'FM_AHR_ID_LIST_RETRIEVE_VIA_AU' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.id_list.retrieve' },
+       'FM_AHR_ID_LIST_RETRIEVE_VIA_AU.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.id_list.retrieve.authoritative' },
        'FM_AHR_RETRIEVE_VIA_BRE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.open_holds.retrieve' },
        'FM_AHR_RETRIEVE_ALL_VIA_BRE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.retrieve_all_from_title' },
        'FM_AHR_RETRIEVE_VIA_PICKUP_AOU' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.holds.retrieve_by_pickup_lib' },
@@ -81,6 +89,7 @@ const api = {
        'FM_AHR_ONSHELF_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.captured_holds.on_shelf.retrieve' },
        'FM_AHR_ID_LIST_ONSHELF_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.captured_holds.id_list.on_shelf.retrieve', 'secure' : false },
        'FM_AHR_COUNT_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.hold_requests.count', 'cacheable' : true, 'ttl' : 60000  },
+       'FM_AHR_COUNT_RETRIEVE.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.hold_requests.count.authoritative', 'cacheable' : true, 'ttl' : 60000  },
        'FM_AHR_CANCEL' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.cancel' },
        'FM_AHR_UPDATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.update' },
        'FM_AHR_RESET' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.reset' },
@@ -88,12 +97,14 @@ const api = {
        'FM_AIHU_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.in_house_use.create' },
        'FM_ANCC_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.non_cataloged_circulation.retrieve' },
        'FM_ANCC_RETRIEVE_VIA_USER' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.open_non_cataloged_circulation.user' },
+       'FM_ANCC_RETRIEVE_VIA_USER.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.open_non_cataloged_circulation.user.authoritative' },
        'FM_ANCIHU_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.non_cat_in_house_use.create' },
        'FM_AOA_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.org_unit.address.retrieve', 'secure' : false },
        'FM_AOU_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.org_tree.retrieve', 'secure' : false },
        'FM_AOU_DESCENDANTS_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.org_tree.descendants.retrieve', 'secure' : false },
        'FM_AOU_RETRIEVE_RELATED_VIA_SESSION' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.org_unit.full_path.retrieve' },
        'FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.actor.org_unit.retrieve_by_title', 'secure' : false },
+       'FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.actor.org_unit.retrieve_by_title.authoritative', 'secure' : false },
        'FM_AOUT_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.org_types.retrieve', 'secure' : false },
        'FM_ASC_BATCH_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.stat_cat.asset.retrieve.batch', 'secure' : false },
        'FM_ASC_RETRIEVE_VIA_AOU' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.stat_cat.asset.retrieve.all', 'secure' : false },
@@ -106,31 +117,40 @@ const api = {
        'FM_ATC_RETRIEVE_VIA_AOU' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.transit.retrieve_by_lib', 'secure' : false },
        'FM_AU_IDS_RETRIEVE_VIA_HASH' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.patron.search.advanced' },
        'FM_AU_LIST_RETRIEVE_VIA_GROUP' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.usergroup.members.retrieve' },
+       'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.usergroup.members.retrieve.authoritative' },
        'FM_AU_RETRIEVE_VIA_SESSION' : { 'app' : 'open-ils.auth', 'method' : 'open-ils.auth.session.retrieve' },
        'FM_AU_RETRIEVE_VIA_BARCODE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.fleshed.retrieve_by_barcode', 'cacheable' : true, 'ttl' : 60000 },
+       'FM_AU_RETRIEVE_VIA_BARCODE.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.fleshed.retrieve_by_barcode.authoritative', 'cacheable' : true, 'ttl' : 60000 },
        'FM_AU_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.retrieve', 'cacheable' : true, 'ttl' : 60000 },
        'FM_AU_FLESHED_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.fleshed.retrieve', 'cacheable' : true, 'ttl' : 60000 },
        'FM_AU_NEW_USERGROUP' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.usergroup.new' },
        'FM_AU_UPDATE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.patron.update' },
        'FM_AUN_RETRIEVE_ALL' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.note.retrieve.all', 'cacheable' : false, 'ttl' : 60000 },
+       'FM_AUN_RETRIEVE_ALL.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.note.retrieve.all.authoritative', 'cacheable' : false, 'ttl' : 60000 },
        'FM_AUN_CREATE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.note.create' },
        'FM_AUN_DELETE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.note.delete' },
        'FM_AUS_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.patron.settings.retrieve' },
        'FM_AUS_UPDATE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.patron.settings.update' },
        'FM_BRE_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.biblio.record.metadata.retrieve', 'secure' : false },
+       'FM_BRE_RETRIEVE_VIA_ID.authoritative' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.biblio.record.metadata.retrieve.authoritative', 'secure' : false },
        'FM_BRE_ID_SEARCH_VIA_BARCODE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.find_by_barcode', 'secure' : false },
+    'FM_BRE_ID_SEARCH_VIA_MULTICLASS_QUERY' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.multiclass.query.staff' },
        'FM_BRE_ID_SEARCH_VIA_TCN' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.tcn', 'secure' : false },
        'FM_BRE_DELETE' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.biblio.record_entry.delete', 'secure' : false },
        'FM_BRN_FROM_MARCXML' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.z3950.marcxml_to_brn', 'secure' : false },
        'FM_CCS_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.config.copy_status.retrieve.all', 'secure' : false },
        'FM_CIRC_DETAILS' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.fleshed.retrieve' },
+       'FM_CIRC_DETAILS.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.fleshed.retrieve.authoritative' },
        'FM_CIRC_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.retrieve' },
        /*'FM_CIRC_RETRIEVE_VIA_USER' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.actor.user.checked_out.slim' },*/
        'FM_CIRC_IN_WITH_FINES_VIA_USER' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_in_with_fines' },
+       'FM_CIRC_IN_WITH_FINES_VIA_USER.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_in_with_fines.authoritative' },
        'FM_CIRC_RETRIEVE_VIA_USER' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out' },
+       'FM_CIRC_RETRIEVE_VIA_USER.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out.authoritative' },
        'FM_CIRC_RETRIEVE_VIA_COPY' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_checkout_history.retrieve' },
        /*'FM_CIRC_COUNT_RETRIEVE_VIA_USER' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out.count' },*/
        'FM_CIRC_COUNT_RETRIEVE_VIA_USER' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out.count', 'cacheable' : true, 'ttl' : 60000 },
+       'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out.count.authoritative', 'cacheable' : true, 'ttl' : 60000 },
        'FM_CIRC_COUNT_RETRIEVE_VIA_COPY' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circulation.count' },
        'FM_CIRC_EDIT_DUE_DATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circulation.due_date.update' },
        'FM_CIT_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.ident_types.retrieve', 'secure' : false },
@@ -141,15 +161,21 @@ const api = {
        'FM_CST_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.standings.retrieve', 'secure' : false },
        'FM_MB_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billing.create' },
        'FM_MB_RETRIEVE_VIA_MBTS_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billing.retrieve.all' },
+       'FM_MB_RETRIEVE_VIA_MBTS_ID.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billing.retrieve.all.authoritative' },
        'FM_MB_VOID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billing.void' },
        'FM_MBTS_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billable_xact_summary.retrieve' },
+       'FM_MBTS_RETRIEVE.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.billable_xact_summary.retrieve.authoritative' },
        'FM_MBTS_IDS_RETRIEVE_ALL' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history' },
        'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_CHARGE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_charge' },
        'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_balance' },
+       'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_balance.authoritative' },
        'FM_MBTS_IDS_RETRIEVE_ALL_STILL_OPEN' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.still_open' },
        'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BILL' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_bill' },
+       'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BILL.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_bill.authoritative' },
        'FM_MBTS_IDS_RETRIEVE_FOR_HISTORY' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_bill' },
+       'FM_MBTS_IDS_RETRIEVE_FOR_HISTORY.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.history.have_bill.authoritative' },
        'FM_MP_RETRIEVE_VIA_MBTS_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.payment.retrieve.all' },
+       'FM_MP_RETRIEVE_VIA_MBTS_ID.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.payment.retrieve.all.authoritative' },
        'FM_MG_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.grocery.create' },
        'FM_MG_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.grocery.retrieve' },
        'FM_MOBTS_HAVING_BALANCE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.have_balance' },
@@ -159,6 +185,7 @@ const api = {
        'FM_MOBTS_TOTAL_OPEN' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.total' },
        'FM_MOBTS_COUNT_OPEN' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.count' },
        'FM_MOUS_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.fines.summary', 'cacheable' : true, 'ttl' : 60000 },
+       'FM_MOUS_RETRIEVE.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.fines.summary.authoritative', 'cacheable' : true, 'ttl' : 60000 },
        'FM_PGT_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.groups.tree.retrieve', 'secure' : false },
        'MARC_HTML_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.record.html', 'secure' : false },
        'FM_BLOB_RETRIEVE_VIA_Z3950_SEARCH' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.z3950.search_class' },
@@ -170,6 +197,7 @@ const api = {
        'MARK_ITEM_CLAIM_RETURNED' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circulation.set_claims_returned' },
        'MODS_SLIM_METARECORD_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.metarecord.mods_slim.retrieve', 'secure' : false },
        'MODS_SLIM_RECORD_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.record.mods_slim.retrieve', 'secure' : false },
+       'MODS_SLIM_RECORD_RETRIEVE.authoritative' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.record.mods_slim.retrieve.authoritative', 'secure' : false },
        'MODS_SLIM_RECORD_RETRIEVE_VIA_COPY' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.mods_from_copy', 'secure' : false },
        'PERM_CHECK' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.perm.check' },
        'PERM_MULTI_ORG_CHECK' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.perm.check.multi_org' },
@@ -182,6 +210,7 @@ const api = {
        'MARC_XML_TEMPLATE_LIST' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.marc_template.types.retrieve', 'secure' : false },
        'MERGE_RECORDS' : { 'app' : 'open-ils.cat', 'method' : 'open-ils.cat.biblio.records.merge' },
        'PATRON_BARCODE_EXISTS' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.barcode.exists' },
+       'PATRON_BARCODE_EXISTS.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.barcode.exists.authoritative' },
        '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' },
@@ -206,7 +235,6 @@ const urls = {
        'AUDIO_CIRC_GOOD_SOUND' : '/xul/server/skin/media/audio/toggled.wav',
        'AUDIO_CIRC_BAD_SOUND' : '/xul/server/skin/media/audio/question.wav',
 
-       'XUL_ADV_USER_BARCODE_ENTRY' : '/xul/server/patron/adv_barcode_entry.xul',
        'XUL_AUTH_SIMPLE' : '/xul/server/main/simple_auth.xul',
        'XUL_BIB_BRIEF' : '/xul/server/cat/bib_brief.xul',
        'XUL_BROWSER' : 'chrome://open_ils_staff_client/content/util/browser.xul',
@@ -222,7 +250,6 @@ const urls = {
        'XUL_COPY_NOTES' : '/xul/server/cat/copy_notes.xul',
        'XUL_COPY_STATUS' : '/xul/server/circ/copy_status.xul',
        'XUL_COPY_SUMMARY' : '/xul/server/cat/copy_summary.xul',
-       'XUL_COPY_VOLUME_BROWSE_OLD' : 'chrome://open_ils_staff_client/content/legacy/_browse.xul',
        'XUL_COPY_VOLUME_BROWSE' : '/xul/server/cat/copy_browser.xul',
        'XUL_DEBUG_CONSOLE' : 'chrome://global/content/console.xul',
        'XUL_DEBUG_FIELDMAPPER' : '/xul/server/util/fm_view.xul',
@@ -238,7 +265,6 @@ const urls = {
        'XUL_LIST_CLIPBOARD' : '/xul/server/util/list_clipboard.xul',
        'XUL_LOCAL_ADMIN' : '/xul/server/admin/index.xhtml',
        'XUL_MARC_NEW' : '/xul/server/cat/marc_new.xul',
-       'XUL_MARC_EDIT_LEGACY' : 'chrome://open_ils_staff_client/content/legacy/_marc.xul',
        'XUL_MARC_EDIT' : '/xul/server/cat/marcedit.xul',
        'XUL_MARC_VIEW' : '/xul/server/cat/marc_view.xul',
        'XUL_MENU_FRAME' : 'chrome://open_ils_staff_client/content/main/menu_frame.xul',
index eec3f72..4cb92ab 100644 (file)
@@ -1,4 +1,7 @@
 dump('entering main/main.js\n');
+// vim:noet:sw=4:ts=4:
+
+var offlineStrings;
 
 function grant_perms(url) {
        var perms = "UniversalXPConnect UniversalPreferencesWrite UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead UniversalFileRead";
@@ -30,9 +33,12 @@ function main_init() {
        try {
                clear_the_cache();
 
+               // Now we can safely load the strings without the cache getting wiped
+               offlineStrings = document.getElementById('offlineStrings');
+
                if (typeof JSAN == 'undefined') {
                        throw(
-                               "The JSAN library object is missing."
+                               offlineStrings.getString('common.jsan.missing')
                        );
                }
                /////////////////////////////////////////////////////////////////////////////
@@ -47,7 +53,7 @@ function main_init() {
 
                JSAN.use('util.error');
                G.error = new util.error();
-               G.error.sdump('D_ERROR','Testing');
+               G.error.sdump('D_ERROR', offlineStrings.getString('main.testing'));
 
                JSAN.use('util.window');
                G.window = new util.window();
@@ -56,10 +62,8 @@ function main_init() {
                G.auth = new auth.controller( { 'window' : mw } );
 
                JSAN.use('OpenILS.data');
-               G.data = new OpenILS.data()
+               G.data = new OpenILS.data();
                G.data.on_error = G.auth.logoff;
-               G.data.entities = entities;
-               G.data.stash('entities');
 
                JSAN.use('util.file');
                G.file = new util.file();
@@ -77,7 +81,7 @@ function main_init() {
 
                        G.data.server_unadorned = url; G.data.stash('server_unadorned'); G.data.stash_retrieve();
 
-                       if (! url.match( '^http://' ) ) url = 'http://' + url;
+                       if (! url.match( '^http://' ) ) { url = 'http://' + url; }
 
                        G.data.server = url; G.data.stash('server'); 
                        G.data.session = { 'key' : G.auth.session.key, 'auth' : G.auth.session.authtime }; G.data.stash('session');
@@ -88,8 +92,8 @@ function main_init() {
                        var xulG = {
                                'auth' : G.auth,
                                'url' : url,
-                               'window' : G.window,
-                       }
+                               'window' : G.window
+                       };
 
                        if (G.data.ws_info && G.data.ws_info[G.auth.controller.view.server_prompt.value]) {
                                JSAN.use('util.widgets');
@@ -107,7 +111,7 @@ function main_init() {
                                iframe.contentWindow.xulG = xulG;
                                deck.selectedIndex = deck.childNodes.length - 1;
                        }
-               }
+               };
 
                G.auth.on_standalone = function() {
                        try {
@@ -115,23 +119,23 @@ function main_init() {
                        } catch(E) {
                                alert(E);
                        }
-               }
+               };
 
                G.auth.on_standalone_export = function() {
                        try {
                                JSAN.use('util.file'); var file = new util.file('pending_xacts');
                                if (file._file.exists()) {
                     var file2 = new util.file('');
-                                       var f = file2.pick_file( { 'mode' : 'save', 'title' : 'Save Transaction File As' } );
+                                       var f = file2.pick_file( { 'mode' : 'save', 'title' : offlineStrings.getString('main.transaction_export.title') } );
                                        if (f) {
                                                if (f.exists()) {
                                                        var r = G.error.yns_alert(
-                                                               'Would you like to overwrite the existing file ' + f.leafName + '?',
-                                                               'Transaction Export Warning',
-                                                               'Yes',
-                                                               'No',
+                                                               offlineStrings.getFormattedString('main.transaction_export.prompt', [f.leafName]),
+                                                               offlineStrings.getString('main.transaction_export.prompt.title'),
+                                                               offlineStrings.getString('common.yes'),
+                                                               offlineStrings.getString('common.no'),
                                                                null,
-                                                               'Check here to confirm this message'
+                                                               offlineStrings.getString('common.confirm')
                                                        );
                                                        if (r != 0) { file.close(); return; }
                                                }
@@ -139,12 +143,12 @@ function main_init() {
                                                e_file.write_content( 'truncate', file.get_content() );
                                                e_file.close();
                                                var r = G.error.yns_alert(
-                                                       'Your transactions have been successfully exported to file ' + f.leafName + '.\n\nWe strongly recommend that you now purge the transactions from this staff client.  Would you like for us to do this?',
-                                                       'Transaction Export Successful',
-                                                       'Yes',
-                                                       'No',
+                                                       offlineStrings.getFormattedString('main.transaction_export.success.prompt', [f.leafName]),
+                                                       offlineStrings.getString('main.transaction_export.success.title'),
+                                                       offlineStrings.getString('common.yes'),
+                                                       offlineStrings.getString('common.no'),
                                                        null,
-                                                       'Check here to confirm this message'
+                                                       offlineStrings.getString('common.confirm')
                                                );
                                                if (r == 0) {
                                                        var count = 0;
@@ -153,43 +157,45 @@ function main_init() {
                                                        while (t_file._file.exists()) {
                                                                filename = 'pending_xacts_' + new Date().getTime() + '.exported';
                                                                t_file = new util.file(filename);
-                                                               if (count++>100) throw('Error purging transactions:  Taking too long to find a unique filename for archival.');
+                                                               if (count++ > 100) {
+                                                                       throw(offlineStrings.getString('main.transaction_export.filename.error'));
+                                                               }
                                                        }
                                                        file._file.moveTo(null,filename);
                                                } else {
-                                                       alert('Please note that you now have two sets of identical transactions.  Unless the set you just exported is soley for archival purposes, we run the risk of duplicate transactions being processed on the server.');
+                                                       alert(offlineStrings.getString('main.transaction_export.duplicate.warning'));
                                                }
                                        } else {
-                                               alert('No filename chosen.  Or a bug where you tried to overwrite an existing file.');
+                                               alert(offlineStrings.getString('main.transaction_export.no_filename.error'));
                                        }
                                } else {
-                                       alert('There are no outstanding transactions to export.');
+                                       alert(offlineStrings.getString('main.transaction_export.no_transactions.error'));
                                }
                                file.close();
                        } catch(E) {
                                alert(E);
                        }
-               }
+               };
 
                G.auth.on_standalone_import = function() {
                        try {
                                JSAN.use('util.file'); var file = new util.file('pending_xacts');
                                if (file._file.exists()) {
-                                       alert('There are already outstanding transactions on this staff client.  Upload these first.');
+                                       alert(offlineStrings.getString('main.transaction_import.outstanding.error'));
                                } else {
                     var file2 = new util.file('');
-                                       var f = file2.pick_file( { 'mode' : 'open', 'title' : 'Import Transaction File'} );
+                                       var f = file2.pick_file( { 'mode' : 'open', 'title' : offlineStrings.getString('main.transaction_import.title')} );
                                        if (f && f.exists()) {
                                                var i_file = new util.file(''); i_file._file = f;
                                                file.write_content( 'truncate', i_file.get_content() );
                                                i_file.close();
                                                var r = G.error.yns_alert(
-                                                       'Your transactions have been successfully migrated to this staff client.\n\nWe recommend that you delete the external copy.  Would you like for us to delete ' + f.leafName + '?',
-                                                       'Transaction Import Successful',
-                                                       'Yes',
-                                                       'No',
+                                                       offlineStrings.getFormattedString('main.transaction_import.delete.prompt', [f.leafName]),
+                                                       offlineStrings.getString('main.transaction_import.success'),
+                                                       offlineStrings.getString('common.yes'),
+                                                       offlineStrings.getString('common.no'),
                                                        null,
-                                                       'Check here to confirm this message'
+                                                       offlineStrings.getString('common.confirm')
                                                );
                                                if (r == 0) {
                                                        f.remove(false);
@@ -200,7 +206,7 @@ function main_init() {
                        } catch(E) {
                                alert(E);
                        }
-               }
+               };
 
                G.auth.on_debug = function(action) {
                        switch(action) {
@@ -209,13 +215,13 @@ function main_init() {
                                break;
                                case 'clear_cache' :
                                        clear_the_cache();
-                                       alert('cache cleared');
+                                       alert(offlineStrings.getString('main.on_debug.clear_cache'));
                                break;
                                default:
-                                       alert('debug the debug :D');
+                                       alert(offlineStrings.getString('main.on_debug.debug'));
                                break;
                        }
-               }
+               };
 
                G.auth.init();
                // XML_HTTP_SERVER will get reset to G.auth.controller.view.server_prompt.value
@@ -230,7 +236,7 @@ function main_init() {
                //var x = document.getElementById('version_label');
                //x.setAttribute('value','Build ID: ' + version);
                var x = document.getElementById('about_btn');
-               x.setAttribute('label','About this client...');
+               x.setAttribute('label', offlineStrings.getString('main.about_btn.label'));
                x.addEventListener(
                        'command',
                        function() {
@@ -252,14 +258,13 @@ function main_init() {
                        //      },
                        //      false
                        //);
-                       if (window.confirm('This version of the staff client stores local settings in a different location than your previous installation.  Should we attempt to migrate these settings?')) {
+                       if (window.confirm(offlineStrings.getString('main.settings.migrate'))) {
                                setTimeout( function() { handle_migration(); }, 0 );
                        }
                }
 
        } catch(E) {
-               var error = "!! This software has encountered an error.  Please tell your friendly " +
-                       "system administrator or software developer the following:\n" + E + '\n';
+               var error = offlineStrings.getFormattedString('common.exception', [E, '']);
                try { G.error.sdump('D_ERROR',error); } catch(E) { dump(error); }
                alert(error);
        }
@@ -286,17 +291,14 @@ function found_ws_info_in_Uchrome() {
 
 function handle_migration() {
        if ( found_ws_info_in_Uchrome() ) {
-               alert('WARNING: Unable to migrate legacy settings.  The settings and configuration files appear to exist in multiple locations.\n'
-                       + 'To resolve manually, please consider:\n\t' + found_ws_info_in_Uchrome() + '\n'
-                       + 'which is in the directory where we want to store settings for the current OS user, and:\n\t'
-                       + found_ws_info_in_Achrome() + '\nwhich is where we used to store such information.\n'
+               alert(offlineStrings.getFormattedString('main.settings.migrate.failed', [found_ws_info_in_Uchrome(), found_ws_info_in_Achrome()])
                );
        } else {
                var dirService = Components.classes["@mozilla.org/file/directory_service;1"].getService( Components.interfaces.nsIProperties );
                var f_new = dirService.get( "UChrm", Components.interfaces.nsIFile );
                var f_old = dirService.get( "AChrom", Components.interfaces.nsIFile );
                f_old.append(myPackageDir); f_old.append("content"); f_old.append("conf"); 
-               if (window.confirm("Move the settings and configuration files from\n" + f_old.path + "\nto\n" + f_new.path + "?")) {
+               if (window.confirm(offlineStrings.getFormattedString("main.settings.migrate.confirm", [f_old.path, f_new.path]))) {
                        var files = f_old.directoryEntries;
                        while (files.hasMoreElements()) {
                                var file = files.getNext();
@@ -304,10 +306,10 @@ function handle_migration() {
                                try {
                                        file2.moveTo( f_new, '' );
                                } catch(E) {
-                                       alert('Error trying to move ' + file2.path + ' to directory ' + f_new.path + '\n');
+                                       alert(offlineStrings.getFormattedString('main.settings.migrate.error', [file2.path, f_new.path]) + '\n');
                                }
                        }
-                       location.href = location.href;
+                       location.href = location.href; // huh?
                }
        }
 }
index e669399..35b1c67 100644 (file)
        <script>dump('Loaded OpenILS/util_overlay.xul\n');</script>
 
 
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/lang.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/main.js"/>
        <script>
-               dump("entities['lang.version'] = " + entities['lang.version'] + '\n');
+               dump("lang.version = &lang.version;" + '\n');
        </script>
 
+       <messagecatalog id="authStrings" src="chrome://open_ils_staff_client/locale/auth.properties"/>
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties"/>
+
        <commandset id="auth_cmds">
                <command id="cmd_login" />
                <command id="cmd_logoff"/>
index 4ac7492..b5bf127 100644 (file)
@@ -1,4 +1,8 @@
 dump('entering main/menu.js\n');
+// vim:noet:sw=4:ts=4:
+
+var offlineStrings;
+offlineStrings = document.getElementById('offlineStrings');
 
 if (typeof main == 'undefined') main = {};
 main.menu = function () {
@@ -31,7 +35,7 @@ main.menu.prototype = {
                var cmd_map = {
                        'cmd_broken' : [
                                ['oncommand'],
-                               function() { alert('Not Yet Implemented'); }
+                               function() { alert(offlineStrings.getString('common.unimplemented')); }
                        ],
 
                        /* File Menu */
@@ -68,28 +72,28 @@ main.menu.prototype = {
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_COPY_BUCKETS),{'tab_name':'Copy Buckets'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_COPY_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_copy_buckets.tab')},{});
                                }
                        ],
                        'cmd_edit_volume_buckets' : [
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_VOLUME_BUCKETS),{'tab_name':'Volume Buckets'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_VOLUME_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_volume_buckets.tab')},{});
                                }
                        ],
                        'cmd_edit_record_buckets' : [
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_RECORD_BUCKETS),{'tab_name':'Record Buckets'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_RECORD_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_record_buckets.tab')},{});
                                }
                        ],
                        'cmd_edit_user_buckets' : [
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_USER_BUCKETS),{'tab_name':'User Buckets'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_USER_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_user_buckets.tab')},{});
                                }
                        ],
 
@@ -101,7 +105,7 @@ main.menu.prototype = {
                                                JSAN.use('util.network');
                                                var network = new util.network();
 
-                                               var old_bc = window.prompt('Enter original barcode for the item:','','Replace Barcode');
+                                               var old_bc = window.prompt(offlineStrings.getString('menu.cmd_replace_barcode.prompt'),'',offlineStrings.getString('menu.cmd_replace_barcode.label'));
                                                if (!old_bc) return;
        
                                                var copy;
@@ -110,7 +114,7 @@ main.menu.prototype = {
                                                if (typeof copy.ilsevent != 'undefined') throw(copy); 
                                                if (!copy) throw(copy);
                         } catch(E) {
-                            alert('We were unable to retrieve an item with barcode "' + old_bc + '".\n');
+                            alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.retrieval.error', [old_bc]) + '\n');
                             return;
                         }
        
@@ -120,24 +124,24 @@ main.menu.prototype = {
                                                if (typeof copy.ilsevent != 'undefined') throw(copy);
                                                if (!copy) throw(copy);
                         } catch(E) {
-                            try { alert('We were unable to retrieve an item with barcode "' + old_bc + '".\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc)); } catch(F) { alert(E + '\n' + F); }
+                            try { alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.retrieval.error', [old_bc]) + '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc)); } catch(F) { alert(E + '\n' + F); }
                             return;
                         }
        
-                                               var new_bc = window.prompt('Enter the replacement barcode for the copy:','','Replace Barcode');
+                                               var new_bc = window.prompt(offlineStrings.getString('menu.cmd_replace_barcode.replacement.prompt'),'',offlineStrings.getString('menu.cmd_replace_barcode.replacement.label'));
                                                new_bc = String( new_bc ).replace(/\s/g,'');
                                                if (!new_bc) {
-                                                       alert('Rename aborted.  Blank for barcode not allowed.');
+                                                       alert(offlineStrings.getString('menu.cmd_replace_barcode.blank.error'));
                                                        return;
                                                }
        
                                                var test = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ new_bc ]);
                                                if (typeof test.ilsevent == 'undefined') {
-                                               alert('Rename aborted.  Another copy has barcode "' + new_bc + '".');
+                                               alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.duplicate.error', [new_bc]));
                                                        return;
                                                } else {
                                                        if (test.ilsevent != 1502 /* ASSET_COPY_NOT_FOUND */) {
-                                                       obj.error.standard_unexpected_error_alert('Error testing replacement barcode "' + new_bc + '".',test);
+                                                       obj.error.standard_unexpected_error_alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.testing.error', [new_bc]),test);
                                                                return;
                                                        }       
                                                }
@@ -147,14 +151,14 @@ main.menu.prototype = {
                                                if (typeof r.ilsevent != 'undefined') { 
                             if (r.ilsevent != 0) {
                                 if (r.ilsevent == 5000 /* PERM_FAILURE */) {
-                                    alert('Renamed aborted.  Insufficient permission.');
+                                    alert(offlineStrings.getString('menu.cmd_replace_barcode.permission.error'));
                                 } else {
-                                    obj.error.standard_unexpected_error_alert('Error renaming item.',r);
+                                    obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.cmd_replace_barcode.renaming.error'),r);
                                 }
                             }
                         }
                                        } catch(E) {
-                                               obj.error.standard_unexpected_error_alert('Rename did not likely occur.',copy);
+                                               obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.cmd_replace_barcode.renaming.failure'),copy);
                                        }
                                }
                        ],
@@ -172,13 +176,13 @@ main.menu.prototype = {
                                function() {
                                        obj.data.stash_retrieve();
                                        var content_params = { 'session' : ses(), 'authtime' : ses('authtime') };
-                                       obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {'tab_name':'Catalog'}, content_params);
+                                       obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {'tab_name':offlineStrings.getString('menu.cmd_search_opac.tab')}, content_params);
                                }
                        ],
                        'cmd_search_tcn' : [
                                ['oncommand'],
                                function() {
-                                       var tcn = prompt('What is the TCN or accession ID for the record?','','TCN Lookup');
+                                       var tcn = prompt(offlineStrings.getString('menu.cmd_search_tcn.tab'),'',offlineStrings.getString('menu.cmd_search_tcn.prompt'));
 
                                        function spawn_tcn(r) {
                                                for (var i = 0; i < r.count; i++) {
@@ -214,9 +218,9 @@ main.menu.prototype = {
                                                if (robj.count == 0) {
                                                        var robj2 = network.simple_request('FM_BRE_ID_SEARCH_VIA_TCN',[tcn,1]);
                                                        if (robj2.count == 0) {
-                                                               alert('"' + tcn + '" not found');
+                                                               alert(offlineStrings.getFormattedString('menu.cmd_search_tcn.not_found.error', [tcn]));
                                                        } else {
-                                                               if ( window.confirm('"' + tcn + '" is deleted.  Show deleted record anyway?') ) {
+                                                               if ( window.confirm(offlineStrings.getFormattedString('menu.cmd_search_tcn.deleted.error', [tcn])) ) {
                                                                        spawn_tcn(robj2);
                                                                }
                                                        }
@@ -251,7 +255,7 @@ main.menu.prototype = {
                                                                                {}, 
                                                                                { 
                                                                                        'show_print_button' : true , 
-                                                                                       'tab_name' : 'Editing Related Patron' ,
+                                                                                       'tab_name' : offline.getString('menu.cmd_patron_register.related.tab'),
                                                                                        'passthru_content_params' : {
                                                                                                'spawn_search' : function(s) { obj.spawn_search(s); },
                                                                                                'spawn_editor' : spawn_editor,
@@ -268,7 +272,7 @@ main.menu.prototype = {
                                                {}, 
                                                { 
                                                        'show_print_button' : true , 
-                                                       'tab_name' : 'Register Patron' ,
+                                                       'tab_name' : offlineStrings.getString('menu.cmd_patron_register.tab'),
                                                        'passthru_content_params' : {
                                                                'spawn_search' : function(s) { obj.spawn_search(s); },
                                                                'spawn_editor' : spawn_editor,
@@ -302,14 +306,14 @@ main.menu.prototype = {
                                ['oncommand'],
                                function() { 
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER),{ 'tab_name' : 'Hold Browser' },{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER),{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds.tab') },{});
                                }
                        ],
                        'cmd_browse_holds_shelf' : [
                                ['oncommand'],
                                function() { 
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER)+'?shelf=1',{ 'tab_name' : 'Holds Shelf' },{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER)+'?shelf=1',{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds_shelf.tab') },{});
                                }
                        ],
                        'cmd_circ_hold_pull_list' : [
@@ -319,7 +323,7 @@ main.menu.prototype = {
                                        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':'On Shelf Pull List'}, { 'show_print_button' : true, } );
+                                       obj.set_tab( loc, {'tab_name' : offlineStrings.getString('menu.cmd_browse_hold_pull_list.tab')}, { 'show_print_button' : true, } );
                                }
                        ],
 
@@ -347,7 +351,7 @@ main.menu.prototype = {
                                        );
                                        obj.set_tab( 
                                                loc, 
-                                               {'tab_name':'Local Administration', 'browser' : true }, 
+                                               {'tab_name' : offlineStrings.getString('menu.cmd_local_admin.tab'), 'browser' : true }, 
                                                { 'no_xulG' : false, 'show_nav_buttons' : true, 'show_print_button' : true } 
                                        );
 
@@ -371,7 +375,7 @@ main.menu.prototype = {
                                function() {
                                        obj.data.stash_retrieve();
                                        if (!obj.data.last_patron) {
-                                               alert('No patron visited yet this session.');
+                                               alert(offlineStrings.getString('menu.cmd_retrieve_last_patron.session.error'));
                                                return;
                                        }
                                        var url = obj.url_prefix( urls.XUL_PATRON_DISPLAY ); // + '?id=' + window.escape( obj.data.last_patron ) );
@@ -384,7 +388,7 @@ main.menu.prototype = {
                                function() {
                                        obj.data.stash_retrieve();
                                        if (!obj.data.last_record) {
-                                               alert('No record visited yet this session.');
+                                               alert(offlineStrings.getString('menu.cmd_retrieve_last_record.session.error'));
                                                return;
                                        }
                                        var opac_url = obj.url_prefix( urls.opac_rdetail ) + '?r=' + obj.data.last_record;
@@ -395,7 +399,7 @@ main.menu.prototype = {
                                        };
                                        obj.set_tab(
                                                obj.url_prefix(urls.XUL_OPAC_WRAPPER),
-                                               {'tab_name':'Retrieving title...'},
+                                               {'tab_name' : offlineStrings.getString('menu.cmd_retrieve_last_record.status')},
                                                content_params
                                        );
                                }
@@ -439,13 +443,13 @@ main.menu.prototype = {
                                                        obj.data.stash('session');
                                                        removeCSSClass(document.getElementById('main_tabbox'),'operator_change');
                                                } else {
-                                                       if (network.get_new_session('Change Login',{'url_prefix':obj.url_prefix})) {
+                                                       if (network.get_new_session(offlineStrings.getString('menu.cmd_chg_session.label'),{'url_prefix':obj.url_prefix})) {
                                                                obj.data.stash_retrieve();
                                                                obj.data.list.au[1] = JSON2js( temp_au );
                                                                obj.data.stash('list');
                                                                obj.data.previous_session = JSON2js( temp_ses );
                                                                obj.data.stash('previous_session');
-                                                               x.setAttribute('label', 'Change Operator: ' + obj.data.list.au[1].usrname() );
+                                                               x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [obj.data.list.au[1].usrname()]) );
                                                                addCSSClass(document.getElementById('main_tabbox'),'operator_change');
                                                        }
                                                }
@@ -457,7 +461,7 @@ main.menu.prototype = {
                        'cmd_manage_offline_xacts' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab(obj.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS), {'tab_name':'Offline Transactions'}, {});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS), {'tab_name' : offlineStrings.getString('menu.cmd_manage_offline_xacts.tab')}, {});
                                }
                        ],
                        'cmd_download_patrons' : [
@@ -476,9 +480,9 @@ main.menu.prototype = {
                                                        file = new util.file('offline_patron_list.date');
                                                        file.write_content('truncate',new Date());
                                                        file.close();
-                                                       alert('Download completed');
+                                                       alert(offlineStrings.getString('menu.cmd_download_patrons.complete.status'));
                                                } else {
-                                                       alert('There was a problem with the download.  The server returned a status ' + x.status + ' : ' + x.statusText);
+                                                       alert(offlineStrings.getFormattedString('menu.cmd_download_patrons.error', [x.status, x.statusText]));
                                                }
                                        } catch(E) {
                                                obj.error.standard_unexpected_error_alert('cmd_download_patrons',E);
@@ -489,7 +493,7 @@ main.menu.prototype = {
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_ADV_USER_BARCODE_ENTRY), {}, {});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_PATRON_BARCODE_ENTRY), {}, { 'perm_editor' : true });
                                }
                        ],
                        'cmd_print_list_template_edit' : [
@@ -503,21 +507,21 @@ main.menu.prototype = {
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_STAT_CAT_EDIT) + '?ses='+window.escape(ses()),{'tab_name':'Stat Cat Editor'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_STAT_CAT_EDIT) + '?ses='+window.escape(ses()), {'tab_name' : offlineStrings.getString('menu.cmd_stat_cat_edit.tab')},{});
                                }
                        ],
                        'cmd_non_cat_type_edit' : [
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_NON_CAT_LABEL_EDIT) + '?ses='+window.escape(ses()),{'tab_name':'Non-Cataloged Type Editor'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_NON_CAT_LABEL_EDIT) + '?ses='+window.escape(ses()), {'tab_name' : offlineStrings.getString('menu.cmd_non_cat_type_edit.tab')},{});
                                }
                        ],
                        'cmd_copy_location_edit' : [
                                ['oncommand'],
                                function() {
                                        obj.data.stash_retrieve();
-                                       obj.set_tab(obj.url_prefix(urls.XUL_COPY_LOCATION_EDIT) + '?ses='+window.escape(ses()),{'tab_name':'Copy Location Editor'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_COPY_LOCATION_EDIT) + '?ses='+window.escape(ses()),{'tab_name' : offlineStrings.getString('menu.cmd_copy_location_edit.tab')},{});
                                }
                        ],
                        'cmd_test' : [
@@ -545,25 +549,25 @@ main.menu.prototype = {
                        'cmd_console' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_CONSOLE),{'tab_name':'Console'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_CONSOLE),{'tab_name' : offlineStrings.getString('menu.cmd_console.tab')},{});
                                }
                        ],
                        'cmd_shell' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_SHELL),{'tab_name':'JS Shell'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_SHELL),{'tab_name' : offlineStrings.getString('menu.cmd_shell.tab')},{});
                                }
                        ],
                        'cmd_xuleditor' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_XULEDITOR),{'tab_name':'XUL Editor'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_XULEDITOR),{'tab_name' : offlineStrings.getString('menu.cmd_xuleditor.tab')},{});
                                }
                        ],
                        'cmd_fieldmapper' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_FIELDMAPPER),{'tab_name':'Fieldmapper'},{});
+                                       obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_FIELDMAPPER),{'tab_name' : offlineStrings.getString('menu.cmd_fieldmapper.tab')},{});
                                }
                        ],
                        'cmd_survey_wizard' : [
@@ -581,7 +585,7 @@ main.menu.prototype = {
                                        );
                                        obj.set_tab( 
                                                loc, 
-                                               {'tab_name':'OPAC', 'browser' : true}, 
+                                               {'tab_name' : offlineStrings.getString('menu.cmd_public_opac.tab'), 'browser' : true}, 
                                                { 'no_xulG' : true, 'show_nav_buttons' : true, 'show_print_button' : true } 
                                        );
                                }
@@ -611,25 +615,25 @@ main.menu.prototype = {
                        'cmd_extension_manager' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=extensions',{'tab_name':'Extension Manager'},{});
+                                       obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=extensions',{'tab_name' : offlineStrings.getString('menu.cmd_extension_manager.tab')},{});
                                }
                        ],
                        'cmd_theme_manager' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=themes',{'tab_name':'Theme Manager'},{});
+                                       obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=themes',{'tab_name' : offlineStrings.getString('menu.cmd_theme_manager.tab')},{});
                                }
                        ],
                        'cmd_about_config' : [
                                ['oncommand'],
                                function() {
-                                       obj.set_tab('chrome://global/content/config.xul',{'tab_name':'about:config'},{});
+                                       obj.set_tab('chrome://global/content/config.xul',{'tab_name' : 'about:config'},{});
                                }
                        ],
                        'cmd_shutdown' : [
                                ['oncommand'],
                                function() {
-                                       if (window.confirm('Exit Evergreen completely?')) {
+                                       if (window.confirm(offlineStrings.getString('menu.cmd_shutdown.prompt'))) {
                                                var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
                                                var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
                                                var enumerator = windowManagerInterface.getEnumerator(null);
@@ -659,7 +663,7 @@ main.menu.prototype = {
 
        'spawn_search' : function(s) {
                var obj = this;
-               obj.error.sdump('D_TRACE', 'Editor would like to search for: ' + js2JSON(s) ); 
+               obj.error.sdump('D_TRACE', offlineStrings.getFormattedString('menu.spawn_search.msg', [js2JSON(s)]) ); 
                obj.data.stash_retrieve();
                var loc = obj.url_prefix(urls.XUL_PATRON_DISPLAY);
                loc += '?doit=1&query=' + window.escape(js2JSON(s));
@@ -704,7 +708,7 @@ main.menu.prototype = {
                        for (var i = 0; i < count; i++) obj.close_tab();
                        setTimeout( function(){ obj.controller.view.tabs.firstChild.focus(); }, 0);
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error closing all tabs',E);
+                       obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.close_all_tabs.error'),E);
                }
        },
 
@@ -713,7 +717,6 @@ main.menu.prototype = {
                var tab = this.controller.view.tabs.childNodes[idx];
                var panel = this.controller.view.panels.childNodes[ idx ];
                while ( panel.lastChild ) panel.removeChild( panel.lastChild );
-               tab.setAttribute('label','Tab ' + (idx+1));
                if (idx == 0) {
                        try {
                                this.controller.view.tabs.advanceSelectedTab(+1);
@@ -790,7 +793,8 @@ main.menu.prototype = {
                var tab = this.controller.view.tabs.childNodes[ tc ];
                tab.hidden = false;
                if (!content_params) content_params = {};
-               if (!params) params = { 'tab_name' : 'Tab ' + (tc+1) };
+               if (!params) params = {};
+               if (!params.tab_name) params.tab_name = offlineStrings.getString('menu.new_tab.tab');
                if (!params.nofocus) params.focus = true; /* make focus the default */
                try {
                        if (params.focus) this.controller.view.tabs.selectedIndex = tc;
@@ -863,7 +867,7 @@ main.menu.prototype = {
                        }
                } catch(E) {
                        this.error.sdump('D_ERROR', 'main.menu:2: ' + E);
-                       alert('pause for error');
+                       alert(offlineStrings.getString('menu.set_tab.error'));
                }
 
                return frame;
index 160c54e..6d5ecec 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Main, Menu and Tab Navigation -->
+<!-- 
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -43,7 +46,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw(document.getElementById('offlineStrings').getString('common.jsan.missing')); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                /*
                                JSAN.addRepository('/xul/server/');
@@ -67,8 +70,7 @@
                                document.title = g.window.appshell_name_increment() + ': ' + g.data.list.au[0].usrname() + '@' + g.data.ws_name + '.' + g.data.server_unadorned;
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\nmenu_frame.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("offlineStrings").getFormattedString("common.exception", ["menu_frame.xul", E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -77,6 +79,8 @@
        </script>
        <script src="chrome://venkman/content/venkman-overlay.js"/>
 
+       <messagecatalog id="offlineStrings" src="chrome://open_ils_staff_client/locale/offline.properties" />   
+
        <commandset id="universal_cmds" />
 
        <keyset id="menu_frame_keys" />
index 65aa1e6..1d0ccb6 100644 (file)
        <toolbox id="main_toolbox"/>
        <tabbox id="main_tabbox" flex="1" eventnode="window" handleCtrlTab="true">
                <tabs id="main_tabs" closebutton="true">
-                       <tab id="tab_1" accesskey="1" label="Tab 1" hidden="true" />
-                       <tab id="tab_2" accesskey="2" label="Tab 2" hidden="true" />
-                       <tab id="tab_3" accesskey="3" label="Tab 3" hidden="true" />
-                       <tab id="tab_4" accesskey="4" label="Tab 4" hidden="true" />
-                       <tab id="tab_5" accesskey="5" label="Tab 5" hidden="true" />
-                       <tab id="tab_6" accesskey="6" label="Tab 6" hidden="true" />
-                       <tab id="tab_7" accesskey="7" label="Tab 7" hidden="true" />
-                       <tab id="tab_8" accesskey="8" label="Tab 8" hidden="true" />
-                       <tab id="tab_9" accesskey="9" label="Tab 9" hidden="true" />
+                       <tab id="tab_1" accesskey="&staff.chrome.menu_frame_overlay.tab1.accesskey;" label="&staff.chrome.menu_frame_overlay.tab1.label;" hidden="true" />
+                       <tab id="tab_2" accesskey="&staff.chrome.menu_frame_overlay.tab2.accesskey;" label="&staff.chrome.menu_frame_overlay.tab2.label;" hidden="true" />
+                       <tab id="tab_3" accesskey="&staff.chrome.menu_frame_overlay.tab3.accesskey;" label="&staff.chrome.menu_frame_overlay.tab3.label;" hidden="true" />
+                       <tab id="tab_4" accesskey="&staff.chrome.menu_frame_overlay.tab4.accesskey;" label="&staff.chrome.menu_frame_overlay.tab4.label;" hidden="true" />
+                       <tab id="tab_5" accesskey="&staff.chrome.menu_frame_overlay.tab5.accesskey;" label="&staff.chrome.menu_frame_overlay.tab5.label;" hidden="true" />
+                       <tab id="tab_6" accesskey="&staff.chrome.menu_frame_overlay.tab6.accesskey;" label="&staff.chrome.menu_frame_overlay.tab6.label;" hidden="true" />
+                       <tab id="tab_7" accesskey="&staff.chrome.menu_frame_overlay.tab7.accesskey;" label="&staff.chrome.menu_frame_overlay.tab7.label;" hidden="true" />
+                       <tab id="tab_8" accesskey="&staff.chrome.menu_frame_overlay.tab8.accesskey;" label="&staff.chrome.menu_frame_overlay.tab8.label;" hidden="true" />
+                       <tab id="tab_9" accesskey="&staff.chrome.menu_frame_overlay.tab9.accesskey;" label="&staff.chrome.menu_frame_overlay.tab9.label;" hidden="true" />
                </tabs>
                <tabpanels id="main_panels" flex="1">
                        <tabpanel id="panel_1"><label value="panel_1"/></tabpanel>
index 96681b9..3e58946 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Example Template for remote xul -->
+<!--
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -35,7 +38,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( offlineStrings.getString('common.jsan.missing'));
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -63,8 +68,7 @@
                                $('password').addEventListener('keypress',handle_keypress,false);
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\nquick_auth.xul\n" + E + '\n';
+                               var err_msg =  offlineStrings.getFormattedString('common.exception', ['simple_auth.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
index 56fbd60..63b45ad 100644 (file)
@@ -44,6 +44,7 @@ util.error.prototype = {
                'D_TRACE' :  { 'dump' : true }, 
                'D_ALERT' : { 'alert' : true, 'dump' : true },
                'D_WARN' : false, 
+               'D_COLUMN_RENDER_ERROR' : false, 
                'D_XULRUNNER' : false, 
                'D_DECK' : { 'dump' : true },
                'D_TRACE_ENTER' :  false, 
@@ -254,16 +255,10 @@ util.error.prototype = {
 
        's_alert' : function (s) { alert(s); },
 
-       'get_ilsevent' : function(status) {
-               JSAN.use('OpenILS.data'); 
-               this.OpenILS.data = new OpenILS.data(); this.OpenILS.data.init({'via':'stash'});
-               return this.OpenILS.data.entities['ilsevent.'+status];
-       },
-
        'standard_network_error_alert' : function(msg) {
                var obj = this;
                if (!msg) msg = '';
-               var alert_msg = 'We experienced a network/server communication failure.  Please check your internet connection and try this action again.  Repeated failures may require attention from your local IT staff or your friendly Evergreen developers.\n\n' + msg.substr(0,100);
+               var alert_msg = 'We experienced a network/server communication failure.  Please check your internet connection and try this action again.  Repeated failures may require attention from your local IT staff or your friendly Evergreen developers.\n\n' + msg;
                obj.yns_alert(
                        alert_msg,      
                        'Communication Failure',
index 6244546..1f4ceaf 100644 (file)
@@ -227,6 +227,7 @@ util.file.prototype = {
        'pick_file' : function(params) {
                try {
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+            if (typeof params == 'undefined') params = {};
             if (typeof params.mode == 'undefined') params.mode = 'open';
                        var nsIFilePicker = Components.interfaces.nsIFilePicker;
                        var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
@@ -235,6 +236,9 @@ util.file.prototype = {
                 typeof params.title == 'undefined' ? params.mode : params.title,
                                params.mode == 'open' ? nsIFilePicker.modeOpen : nsIFilePicker.modeSave
                        );
+            if (params.defaultFileName) {
+                fp.defaultString = params.defaultFileName;
+            }
                        fp.appendFilters( nsIFilePicker.filterAll );
                        var fp_result = fp.show();
                        if ( ( fp_result == nsIFilePicker.returnOK || fp_result == nsIFilePicker.returnReplace ) && fp.file ) {
@@ -250,6 +254,7 @@ util.file.prototype = {
        'export_file' : function(params) {
                try {
                        var obj = this;
+            if (typeof params == 'undefined') params = {};
             params.mode = 'save';
             if (typeof params.data == 'undefined') throw('Need a .data field to export');
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
@@ -278,6 +283,7 @@ util.file.prototype = {
        'import_file' : function(params) {
                try {
                        var obj = this;
+            if (typeof params == 'undefined') params = {};
             params.mode = 'open';
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                        var f = obj.pick_file(params);
index 50327c2..d148bba 100644 (file)
@@ -354,10 +354,10 @@ util.list.prototype = {
                                        setTimeout(function() {
                                                dump('auto-selecting\n');
                                                var idx = Number(obj.node.view.rowCount)-1;
-                                               try { obj.node.view.selection.select(idx); } catch(E) { obj.error.sdump('D_ALERT','tree auto select: ' + E + '\n'); }
-                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, on_select: ' + E + '\n'); }
+                                               try { obj.node.view.selection.select(idx); } catch(E) { obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); }
+                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','tree auto select, on_select: ' + E + '\n'); }
                                                obj.auto_select_pending = false;
-                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(idx).firstChild); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, flesh: ' + E + '\n'); }
+                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(idx).firstChild); } catch(E) { obj.error.sdump('D_WARN','tree auto select, flesh: ' + E + '\n'); }
                                        }, 1000);
                                }
                        }
@@ -371,10 +371,10 @@ util.list.prototype = {
                                if (!obj.auto_select_pending) {
                                        obj.auto_select_pending = true;
                                        setTimeout(function() {
-                                               try { obj.node.view.selection.select(0); } catch(E) { obj.error.sdump('D_ALERT','tree auto select: ' + E + '\n'); }
-                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, on_select: ' + E + '\n'); }
+                                               try { obj.node.view.selection.select(0); } catch(E) { obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); }
+                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','tree auto select, on_select: ' + E + '\n'); }
                                                obj.auto_select_pending = false;
-                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(0).firstChild); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, flesh: ' + E + '\n'); }
+                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(0).firstChild); } catch(E) { obj.error.sdump('D_WARN','tree auto select, flesh: ' + E + '\n'); }
                                        }, 1000);
                                }
                        }
@@ -514,10 +514,10 @@ util.list.prototype = {
                                        setTimeout(function() {
                                                dump('auto-selecting\n');
                                                var idx = Number(obj.node.view.rowCount)-1;
-                                               try { obj.node.view.selection.select(idx); } catch(E) { obj.error.sdump('D_ALERT','tree auto select: ' + E + '\n'); }
-                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, on_select: ' + E + '\n'); }
+                                               try { obj.node.view.selection.select(idx); } catch(E) { obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); }
+                                               try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','tree auto select, on_select: ' + E + '\n'); }
                                                obj.auto_select_pending = false;
-                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(idx).firstChild); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, flesh: ' + E + '\n'); }
+                                               try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(idx).firstChild); } catch(E) { obj.error.sdump('D_WARN','tree auto select, flesh: ' + E + '\n'); }
                                        }, 1000);
                                }
                        }
@@ -1073,13 +1073,50 @@ util.list.prototype = {
 
     'dump_csv_to_clipboard' : function(params) {
         var obj = this;
-        if (params && params.no_full_retrieve) {
+        if (typeof params == 'undefined') params = {};
+        if (params.no_full_retrieve) {
             copy_to_clipboard( obj.dump_csv( params ) );
         } else {
             obj.wrap_in_full_retrieve( function() { copy_to_clipboard( obj.dump_csv( params ) ); } );
         }
     },
 
+    'dump_csv_to_printer' : function(params) {
+        var obj = this;
+        JSAN.use('util.print'); var print = new util.print();
+        if (typeof params == 'undefined') params = {};
+        if (params.no_full_retrieve) {
+            print.simple( obj.dump_csv( params ), {'content_type':'text/plain'} );
+        } else {
+            obj.wrap_in_full_retrieve( 
+                function() { 
+                    print.simple( obj.dump_csv( params ), {'content_type':'text/plain'} );
+                }
+            );
+        }
+    },
+
+    'dump_csv_to_file' : function(params) {
+        var obj = this;
+        JSAN.use('util.file'); var f = new util.file();
+        if (typeof params == 'undefined') params = {};
+        if (params.no_full_retrieve) {
+            params.data = obj.dump_csv( params );
+            params.not_json = true;
+            if (!params.title) params.title = 'Save List CSV As';
+            f.export_file( params );
+        } else {
+            obj.wrap_in_full_retrieve( 
+                function() { 
+                    params.data = obj.dump_csv( params );
+                    params.not_json = true;
+                    if (!params.title) params.title = 'Save List CSV As';
+                    f.export_file( params );
+                }
+            );
+        }
+    },
+
     'print' : function(params) {
         if (!params) params = {};
                switch(this.node.nodeName) {
@@ -1157,6 +1194,7 @@ util.list.prototype = {
                        data.list_clipboard = dump; data.stash('list_clipboard');
                        JSAN.use('util.window'); var win = new util.window();
                        win.open(urls.XUL_LIST_CLIPBOARD,'list_clipboard','chrome,resizable,modal');
+            window.focus(); // sometimes the main window will lower after a clipboard action
                } catch(E) {
                        this.error.standard_unexpected_error_alert('clipboard',E);
                }
index 3e77792..b0d42a6 100644 (file)
@@ -381,12 +381,12 @@ util.network.prototype = {
                        var result = obj.get_result(req);
                        if (!result) return req;
 
-                       if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
+                       if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result.ilsevent) ) != -1) ) {
                                req = override([result]);
                        } else {
                                var found_good = false; var found_bad = false;
                                for (var i = 0; i < result.length; i++) {
-                                       if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
+                                       if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result[i].ilsevent) ) != -1) ) {
                                                found_good = true;
                                        } else {
                                                found_bad = true;
index 89e47b5..b53c619 100644 (file)
@@ -237,6 +237,11 @@ util.print.prototype = {
 
                                switch(params.print_strategy || obj.data.print_strategy) {
                                        case 'dos.print':
+                        if (typeof w != 'string') {
+                                       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                                       w.getSelection().selectAllChildren(w.document.firstChild);
+                                       w = w.getSelection().toString();
+                        }
                                                obj._NSPrint_dos_print(w,silent,params);
                                        break;  
                                        case 'window.print':
@@ -271,12 +276,6 @@ util.print.prototype = {
                                the html window handle our receipt template rendering, and then force a selection of all
                                the text nodes and dump that to a file, for printing through a dos utility */
 
-                       /*
-                       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                       w.getSelection().selectAllChildren(w.document.firstChild);
-                       var text = w.getSelection().toString();
-                       */
-
                        /* NEW way: we just pass in the text */
 
                        var text = w;
@@ -287,7 +286,7 @@ util.print.prototype = {
             file.close();
                        
                        file = new util.file('receipt.bat');
-                       file.write_content('truncate+exec','#!/bin/sh\ncopy ' + path + ' lpt1 /b\nlpr ' + path + '\n');
+                       file.write_content('truncate+exec','#!/bin/sh\ncopy "' + path + '" lpt1 /b\nlpr ' + path + '\n');
             file.close();
                        file = new util.file('receipt.bat');
 
index d8c17d0..60c7090 100644 (file)
@@ -83,9 +83,13 @@ util.window.prototype = {
                        if (typeof data.modal_xulG_stack == 'undefined') data.modal_xulG_stack = {}; 
                        /* FIXME - not a perfect key.. could imagine two top-level windows both opening modal windows */
                        key = url; 
-                       if (typeof xulG == 'object') if (typeof xulG.url_prefix == 'function') {
-                               key = key.replace( xulG.url_prefix('/'), '/' ); 
-                       }
+                       if (typeof xulG == 'object') {
+                if (typeof xulG.url_prefix == 'function') {
+                                   key = key.replace( xulG.url_prefix('/'), '/' );     
+                       }
+            } else if (typeof url_prefix == 'function') {
+                                   key = key.replace( url_prefix('/'), '/' );  
+            }
                        if (typeof data.modal_xulG_stack[key] == 'undefined') data.modal_xulG_stack[key] = [];
                        data.modal_xulG_stack[key].push( my_xulG );
                        data.stash('modal_xulG_stack');
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/admin.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/admin.properties
deleted file mode 100644 (file)
index f8dacfa..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-staff.admin.survey.save_response.label=Save this response
-staff.admin.survey.save_response.accesskey=R
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/auth.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/auth.properties
new file mode 100644 (file)
index 0000000..e3e88d2
--- /dev/null
@@ -0,0 +1,14 @@
+staff.auth.controller.not_configured=Not yet configured for the specified server.
+staff.auth.controller.testing_hostname=Testing hostname...
+staff.auth.controller.prompt_hostname=Please enter a server hostname.
+staff.auth.controller.error_hostname=There was an error testing this hostname.
+staff.auth.controller.status=%1$s : %2$s
+staff.auth.controller.testing_version=Testing version...
+staff.auth.controller.error_version=There was an error checking version support.
+staff.auth.controller.version_mismatch=This server does not support your version of the staff client.  Please check with your system administrator.
+# login with <username> and <password> at <server>
+staff.auth.controller.error_login=login with %1$s and %2$s at %3$s
+staff.auth.controller.confirm_close=Are you sure you would like to exit the program completely?
+staff.auth.session.unregistered=%1$s is not registered with this server.
+staff.auth.session.login_failed=Login failed.  Please check your Server Hostname, Username, Password, and your CAPS LOCK key.
+staff.auth.session.init_false=open-ils.auth.authenticate.init returned false
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/cat.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/cat.properties
deleted file mode 100644 (file)
index 9570edf..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-cat.bib_record=Bib Record: %1$s
-cat.save_record=Save Record
-cat.save.success=Record successfully saved.
-cat.save.failure=Record not likely updated.
-cat.record.counter=Record %1$s of %2$s
-cat.preference.error=Preference not likely updated.
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/circ.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/circ.properties
deleted file mode 100644 (file)
index f359589..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-circ.bad_checkdigit=This barcode has a bad check digit.
-circ.barcode.enter=Please enter a patron barcode first.
-circ.barcode.warning=Barcode Warning
-circ.standalone=Standalone
-circ.duplicate_scan.msg=This barcode has already been scanned.
-circ.duplicate_scan.field=Duplicate Scan
-circ.offline_checkout.nonbarcoded=or choose a non-barcoded option...
-circ.offline_checkout.items=Enter the number of items:
-circ.offline_checkout.download.warning=WARNING: The non-barcode types have not been downloaded from the server.  You should log in to retrieve these.
-circ.offline_checkout.barcode.flagged.lost=Warning: As of %1$s, this barcode (%2$s) was flagged Lost.
-circ.offline_checkout.barcode.flagged.expired=Warning: As of %1$s, this barcode (%2$s) was flagged Expired.
-circ.offline_checkout.barcode.flagged.barred=Warning: As of %1$s, this barcode (%2$s) was flagged Barred.
-circ.offline_checkout.barcode.flagged.blocked=Warning: As of %1$s, this barcode (%2$s) was flagged Blocked.
-circ.offline_checkout.barcode.flagged.unknown=Warning: As of %1$s, this barcode (%2$s) was flagged with an unknown code: %3$s.
-circ.offline_checkout.date.early=Due date needs to be after today.
-circ.offline_checkout.required_field=Required Field
-circ.offline_checkout.valid_count=Please try again and enter a valid count.
-circ.offline_checkout.required_value=Required Value
-circ.offline_register.future.birth.date=Patron needs to be born yesterday.
-circ.offline_register.invalid.birth.date=Happy birthday!  You need to be more than 0 days old.
-circ.offline_register.survey.prompt=Choose a response...
-circ.offline_register.missing.post_code=Missing Address : Postal Code
-circ.offline_register.missing.state=Missing Address : State
-circ.offline_register.missing.city=Missing Address : City
-circ.offline_register.missing.street1=Missing Address : Line 1
-circ.offline_register.missing.ident_value=Missing Identification Value
-circ.offline_register.missing.ident_type=Missing Identification Type
-circ.offline_register.missing.dob=Missing Date of Birth
-circ.offline_register.missing.first_given_name=Missing First Name
-circ.offline_register.missing.family_name=Missing Last Name
-circ.offline_register.missing.passwd=Missing Password
-circ.offline_register.missing.barcode=Missing Barcode
-circ.offline_register.missing.profile=Missing Profile
-circ.offline_register.missing.home_ou=Missing Home Library
-circ.offline_register.missing.alert=Please fix the following:
-circ.offline_register.patron.saved=Patron Registration Saved
-circ.offline_register.missing.library.list=Missing library list.
-circ.offline_register.missing.profile.list=Missing profile list.
-circ.offline_register.missing.id.type.list=Missing identification type list.
-circ.offline_register.missing.required.surveys=Missing required surveys.
-circ.offline_register.missing.files.error=ERROR: Offline patron registration requires some server-generated files.  Please login periodically to retrieve these files.
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/common.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/common.properties
deleted file mode 100644 (file)
index bc454ca..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-common.exception=!! This software has encountered an error.  Please tell your friendly system administrator or software developer the following:\n%1$s\n%2$s\n
-common.jsan.missing=The JSAN library object is missing.
-common.ok=Ok
-common.clear=Clear
-common.confirm=Check here to confirm this message.
-common.error.default=Please report that this happened.
-common.barcode.status.warning=Warning: As of %1$s, this barcode (%2$s) was flagged %3.
-common.barcode.status.warning.lost=Lost
-common.barcode.status.warning.expired=Expired
-common.barcode.status.warning.barred=Barred
-common.barcode.status.warning.blocked=Blocked
-common.barcode.status.warning.unknown=with an unknown code: %1$s
-common.date.invalid=Invalid Date
diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
new file mode 100644 (file)
index 0000000..5a0ba3b
--- /dev/null
@@ -0,0 +1,152 @@
+common.exception=!! This software has encountered an error.  Please tell your friendly system administrator or software developer the following:\n%1$s\n%2$s\n
+common.jsan.missing=The JSAN library object is missing.
+common.ok=Ok
+common.clear=Clear
+common.confirm=Check here to confirm this message.
+common.error.default=Please report that this happened.
+common.barcode.status.warning=Warning: As of %1$s, this barcode (%2$s) was flagged %3.
+common.barcode.status.warning.lost=Lost
+common.barcode.status.warning.expired=Expired
+common.barcode.status.warning.barred=Barred
+common.barcode.status.warning.blocked=Blocked
+common.barcode.status.warning.unknown=with an unknown code: %1$s
+common.date.invalid=Invalid Date
+common.no=No
+common.yes=Yes
+common.unimplemented=Not Yet Implemented
+cat.bib_record=Bib Record: %1$s
+cat.opac.delete_record.confirm=Are you sure you want to delete title record #%1$s from the catalog?
+cat.opac.delete_record=Delete Record
+cat.opac.delete=Delete
+cat.opac.cancel=Cancel
+cat.opac.record_deleted=Record deleted.
+cat.opac.record_deleted.confirm=Check here to confirm this action.
+# variables: document ID, error code, error description
+cat.opac.record_delete.error=Error deleting record #%1$s : %2$s : %3$s
+cat.save_record=Save Record
+cat.save.success=Record successfully saved.
+cat.save.failure=Record not likely updated.
+cat.record.counter=Record %1$s of %2$s
+cat.preference.error=Preference not likely updated.
+staff.admin.survey.save_response.label=Save this response
+staff.admin.survey.save_response.accesskey=R
+circ.bad_checkdigit=This barcode has a bad check digit.
+circ.barcode.enter=Please enter a patron barcode first.
+circ.barcode.warning=Barcode Warning
+circ.standalone=Standalone
+circ.duplicate_scan.msg=This barcode has already been scanned.
+circ.duplicate_scan.field=Duplicate Scan
+circ.offline_checkout.nonbarcoded=or choose a non-barcoded option...
+circ.offline_checkout.items=Enter the number of items:
+circ.offline_checkout.download.warning=WARNING: The non-barcode types have not been downloaded from the server.  You should log in to retrieve these.
+circ.offline_checkout.barcode.flagged.lost=Warning: As of %1$s, this barcode (%2$s) was flagged Lost.
+circ.offline_checkout.barcode.flagged.expired=Warning: As of %1$s, this barcode (%2$s) was flagged Expired.
+circ.offline_checkout.barcode.flagged.barred=Warning: As of %1$s, this barcode (%2$s) was flagged Barred.
+circ.offline_checkout.barcode.flagged.blocked=Warning: As of %1$s, this barcode (%2$s) was flagged Blocked.
+circ.offline_checkout.barcode.flagged.unknown=Warning: As of %1$s, this barcode (%2$s) was flagged with an unknown code: %3$s.
+circ.offline_checkout.date.early=Due date needs to be after today.
+circ.offline_checkout.required_field=Required Field
+circ.offline_checkout.valid_count=Please try again and enter a valid count.
+circ.offline_checkout.required_value=Required Value
+circ.offline_register.future.birth.date=Patron needs to be born yesterday.
+circ.offline_register.invalid.birth.date=Happy birthday!  You need to be more than 0 days old.
+circ.offline_register.survey.prompt=Choose a response...
+circ.offline_register.missing.post_code=Missing Address : Postal Code
+circ.offline_register.missing.state=Missing Address : State
+circ.offline_register.missing.city=Missing Address : City
+circ.offline_register.missing.street1=Missing Address : Line 1
+circ.offline_register.missing.ident_value=Missing Identification Value
+circ.offline_register.missing.ident_type=Missing Identification Type
+circ.offline_register.missing.dob=Missing Date of Birth
+circ.offline_register.missing.first_given_name=Missing First Name
+circ.offline_register.missing.family_name=Missing Last Name
+circ.offline_register.missing.passwd=Missing Password
+circ.offline_register.missing.barcode=Missing Barcode
+circ.offline_register.missing.profile=Missing Profile
+circ.offline_register.missing.home_ou=Missing Home Library
+circ.offline_register.missing.alert=Please fix the following:
+circ.offline_register.patron.saved=Patron Registration Saved
+circ.offline_register.missing.library.list=Missing library list.
+circ.offline_register.missing.profile.list=Missing profile list.
+circ.offline_register.missing.id.type.list=Missing identification type list.
+circ.offline_register.missing.required.surveys=Missing required surveys.
+circ.offline_register.missing.files.error=ERROR: Offline patron registration requires some server-generated files.  Please login periodically to retrieve these files.
+jsan.file_not_found.error=File not found: %1$s
+jsan.namespace.creation.error=Could not create namespace[%1$s]: %2$s
+menu.cmd_edit_copy_buckets.tab=Copy Buckets
+menu.cmd_edit_volume_buckets.tab=Volume Buckets
+menu.cmd_edit_record_buckets.tab=Record Buckets
+menu.cmd_edit_user_buckets.tab=User Buckets
+menu.cmd_replace_barcode.prompt=Enter original barcode for the item:
+menu.cmd_replace_barcode.label=Replace Barcode
+menu.cmd_replace_barcode.retrieval.error=We were unable to retrieve an item with barcode "%1$s".
+menu.cmd_replace_barcode.replacement.prompt=Enter the replacement barcode for the item:
+menu.cmd_replace_barcode.replacement.label=Replace Barcode
+menu.cmd_replace_barcode.blank.error=Rename aborted.  Blank for barcode not allowed.
+menu.cmd_replace_barcode.duplicate.error=Rename aborted.  Another copy has barcode "%1$s".
+menu.cmd_replace_barcode.testing.error=Error testing replacement barcode "%1$s".
+menu.cmd_replace_barcode.permission.error=Rename aborted.  Insufficient permission.
+menu.cmd_replace_barcode.renaming.error=Error renaming item.
+menu.cmd_replace_barcode.renaming.failure=The rename operation probably failed.
+menu.cmd_search_opac.tab=Catalog
+menu.cmd_search_tcn.tab=What is the TCN or accession ID for the record?
+menu.cmd_search_tcn.prompt=TCN Lookup
+menu.cmd_search_tcn.not_found.error="%1$s" not found
+menu.cmd_search_tcn.deleted.error="%1$s" is deleted.  Show the deleted record anyway?
+menu.cmd_patron_register.related.tab=Editing Related Patron
+menu.cmd_patron_register.tab=Register Patron
+menu.cmd_browse_holds.tab=Hold Browser
+menu.cmd_browse_holds_shelf.tab=Holds Shelf
+menu.cmd_browse_hold_pull_list.tab=On Shelf Pull List
+menu.cmd_local_admin.tab=Local Administration
+menu.cmd_retrieve_last_patron.session.error=No patron visited yet this session.
+menu.cmd_retrieve_last_record.session.error=No record visited yet this session.
+menu.cmd_retrieve_last_record.status=Retrieving title...
+menu.cmd_chg_session.label=Change Login
+menu.cmd_chg_session.operator.label=Change Operator: %1$s
+menu.cmd_manage_offline_xacts.tab=Offline Transactions
+menu.cmd_download_patrons.complete.status=Download completed
+menu.cmd_download_patrons.error=There was a problem with the download.  The server returned a status %1$s : %2$s
+menu.cmd_stat_cat_edit.tab=Statistical Category Editor
+menu.cmd_non_cat_type_edit.tab=Non-Cataloged Type Editor
+menu.cmd_copy_location_edit.tab=Copy Location Editor
+menu.cmd_console.tab=JavaScript Console
+menu.cmd_shell.tab=JavaScript Shell
+menu.cmd_xuleditor.tab=XUL Editor
+menu.cmd_fieldmapper.tab=Fieldmapper
+menu.cmd_public_opac.tab=OPAC
+menu.cmd_extension_manager.tab=Extension Manager
+menu.cmd_theme_manager.tab=Theme Manager
+menu.cmd_shutdown.prompt=Exit Evergreen completely?
+menu.spawn_search.msg=Editor would like to search for: %1$s
+menu.close_all_tabs.error=Error closing all tabs
+menu.new_tab.tab=Tab
+menu.set_tab.error=pause for error
+main.testing=Testing
+main.transaction_export.title=Save Transaction File As
+main.transaction_export.prompt=Would you like to overwrite the existing file %1$s?
+main.transaction_export.prompt.title=Transaction Export Warning
+main.transaction_export.success.prompt=Your transactions have been successfully exported to file %1$s. We strongly recommend that you now purge the transactions from this staff client.  Would you like for us to do this?
+main.transaction_export.success.title=Transaction Export Successful
+main.transaction_export.filename.error=Error purging transactions:  Taking too long to find a unique filename for archival.
+main.transaction_export.duplicate.warning=Please note that you now have two sets of identical transactions.  Unless the set you just exported is solely for archival purposes, we run the risk of duplicate transactions being processed on the server.
+main.transaction_export.no_filename.error=Either you did not choose a filename, or you tried to overwrite an existing file.
+main.transaction_export.no_transactions.error=There are no outstanding transactions to export.
+main.transaction_import.outstanding.error=There are already outstanding transactions on this staff client.  Upload these first.
+main.transaction_import.title=Import Transaction File
+main.transaction_import.delete.prompt=Your transactions have been successfully migrated to this staff client.\n\nWe recommend that you delete the external copy.  Would you like for us to delete %1$s?
+main.transaction_import.success=Transaction Import Successful
+main.on_debug.clear_cache=cache cleared
+main.on_debug.debug=debug the debug :D
+main.about_btn.label=About this client...
+main.settings.migrate=This version of the staff client stores local settings in a different location than your previous installation.  Should we attempt to migrate these settings?
+main.settings.migrate.failed=WARNING: Unable to migrate legacy settings.  The settings and configuration files appear to exist in multiple locations. \nTo resolve this problem manually, please consider:\n\t%1$s\nwhich is in the directory where we want to store settings for the current operating system account, and:\n\t%2$s\nwhich is where we used to store such information.\n
+main.settings.migrate.confirm=Move the settings and configuration files from\n%1$s\nto\n%2$s?
+main.settings.migrate.error=Error trying to move %1$s to directory %2$s
+openils.global_util.clear_cache.error=Problem clearing the cache: %1$s
+openils.global_util.clipboard.error=Clipboard action failed: %1$s
+openils.global_util.clipboard=Copied "%1$s" to clipboard.
+openils.global_util.content_window_jsobject.error=Error with get_contentWindow(%1$s) and wrappedJSObject: %2$s
+openils.global_util.content_window.error=Error with get_contentWindow(%1$s): %2$s
+openils.global_util.font_size.error=Error adjusting the font size: %1$s
+
index 708b956..5a45f51 100644 (file)
@@ -5,6 +5,13 @@
 // This one is required for XUL Runner
 pref("toolkit.defaultChromeURI", "chrome://open_ils_staff_client/content/main/main.xul");
 
+// We'll use this one to help brand some build information into the client, and rely on subversion keywords
+pref("open-ils.repository.headURL","$HeadURL$");
+pref("open-ils.repository.author","$Author$");
+pref("open-ils.repository.revision","$Revision$");
+pref("open-ils.repository.date","$Date$");
+pref("open-ils.repository.id","$Id$");
+
 // 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");
diff --git a/Open-ILS/xul/staff_client/external/dtd2js.pl b/Open-ILS/xul/staff_client/external/dtd2js.pl
deleted file mode 100755 (executable)
index d7ee4e4..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/perl
-#<!ENTITY common.title "Title">
-#<!ENTITY common.author "Author">
-#<!ENTITY common.subject "Subject">
-#<!ENTITY common.series "Series">
-#<!ENTITY common.keyword "Keyword">
-#<!ENTITY common.type "Type">
-#<!ENTITY tricksy.entity 'Some text with "quoted" content'>
-
-print "var entities = {};";
-while( $line = <> ) {
-
-       if ($line =~ /<!ENTITY\s+(\S+)\s+((["']).*\3)\s*>\s*$/) {
-               print "entities['$1'] = $2;\n"; 
-       } else {
-               chomp $line;
-               if ($line) { print STDERR "Problem with: $line\n"; }
-       }
-}
diff --git a/Open-ILS/xul/staff_client/external/dtd2js.sh b/Open-ILS/xul/staff_client/external/dtd2js.sh
deleted file mode 100755 (executable)
index 12d8a5c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-./dtd2js.pl ../../../web/opac/locale/en-US/lang.dtd > ../chrome/content/main/lang.js
index bc92d5a..45fa5e8 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Modified by Jason for Evergreen -->
 
 <overlay id="openils_util_overlay"
@@ -7,7 +7,6 @@
        <scripts id="openils_util_scripts">
                <script>dump('starting openils_util_overlay\n');</script>
                <script type="text/javascript" src="/xul/server/main/constants.js" />
-               <script type="text/javascript" src="/xul/server/main/lang.js" />
                <script type="text/javascript" src="/opac/common/js/utils.js" />
                <script type="text/javascript" src="/opac/common/js/CGI.js" />
                <script type="text/javascript" src="/opac/common/js/md5.js" />
@@ -19,6 +18,8 @@
                <script type="text/javascript" src="/opac/common/js/org_utils.js" />   
                <script type="text/javascript" src="global_util.js" />   
                <script>dump('finished openils_util_overlay\n');</script>
+
+               <messagecatalog id="commonStrings" src='/xul/server/locale/<!--#echo var="locale"-->/common.properties'/>
        </scripts>
 
 </overlay>
index 8fbb556..95345ba 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Cash Reports</title>
+               <title>&staff.server.admin.cash.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script>
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
        <body onload='crInit();'>
 
                <div class='welcome_box'>
-                       <span>Welcome </span><b><span id='user'/></b>
+                       <span>&staff.server.admin.cash.welcome;</span><b><span id='user'/></b>
                </div>
 
                <center>
 
-                       <span style='padding-left: 15px;'>Start Date:</span>
+                       <span style='padding-left: 15px;'>&staff.server.admin.cash.start_date;</span>
                        <input type='text' id='cr_start' size='10' maxlength='10'> </input>
                        <button style='padding: 0px;' id='cr_start_trigger'>
                                <img src="/opac/common/js/jscalendar/img.gif" 
                                        style="cursor: pointer; border: 1px solid red; padding: 0px; margin: -3px;" 
-                                       title="Date selector"
+                                       title="&staff.server.admin.cash.date.select;"
                                        onmouseover="this.style.background='red';" 
                                        onmouseout="this.style.background=''" />
                        </button>
 
-                       <span style='padding-left: 15px;'>End Date:</span>
+                       <span style='padding-left: 15px;'>&staff.server.admin.cash.end_date;</span>
                        <input type='text' id='cr_end' size='10' maxlength='10'> </input>
                        <button style='padding: 0px;' id='cr_end_trigger'>
                                <img src="/opac/common/js/jscalendar/img.gif" 
                                        style="cursor: pointer; border: 1px solid red; padding: 0px; margin: -3px;" 
-                                       title="Date selector"
+                                       title="&staff.server.admin.cash.date.select;"
                                        onmouseover="this.style.background='red';" 
                                        onmouseout="this.style.background=''" />
                        </button>
 
-                       <div class='pad' style='padding-left: 10px; font-size: 8pt;'>(YYYY-MM-DD)</div>
+                       <div class='pad' style='padding-left: 10px; font-size: 8pt;'>&staff.server.admin.cash.date_format;</div>
 
-                       <div>View reports for :  <select id='cr_orgs' style='width:auto;'/></div>
-                       <div><button onclick='crDrawRange();'>Go!</button></div>
+                       <div>&staff.server.admin.cash.view; <select id='cr_orgs' style='width:auto;'/></div>
+                       <div><button onclick='crDrawRange();'>&staff.server.admin.cash.submit;</button></div>
 
 
                        <div id='cr_desk_payments_div'>
-                               <h2>Desk Payments</h2>
+                               <h2>&staff.server.admin.cash.desk;</h2>
                                <div id='cr_desk_payments'/>
                        </div>
                        
                        <br/><hr/><br/>
 
                        <div id='cr_user_payments_div'>
-                               <h2>User Payments</h2>
+                               <h2>&staff.server.admin.cash.user;</h2>
                                <div id='cr_user_payments'/>
                        </div>
 
index 73de8c7..d87bcb3 100644 (file)
@@ -128,7 +128,7 @@ function cdInitCals() {
 }
 
 function cdDrawRange( start, end, alertSuccess ) {
-       start = (start) ? start : new Date().getYear() + 1900 + '-01-01';
+       start = (start) ? start : new Date().getYear() + 1899 + '-01-01'; /* include last year's closed info for comparison */
        end = (end) ? end : '3001-01-01';
 
     if(alertSuccess) alertId('cd_update_success');
index ec96cc6..4cbedeb 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Libray Closed Dates Editor</title>
+               <title>&staff.server.admin.closed_dates.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script>
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
        <body onload='try{cdEditorInit();}catch(e){alert(js2JSON(e));}'>
 
                <div class='welcome_box'>
-                       <span>Welcome </span><b><span id='cd_user'/></b>
+                       <span>&staff.server.admin.closed_dates.welcome;</span><b><span id='cd_user'/></b>
                </div>
 
                <center>
-                       <div class='title'> Closed Dates Editor </div>
+                       <div class='title'>&staff.server.admin.closed_dates.editor.title;</div>
 
                        <br/>
-                       Edit Closed Dates for: <select id='cd_orgs'  style='width:auto;'/>
+                       &staff.server.admin.closed_dates.editor.for;<select id='cd_orgs'  style='width:auto;'/>
                        <br/><br/>
 
                        <table class='data_grid data_grid_center' style='width: 80%; padding: 8px;'>
                                <thead>
                                        <tr>
-                                               <td>Closed Duration</td>
-                                               <td>Reason for Closing</td>
-                                               <td>Delete</td>
+                                               <td>&staff.server.admin.closed_dates.editor.duration;</td>
+                                               <td>&staff.server.admin.closed_dates.editor.reason;</td>
+                                               <td>&staff.server.admin.closed_dates.editor.delete;</td>
                                        </tr>
                                </thead>
                                <tbody id='cd_tbody'>
@@ -86,7 +93,7 @@
                                                        Every Day From <b name='start_date'/> through <b name='end_date'/>
                                                </td>
                                                <td><div name='note'/></td>
-                                               <td><button name='delete'>delete</button></td>
+                                               <td><button name='delete'>&staff.server.admin.closed_dates.editor.allmultiday.delete;</button></td>
                                        </tr>
 
                                </tbody>
 
                        <br/>
                        <div style='width: 80%'>
-                               Note: All dates must have the form <b>YYYY-MM-DD</b>.  Times must have the form <b>HH:MM</b>
+                               &staff.server.admin.closed_dates.editor.allmultiday.format;
                        </div>
 
                        <br/>
                                <tr>
                                        <td width='100%' align='center' style='border: 1px solid #F0E0F0;'>
                                                <button id='cd_new_allday' 
-                                                       onclick='cdShowEditRow("cd_edit_allday_row");'>Add Single Day Closing</button>
+                                                       onclick='cdShowEditRow("cd_edit_allday_row");'>&staff.server.admin.closed_dates.add.allday;</button>
                                                <button id='cd_new_multiday' 
-                                                       onclick='cdShowEditRow("cd_edit_allmultiday_row");'>Add Mult-Date Closing</button>
+                                                       onclick='cdShowEditRow("cd_edit_allmultiday_row");'>&staff.server.admin.closed_dates.add.multiday;</button>
                                                <button id='cd_new' 
-                                                       onclick='cdShowEditRow("cd_edit_row");'>Add Detailed Closing</button>
+                                                       onclick='cdShowEditRow("cd_edit_row");'>&staff.server.admin.closed_dates.add.detailed;</button>
                                        </td>
                                </tr>
                        </table>
                                                <table class='data_grid data_grid_center' style='width: 100%;'>
                                                        <thead>
                                                                <tr>
-                                                                       <td>Start Date</td>
-                                                                       <td>Start Time</td>
-                                                                       <td>End Date</td>
-                                                                       <td>End Time</td>
+                                                                       <td>&staff.server.admin.closed_dates.date.start;</td>
+                                                                       <td>&staff.server.admin.closed_dates.time.start;</td>
+                                                                       <td>&staff.server.admin.closed_dates.date.end;</td>
+                                                                       <td>&staff.server.admin.closed_dates.time.end;</td>
                                                                </tr>
                                                        </thead>
                                                        <tbody>
                                                                                        <input id='cd_edit_start_time' type='text' size='5' maxlength='5'/>
                                                                                </td>
                                                                                <td>
-                                                                                       <div style='font-size: 80%;'>All Day</div>
+                                                                                       <div style='font-size: 80%;'>&staff.server.admin.closed_dates.allday.label;</div>
                                                                                        <input type='checkbox' id='cd_edit_start_time_allday'
                                                                                                onclick='
                                                                                                        var input = $("cd_edit_start_time");
                                                                                        <input id='cd_edit_end_time' type='text' size='5' maxlength='5'/>
                                                                                </td>
                                                                                <td>
-                                                                                       <div style='font-size: 80%;'>All Day</div>
+                                                                                       <div style='font-size: 80%;'>&staff.server.admin.closed_dates.allday.label;</div>
                                                                                        <input type='checkbox' id='cd_edit_end_time_allday'
                                                                                                onclick='
                                                                                                        var input = $("cd_edit_end_time");
                
                                        <tr id='cd_edit_allday_row' class='hide_me'>
                                                <td>    
-                                                       <span> All Day </span>
+                                                       <span> &staff.server.admin.closed_dates.allday.label; </span>
                                                        <input id='cd_edit_allday_start_date' type='text' size='10' maxlength='10'/>
                                                        <img src="/opac/common/js/jscalendar/img.gif"  
                                                                id='cd_edit_allday_start_date_img' class='cal_img'/>
 
                                        <tr id='cd_edit_note_row' class='hide_me' valign='middle'>
                                                <td>
-                                                       <div>Reason for closing: </div>
+                                                       <div>&staff.server.admin.closed_dates.editor.reason.label;</div>
                                                        <textarea style='border: 1px solid blue; background: #E0F0E0; margin: 5px;' 
                                                                id='cd_edit_note' wrap='soft' cols='40' rows='3'/>
                                                        <div id='cd_apply_all_div' class='hide_me'>
-                                                               Apply to all of my libraries <input type='checkbox' id='cd_apply_all'/>
+                                                               &staff.server.admin.closed_dates.apply_all; <input type='checkbox' id='cd_apply_all'/>
                                                        </div>
                                                </td>
                                        </tr>
 
                                        <tr id='cd_edit_submit' class='hide_me'>
                                                <td>
-                                                       <button onclick='cdNew();'>Save</button>
-                                                       <button onclick='cdCancelEdit();'>Cancel</button>
+                                                       <button onclick='cdNew();'>&staff.server.admin.closed_dates.save;</button>
+                                                       <button onclick='cdCancelEdit();'>&staff.server.admin.closed_dates.cancel;</button>
                                                </td>
                                        </tr>
 
                                </tbody>
                        </table>
 
-                       <span class='hide_me' id='cd_all_day'>All Day</span>
-                       <span class='hide_me' id='cd_confirm_delete'>Are you sure you wish to delete the selected close date?</span>
-                       <span class='hide_me' id='cd_invalid_date'>Invalid date format</span>
-                       <span class='hide_me' id='cd_invalid_time'>Invalid time format</span>
-                       <span class='hide_me' id='cd_update_success'>Closed date successfully updated</span>
+                       <span class='hide_me' id='cd_all_day'>&staff.server.admin.closed_dates.allday.label;</span>
+                       <span class='hide_me' id='cd_confirm_delete'>&staff.server.admin.closed_dates.confirm_delete;</span>
+                       <span class='hide_me' id='cd_invalid_date'>&staff.server.admin.closed_dates.date.invalid;</span>
+                       <span class='hide_me' id='cd_invalid_time'>&staff.server.admin.closed_dates.time.invalid;</span>
+                       <span class='hide_me' id='cd_update_success'>&staff.server.admin.closed_dates.success;</span>
                
                </center>
        </body>
index 207eb20..d6c7d05 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Copy Locations Editor</title>
+               <title>&staff.server.admin.copy_locations.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script>
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
                </div>
 
                <center>
-                       <div class='title'> Copy Locations Editor </div>
+                       <div class='title'>&staff.server.admin.copy_locations.editor;</div>
                        <br/>
 
                        <table class='data_grid data_grid_center' width='65%'>
                                <thead>
-                                       <tr><td colspan='4'>Create a new copy location</td></tr>
+                                       <tr><td colspan='4'>&staff.server.admin.copy_locations.editor.create;</td></tr>
                                </thead>
                                <tbody>
                                        <tr>
-                                               <td id='id'>Name: </td>
+                                               <td id='id'>&staff.server.admin.copy_locations.editor.name;</td>
                                                <td>
                                                        <input id='cl_new_name' type='text' size='10'/>
                                                </td>
-                                               <td>Holdable: </td>
+                                               <td>&staff.server.admin.copy_locations.editor.holdable.label;</td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <input type='radio' name='cl_new_hold' id='cl_new_hold_yes'/>
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <input type='radio' name='cl_new_hold'  
                                                                id='cl_new_hold_no' checked='checked'> </input>
                                                </td>
                                        </tr>
 
                                        <tr>
-                                               <td>OPAC Visible: </td>
+                                               <td>&staff.server.admin.copy_locations.editor.opac_visible.label;</td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <input type='radio' name='cl_new_vis' id='cl_new_vis_yes' />
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.no;</span>
                                                        <input type='radio' name='cl_new_vis'  id='cl_new_vis_no' checked='checked'> </input>
                                                </td>
-                                               <td>Circulate: </td>
+                                               <td>&staff.server.admin.copy_locations.editor.circulate.label;</td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <input type='radio' name='cl_new_circulate' id='cl_new_circulate_yes' />
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.no;</span>
                                                        <input type='radio' name='cl_new_circulate'  
                                                                id='cl_new_circulate_no' checked='checked'> </input>
                                                </td>
                                        </tr>
                                        <tr>
-                                               <td>Owning Library:</td>
+                                               <td>&staff.server.admin.copy_locations.editor.library;</td>
                                                <td colspan='2' >
                                                        <select id='cl_new_owner' disabled='disabled' style='width:auto;'> </select>
                                                </td>
                        <table class='data_grid data_grid_center' style='width: 95%'>
                                <thead>
                                        <tr>
-                                               <td width='15%'>Name</td>
-                                               <td width='20%'>Owning Library</td>
+                                               <td width='15%'>&staff.server.admin.copy_locations.editor.name;</td>
+                                               <td width='20%'>&staff.server.admin.copy_locations.editor.library;</td>
                                                <td width='15%'>
-                                                       <span>Holdable </span>
-                                                       <a class='context_help' href='javascript:clHoldMsg();'> ??</a>
+                                                       <span>&staff.server.admin.copy_locations.editor.holdable;</span>
+                                                       <a class='context_help' href='javascript:clHoldMsg();'></a>
                                                </td>
-                                               <td width='15%'>OPAC Visible</td>
-                                               <td width='15%'>Circulate</td>
-                                               <td width='10%'>Edit</td>
-                                               <td width='10%'>Delete</td>
+                                               <td width='15%'>&staff.server.admin.copy_locations.editor.opac_visible;</td>
+                                               <td width='15%'>&staff.server.admin.copy_locations.editor.circulate;</td>
+                                               <td width='10%'>&staff.server.admin.copy_locations.editor.edit;</td>
+                                               <td width='10%'>&staff.server.admin.copy_locations.editor.delete;</td>
                                        </tr>
                                </thead>
                                <tbody id='cl_tbody'>
                 </center>
 
                 <div class='hide_me'>
-                       <span id='yes'>Yes</span>
-                       <span id='no'>No</span>
+                       <span id='yes'>&staff.server.admin.copy_locations.editor.yes;</span>
+                       <span id='no'>&staff.server.admin.copy_locations.editor.no;</span>
                        <span id='cl_hold_msg'>
-                               If a copy location is "Holdable", copies in that location may have holds placed on them.
+                               &staff.server.admin.copy_locations.editor.help.holdable;
                        </span>
                        <span id='cl_delete_confirm'>
-                               Are you sure you wish to delete the selected copy location?
-                               Note: If copies are currently attached to this location, the delete operation will fail.
+                               &staff.server.admin.copy_locations.editor.delete.confirm;
                        </span>
                        <table>
-                               <tbody>
-                                       <tr id='cl_edit' class='insert_row'>
+                <tbody> 
+                    <tr id='cl_edit' class='insert_row'>
                                                <td><input name='cl_edit_name' type='text'> </input></td>
                                                <td name='cl_edit_owner'></td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <span name='cl_edit_holdable_yes'>
                                                                <input type='radio' name='cl_edit_holdable'/>
                                                        </span>
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.no;</span>
                                                        <span name='cl_edit_holdable_no'>
                                                                <input type='radio' name='cl_edit_holdable'/>
                                                        </span>
                                                </td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <span name='cl_edit_visible_yes'>
                                                                <input type='radio' name='cl_edit_visible'/>
                                                        </span>
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.no;</span>
                                                        <span name='cl_edit_visible_no'>
                                                                <input type='radio' name='cl_edit_visible'/>
                                                        </span>
                                                </td>
                                                <td>
-                                                       <span>Yes</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.yes;</span>
                                                        <span name='cl_edit_circulate_yes'>
                                                                <input type='radio' name='cl_edit_circulate'/>
                                                        </span>
-                                                       <span>No</span>
+                                                       <span>&staff.server.admin.copy_locations.editor.no;</span>
                                                        <span name='cl_edit_circulate_no'>
                                                                <input type='radio' name='cl_edit_circulate'/>
                                                        </span>
                                                </td>
-                                               <td><input type='submit' name='cl_edit_commit' value='Submit'/></td>
-                                               <td><input type='submit' name='cl_edit_cancel' value='Cancel'/></td>
+                                               <td><input type='submit' name='cl_edit_commit' value='&staff.server.admin.copy_locations.submit;'/></td>
+                                               <td><input type='submit' name='cl_edit_cancel' value='&staff.server.admin.copy_locations.cancel;'/></td>
                                        </tr>
                                </tbody>
                        </table>
                </div>
        </body>
        <span class='hide_me' id='cl_update_success'>
-               Update Succeeded
+               &staff.server.admin.copy_locations.update_success;
        </span>
 </html>
 
index 55bfcab..6466cc0 100644 (file)
@@ -11,7 +11,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,8 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
+
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                JSAN.use('util.file'); var file = new util.file('global_font_adjust');
                                file.set_object(g.data.global_font_adjust);
                                file.close();
-                               alert('Global Font saved to file system.');
+                               alert(document.getElementById("adminStrings").getString('staff.admin.font_settings.save'));
                        } catch(E) {
                                try { g.error.standard_unexpected_error_alert('saving in admin/font_settings.xul',E); } catch(F) { alert(E); }
                        }
                }
 
-               function adjust(my_class,my_msg) {
+               function adjust(my_class) {
+                       var status_msg = {
+                               'ALL_FONTS_SMALLER': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_SMALLER'),
+                               'ALL_FONTS_DEFAULT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_DEFAULT'),
+                               'ALL_FONTS_LARGER': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_LARGER'),
+                               'ALL_FONTS_XX_SMALL': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_XX_SMALL'),
+                               'ALL_FONTS_X_SMALL': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_X_SMALL'),
+                               'ALL_FONTS_SMALL': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_SMALL'),
+                               'ALL_FONTS_MEDIUM': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_MEDIUM'),
+                               'ALL_FONTS_LARGE': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_LARGE'),
+                               'ALL_FONTS_X_LARGE': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_X_LARGE'),
+                               'ALL_FONTS_XX_LARGE': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_XX_LARGE'),
+                               'ALL_FONTS_5PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_5PT'),
+                               'ALL_FONTS_6PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_6PT'),
+                               'ALL_FONTS_7PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_7PT'),
+                               'ALL_FONTS_8PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_8PT'),
+                               'ALL_FONTS_9PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_9PT'),
+                               'ALL_FONTS_10PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_10PT'),
+                               'ALL_FONTS_11PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_11PT'),
+                               'ALL_FONTS_12PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_12PT'),
+                               'ALL_FONTS_13PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_13PT'),
+                               'ALL_FONTS_14PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_14PT'),
+                               'ALL_FONTS_15PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_15PT'),
+                               'ALL_FONTS_16PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_16PT'),
+                               'ALL_FONTS_17PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_17PT'),
+                               'ALL_FONTS_18PT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_18PT'),
+                               'ALL_FONTS_DEFAULT': document.getElementById("adminStrings").getString('staff.admin.font_settings.status_msg.ALL_FONTS_DEFAULT')
+                       };
+
                        try {
                                g.data.global_font_adjust = my_class; g.data.stash('global_font_adjust');
-                               alert(my_msg);
+                               alert(status_msg[my_class]);
                        } catch(E) {
                                try { g.error.standard_unexpected_error_alert('setting font in admin/font_settings.xul',E); } catch(F) { alert(E); }
                        }
                        try {
                                var bool = document.getElementById('sound').checked;
                                g.data.no_sound = bool; g.data.stash('no_sound');
-                               alert('Sound is now ' + (bool ? ' disabled.' : ' enabled.') ); 
+                               if (bool) {
+                                       alert(document.getElementById("adminStrings").getString('staff.admin.font_settings.sound.disabled'));
+                               } else {
+                                       alert(document.getElementById("adminStrings").getString('staff.admin.font_settings.sound.enabled'));
+                               }
                        } catch(E) {
                                try { g.error.standard_unexpected_error_alert('setting sound in admin/font_settings.xul',E); } catch(F) { alert(E); }
                        }
                                JSAN.use('util.file'); var file = new util.file('no_sound');
                                file.write_content( 'truncate', String( document.getElementById('sound').checked ) );
                                file.close();
-                               alert('Sound preference saved to file system.');
+                               alert(document.getElementById("adminStrings").getString('staff.admin.font_settings.sound'));
                        } catch(E) {
                                try { g.error.standard_unexpected_error_alert('saving in admin/font_settings.xul',E); } catch(F) { alert(E); }
                        }
        ]]>
        </script>
 
+       <messagecatalog id="adminStrings" src='/xul/server/locale/<!--#echo var="locale"-->/admin.properties'/>
+
        <groupbox orient="vertical">
-               <caption label="Adjust Sound"/>
+               <caption label="&staff.server.admin.font.sound.caption;"/>
                <hbox>
-                       <checkbox id="sound" label="Disable sound?" oncommand="toggle_sound();"/>
-                       <button label='Save to Disk' oncommand="save_sound();"/>
+                       <checkbox id="sound" label="&staff.server.admin.font.sound.checkbox;" oncommand="toggle_sound();"/>
+                       <button label="&staff.server.admin.save_disk;" oncommand="save_sound();"/>
                </hbox>
        </groupbox>
 
        <groupbox>
-               <caption label="Adjust Global Font"/>
+               <caption label="&staff.server.admin.font.global.caption;"/>
                <hbox>
                        <vbox>
-                               <button class="ALL_FONTS_SMALLER" label="Smaller than Default" oncommand="adjust('ALL_FONTS_SMALLER','Global Font Adjust set to Smaller than Default');"/>
-                               <button class="ALL_FONTS_DEFAULT" label="Default" oncommand="adjust('ALL_FONTS_DEFAULT','Global Font Adjust set to Default');"/>
-                               <button class="ALL_FONTS_LARGER" label="Larger than Default" oncommand="adjust('ALL_FONTS_LARGER','Global Font Adjust set to Larger than Default');"/>
+                               <button class="ALL_FONTS_SMALLER" label="&staff.server.admin.font.smaller;" oncommand="adjust('ALL_FONTS_SMALLER');"/>
+                               <button class="ALL_FONTS_DEFAULT" label="&staff.server.admin.font.default;" oncommand="adjust('ALL_FONTS_DEFAULT');"/>
+                               <button class="ALL_FONTS_LARGER" label="&staff.server.admin.font.larger;" oncommand="adjust('ALL_FONTS_LARGER');"/>
                        </vbox>
                        <vbox>
-                               <button class="ALL_FONTS_XX_SMALL" label="XX-Small" oncommand="adjust('ALL_FONTS_XX_SMALL','Global Font set to XX-Small');"/>
-                               <button class="ALL_FONTS_X_SMALL" label="X-Small" oncommand="adjust('ALL_FONTS_X_SMALL','Global Font set to X-Small');"/>
-                               <button class="ALL_FONTS_SMALL" label="Small" oncommand="adjust('ALL_FONTS_SMALL','Global Font set to Small');"/>
-                               <button class="ALL_FONTS_MEDIUM" label="Medium" oncommand="adjust('ALL_FONTS_MEDIUM','Global Font set to Medium');"/>
-                               <button class="ALL_FONTS_LARGE" label="Large" oncommand="adjust('ALL_FONTS_LARGE','Global Font set to Large');"/>
-                               <button class="ALL_FONTS_X_LARGE" label="X-Large" oncommand="adjust('ALL_FONTS_X_LARGE','Global Font set to X-Large');"/>
-                               <button class="ALL_FONTS_XX_LARGE" label="XX-Large" oncommand="adjust('ALL_FONTS_XX_LARGE','Global Font set to XX-Large');"/>
+                               <button class="ALL_FONTS_XX_SMALL" label="&staff.server.admin.font.xxsmall;" oncommand="adjust('ALL_FONTS_XX_SMALL');"/>
+                               <button class="ALL_FONTS_X_SMALL" label="&staff.server.admin.font.xsmall;" oncommand="adjust('ALL_FONTS_X_SMALL');"/>
+                               <button class="ALL_FONTS_SMALL" label="&staff.server.admin.font.small;" oncommand="adjust('ALL_FONTS_SMALL');"/>
+                               <button class="ALL_FONTS_MEDIUM" label="&staff.server.admin.font.medium;" oncommand="adjust('ALL_FONTS_MEDIUM');"/>
+                               <button class="ALL_FONTS_LARGE" label="&staff.server.admin.font.large;" oncommand="adjust('ALL_FONTS_LARGE');"/>
+                               <button class="ALL_FONTS_X_LARGE" label="&staff.server.admin.font.xlarge;" oncommand="adjust('ALL_FONTS_X_LARGE');"/>
+                               <button class="ALL_FONTS_XX_LARGE" label="&staff.server.admin.font.xxlarge;" oncommand="adjust('ALL_FONTS_XX_LARGE');"/>
                        </vbox>
                        <vbox>
-                               <button class="ALL_FONTS_5PT" label="5pt" oncommand="adjust('ALL_FONTS_5PT','Global Font set to 5pt');"/>
-                               <button class="ALL_FONTS_6PT" label="6pt" oncommand="adjust('ALL_FONTS_6PT','Global Font set to 6pt');"/>
-                               <button class="ALL_FONTS_7PT" label="7pt" oncommand="adjust('ALL_FONTS_7PT','Global Font set to 7pt');"/>
-                               <button class="ALL_FONTS_8PT" label="8pt" oncommand="adjust('ALL_FONTS_8PT','Global Font set to 8pt');"/>
-                               <button class="ALL_FONTS_9PT" label="9pt" oncommand="adjust('ALL_FONTS_9PT','Global Font set to 9pt');"/>
-                               <button class="ALL_FONTS_10PT" label="10pt" oncommand="adjust('ALL_FONTS_10PT','Global Font set to 10pt');"/>
-                               <button class="ALL_FONTS_11PT" label="11pt" oncommand="adjust('ALL_FONTS_11PT','Global Font set to 11pt');"/>
-                               <button class="ALL_FONTS_12PT" label="12pt" oncommand="adjust('ALL_FONTS_12PT','Global Font set to 12pt');"/>
-                               <button class="ALL_FONTS_13PT" label="13pt" oncommand="adjust('ALL_FONTS_13PT','Global Font set to 13pt');"/>
-                               <button class="ALL_FONTS_14PT" label="14pt" oncommand="adjust('ALL_FONTS_14PT','Global Font set to 14pt');"/>
-                               <button class="ALL_FONTS_15PT" label="15pt" oncommand="adjust('ALL_FONTS_15PT','Global Font set to 15pt');"/>
-                               <button class="ALL_FONTS_16PT" label="16pt" oncommand="adjust('ALL_FONTS_16PT','Global Font set to 16pt');"/>
-                               <button class="ALL_FONTS_17PT" label="17pt" oncommand="adjust('ALL_FONTS_17PT','Global Font set to 17pt');"/>
-                               <button class="ALL_FONTS_18PT" label="18pt" oncommand="adjust('ALL_FONTS_18PT','Global Font set to 18pt');"/>
+                               <button class="ALL_FONTS_5PT" label="&staff.server.admin.font.5pt;" oncommand="adjust('ALL_FONTS_5PT');"/>
+                               <button class="ALL_FONTS_6PT" label="&staff.server.admin.font.6pt;" oncommand="adjust('ALL_FONTS_6PT');"/>
+                               <button class="ALL_FONTS_7PT" label="&staff.server.admin.font.7pt;" oncommand="adjust('ALL_FONTS_7PT');"/>
+                               <button class="ALL_FONTS_8PT" label="&staff.server.admin.font.8pt;" oncommand="adjust('ALL_FONTS_8PT');"/>
+                               <button class="ALL_FONTS_9PT" label="&staff.server.admin.font.9pt;" oncommand="adjust('ALL_FONTS_9PT');"/>
+                               <button class="ALL_FONTS_10PT" label="&staff.server.admin.font.10pt;" oncommand="adjust('ALL_FONTS_10PT');"/>
+                               <button class="ALL_FONTS_11PT" label="&staff.server.admin.font.11pt;" oncommand="adjust('ALL_FONTS_11PT');"/>
+                               <button class="ALL_FONTS_12PT" label="&staff.server.admin.font.12pt;" oncommand="adjust('ALL_FONTS_12PT');"/>
+                               <button class="ALL_FONTS_13PT" label="&staff.server.admin.font.13pt;" oncommand="adjust('ALL_FONTS_13PT');"/>
+                               <button class="ALL_FONTS_14PT" label="&staff.server.admin.font.14pt;" oncommand="adjust('ALL_FONTS_14PT');"/>
+                               <button class="ALL_FONTS_15PT" label="&staff.server.admin.font.15pt;" oncommand="adjust('ALL_FONTS_15PT');"/>
+                               <button class="ALL_FONTS_16PT" label="&staff.server.admin.font.16pt;" oncommand="adjust('ALL_FONTS_16PT');"/>
+                               <button class="ALL_FONTS_17PT" label="&staff.server.admin.font.17pt;" oncommand="adjust('ALL_FONTS_17PT');"/>
+                               <button class="ALL_FONTS_18PT" label="&staff.server.admin.font.18pt;" oncommand="adjust('ALL_FONTS_18PT');"/>
                        </vbox>
                        <vbox>
-                               <button label="Restore Default" flex="1" oncommand="adjust('ALL_FONTS_DEFAULT','Global Font Adjust set to Default');"/>
-                               <button label='Save to Disk' flex="1" oncommand="save();"/>
+                               <button label="&staff.server.admin.font.restore;" flex="1" oncommand="adjust('ALL_FONTS_DEFAULT');"/>
+                               <button label="&staff.server.admin.save_disk;" flex="1" oncommand="save();"/>
                        </vbox>
                </hbox>
        </groupbox>
index 082af82..d8d5323 100644 (file)
@@ -1,8 +1,9 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
 
 <!DOCTYPE html PUBLIC 
        "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
        <!ENTITY nbsp " "> <!-- calendar needs this entity -->
 ]>
 
@@ -10,7 +11,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen Holds Pull List</title>
+               <title>&staff.server.admin.hold_pull.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script> 
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
        <body onload='try{pullListInit();}catch(e){alert(js2JSON(e));}'>
 
                <center>
-                       <h2>Evergreen Holds Pull List : <span id='pl_org'/></h2>
+                       <h2>&staff.server.admin.hold_pull.header;<span id='pl_org'/></h2>
 
                        <div style='position:absolute; top: 5px; right: 5px;'>
-                               <span>Welcome </span><b><span id='pl_user'/></b>
+                               <span>&staff.server.admin.hold_pull.greeting;</span><b><span id='pl_user'/></b>
                        </div>
                
                        <hr/><br/>
 
-                       <span>Note: Click on a column header to sort the column</span>
+                       <span>&staff.server.admin.hold_pull.sort.note;</span>
 
                        <table width='100%' class='data_grid sortable' id='pl_table'>
                                <thead>
                                        <tr>
-                                               <td>Title</td>
-                                               <td>Author</td>
-                                               <td>Copy Location</td>
-                                               <td id='pl_callnumber'>Call Number</td>
-                                               <td>Item Barcode</td>
-                                               <td>Copy Number</td>
-                                               <td>Format</td>
-                                               <td>Patron Barcode</td>
-                                               <td>Hold Placement Date</td>
-                                               <td>Hold Type</td>
+                                               <td>&staff.server.admin.hold_pull.title;</td>
+                                               <td>&staff.server.admin.hold_pull.author;</td>
+                                               <td>&staff.server.admin.hold_pull.copy_location;</td>
+                                               <td id='pl_callnumber'>&staff.server.admin.hold_pull.call_number;</td>
+                                               <td>&staff.server.admin.hold_pull.item_barcode;</td>
+                                               <td>&staff.server.admin.hold_pull.copy;</td>
+                                               <td>&staff.server.admin.hold_pull.format;</td>
+                                               <td>&staff.server.admin.hold_pull.patron_barcode;</td>
+                                               <td>&staff.server.admin.hold_pull.hold_date;</td>
+                                               <td>&staff.server.admin.hold_pull.hold_type;</td>
                                        </tr>
                                </thead>
                                <tbody id='pull_list_tbody'>
                                                <td name='barcode'/>
                                                <td name='copy_number'/>
                                                <td>
-                                                       <span name='format_at'          class='hide_me'>Book</span>
-                                                       <span name='format_at-d'        class='hide_me'>Large Print Book</span>
-                                                       <span name='format_i'           class='hide_me'>Audiobook</span>
-                                                       <span name='format_g'           class='hide_me'>Video Recording</span>
-                                                       <span name='format_j'           class='hide_me'>Music</span>
-                                                       <span name='format_m'           class='hide_me'>Electronic Resource</span>
+                                                       <span name='format_at'          class='hide_me'>&staff.server.admin.hold_pull.book;</span>
+                                                       <span name='format_at-d'        class='hide_me'>&staff.server.admin.hold_pull.large_book;</span>
+                                                       <span name='format_i'           class='hide_me'>&staff.server.admin.hold_pull.audiobook;</span>
+                                                       <span name='format_g'           class='hide_me'>&staff.server.admin.hold_pull.video;</span>
+                                                       <span name='format_j'           class='hide_me'>&staff.server.admin.hold_pull.music;</span>
+                                                       <span name='format_m'           class='hide_me'>&staff.server.admin.hold_pull.eresource;</span>
                                                </td>
                                                <td name='patron'/>
                                                <td name='date'/>
                                                <td>
-                                                       <span name='copy_hold' class='hide_me'>Copy Hold</span>
-                                                       <span name='volume_hold' class='hide_me'>Volume Hold</span>
-                                                       <span name='title_hold' class='hide_me'>Title Hold</span>
-                                                       <span name='mr_hold' class='hide_me'>Metarecord Hold</span>
+                                                       <span name='copy_hold' class='hide_me'>&staff.server.admin.hold_pull.copy_hold;</span>
+                                                       <span name='volume_hold' class='hide_me'>&staff.server.admin.hold_pull.volume_hold;</span>
+                                                       <span name='title_hold' class='hide_me'>&staff.server.admin.hold_pull.title_hold;</span>
+                                                       <span name='mr_hold' class='hide_me'>&staff.server.admin.hold_pull.metarecord_hold;</span>
                                                </td>
                                        </tr>
                                </tbody>
index 900408e..1df350c 100644 (file)
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -56,8 +56,7 @@
                                default_focus();
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\npatron/holds.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['patron/holds.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
index b1b8779..6100744 100644 (file)
@@ -1,7 +1,14 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
-               <title>Local System Administration</title>
+               <title>&staff.server.admin.index.title;</title>
                <script>
                        function _l(l,p) { 
                 var url = l + location.search;
@@ -21,7 +28,7 @@
        <body>
                <center>
                        <div style='height: 40px; margin-top: 20px; font-weight: bold; font-size: 14pt;'>
-                               Local System Administration
+                               &staff.server.admin.index.title;
                        </div>
                        <img src='../skin/media/images/tools.png'/>
                        <style>
                        <table width='100%'>
                                <thead>
                                        <tr>
-                                               <th width='30%'>Workstation Configuration</th>
-                                               <th width='30%'>Library Configuration</th>
-                                               <th width='30%'>Maintenance Reports</th>
+                                               <th width='30%'>&staff.server.admin.index.workstation_configuration;</th>
+                                               <th width='30%'>&staff.server.admin.index.library_configuration;</th>
+                                               <th width='30%'>&staff.server.admin.index.maintenance_reports;</th>
                                        </tr>
                                </thead>
                                <tbody>
                                        <tr valign="top">
                                                <td>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("font_settings.xul");'>Global Font and Sound Settings</a>
+                                                               <a href='javascript:_l("font_settings.xul");'>&staff.server.admin.index.fonts_and_sounds;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("printer_settings.html");'>Printer Settings Editor</a>
+                                                               <a href='javascript:_l("printer_settings.html");'>&staff.server.admin.index.printer;</a>
                                                        </div>
                                                </td><td>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("closed_dates.xhtml");'>Closed Dates Editor</a>
+                                                               <a href='javascript:_l("closed_dates.xhtml");'>&staff.server.admin.index.closed_dates;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("copy_locations.xhtml");'>Copy Locations Editor</a>
+                                                               <a href='javascript:_l("copy_locations.xhtml");'>&staff.server.admin.index.copy_locations;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("org_settings.xhtml");'>Library Settings Editor</a>
+                                                               <a href='javascript:_l("org_settings.xhtml");'>&staff.server.admin.index.library_settings;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("non_cat_types.xhtml");'>Non Cataloged Types Editor</a>
+                                                               <a href='javascript:_l("non_cat_types.xhtml");'>&staff.server.admin.index.non_cataloged_types;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("stat_cat_editor.xhtml");'>Statistical Categories Editor</a>
+                                                               <a href='javascript:_l("stat_cat_editor.xhtml");'>&staff.server.admin.index.statistical_categories;</a>
                                                        </div>
                                                </td><td>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("hold_pull_list.xul");'>Pull List for Hold Requests</a> <span style="color: red">(Testing)</span>
+                                                               <a href='javascript:_l("hold_pull_list.xul");'>&staff.server.admin.index.hold_pull_list;</a> <span style="color: red">&staff.server.admin.index.testing;</span>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("hold_pull_list_classic.xhtml");'>Pull List for Hold Requests (Classic)</a> <span style="color: red">(Testing)</span>
+                                                               <a href='javascript:_l("hold_pull_list_classic.xhtml");'>&staff.server.admin.index.hold_pull_list_classic;</a> <span style="color: red">&staff.server.admin.index.testing;</span>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l( "/reports/oils_rpt.xhtml","build_id=" + getBuildId() );'>Reports</a>
+                                                               <a href='javascript:_l( "/reports/oils_rpt.xhtml","build_id=" + getBuildId() );'>&staff.server.admin.index.reports;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:_l("cash_reports.xhtml");'>Cash Reports</a>
+                                                               <a href='javascript:_l("cash_reports.xhtml");'>&staff.server.admin.index.cash_reports;</a>
                                                        </div>
                                                        <div style='padding: 8px;'>
-                                                               <a href='javascript:window.xulG.new_tab("/xul/server/admin/transit_list.xul",{"tab_name":"Transits"},{});'>Transit List</a>
+                                                               <a href='javascript:window.xulG.new_tab("/xul/server/admin/transit_list.xul",{"tab_name":"&staff.server.admin.index.transits;"},{});'>&staff.server.admin.index.transit_list;</a>
                                                        </div>
                                                </td>
                                        </tr>
index b445c97..210e7a7 100644 (file)
@@ -141,7 +141,7 @@ function ncSetRowCallbacks( type, owner, tbody, row ) {
 
 function ncEditType( tbody, row, type ) {
        cleanTbody(row.parentNode, 'edit');
-       var row = $('nc_edit_row_temaplate').cloneNode(true);
+       var row = $('nc_edit_row_template').cloneNode(true);
 
        var name = $n(row, 'nc_edit_name');
        name.value = type.name();
index 4e3c64c..0fb9230 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Non Cataloged Types Editor</title>
+               <title>&staff.server.admin.non_cat_types.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script>
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
        <body onload='try{ncEditorInit();}catch(e){alert(js2JSON(e));}'>
 
                <div class='welcome_box'>
-                       <span>Welcome </span><b><span id='nc_user'/></b>
+                       <span>&staff.server.admin.non_cat_types.greeting;</span><b><span id='nc_user'/></b>
                </div>
 
                <center>
-                       <div class='title'> Non Cataloged Types Editor </div>
+                       <div class='title'>&staff.server.admin.non_cat_types.editor.title;</div>
 
                        <br/>
 
                        <table class='data_grid data_grid_center' width='85%'>
                                <thead>
-                                       <tr><td colspan='5'>Create a new non-cataloged type</td></tr>
+                                       <tr><td colspan='5'>&staff.server.admin.non_cat_types.editor.header;</td></tr>
                                </thead>
                                <tbody>
                                        <tr>
                                                <td>
                                                        <input id='nc_new_interval_count' type='text' size='3' maxlength='3' value='14'/>
                                                        <select id='nc_new_interval_type' style='width: 6em;'>
-                                                               <option value='minutes'>Minutes</option>
-                                                               <option value='hours'>Hours</option>
-                                                               <option value='days' selected='selected'>Days</option>
-                                                               <option value='weeks'>Weeks</option>
-                                                               <option value='months'>Months</option>
+                                                               <option value='minutes'>&staff.server.admin.non_cat_types.editor.minutes;</option>
+                                                               <option value='hours'>&staff.server.admin.non_cat_types.editor.hours;</option>
+                                                               <option value='days' selected='selected'>&staff.server.admin.non_cat_types.editor.days;</option>
+                                                               <option value='weeks'>&staff.server.admin.non_cat_types.editor.weeks;</option>
+                                                               <option value='months'>&staff.server.admin.non_cat_types.editor.months;</option>
                                                        </select>
                                                </td>
-                                               <td>Circulate In-House? 
-                                                       <a href='javascript:alert($("cd_in_house_exp").innerHTML);' style='color:red'>(??)</a>
+                                               <td>&staff.server.admin.non_cat_types.in_house_circ;
+                                                       <a href='javascript:alert($("cd_in_house_exp").innerHTML);' style='color:red'>&staff.server.admin.non_cat_types.in_house.help;</a>
                                                        <input id='nc_new_inhouse' type='checkbox'/>
                                                </td>
                                                <td><select class='select_big' id='nc_new_owner' disabled='disabled'> </select></td>
-                                               <td><input id='nc_new_submit' type='submit' value='Create' disabled='disabled'> </input></td>
+                                               <td><input id='nc_new_submit' type='submit' value='&staff.server.admin.non_cat_types.editor.create;' disabled='disabled'> </input></td>
                                        </tr>
                                </tbody>
                        </table>
                        <table id='nc_table' class='data_grid' width='85%'>
                                <thead>
                                        <tr>
-                                               <td>Name</td>
-                                               <td>Owning Location</td>
-                                               <td>Duration</td>
-                                               <td>Circulate In House</td>
-                                               <td>Edit</td>
-                                               <td>Delete</td>
+                                               <td>&staff.server.admin.non_cat_types.name;</td>
+                                               <td>&staff.server.admin.non_cat_types.owning_location;</td>
+                                               <td>&staff.server.admin.non_cat_types.duration;</td>
+                                               <td>&staff.server.admin.non_cat_types.in_house.circulate;</td>
+                                               <td>&staff.server.admin.non_cat_types.edit;</td>
+                                               <td>&staff.server.admin.non_cat_types.delete;</td>
                                        </tr>
                                </thead>
                                <tbody id='nc_tbody'>
                                                <td>
                                                        <input name='nc_interval_count' type='text' size='3' maxlength='3' disabled='disabled'/>
                                                        <select name='nc_interval_type' style='width: 6em;' disabled='disabled'>
-                                                               <option value='minutes'>Minutes</option>
-                                                               <option value='hours'>Hours</option>
-                                                               <option value='days'>Days</option>
-                                                               <option value='weeks'>Weeks</option>
-                                                               <option value='months'>Months</option>
+                                                               <option value='minutes'>&staff.server.admin.non_cat_types.editor.minutes;</option>
+                                                               <option value='hours'>&staff.server.admin.non_cat_types.editor.hours;</option>
+                                                               <option value='days'>&staff.server.admin.non_cat_types.editor.days;</option>
+                                                               <option value='weeks'>&staff.server.admin.non_cat_types.editor.weeks;</option>
+                                                               <option value='months'>&staff.server.admin.non_cat_types.editor.months;</option>
                                                        </select>
                                                </td>
                                                <td>
                                                        <input name='nc_inhouse' type='checkbox' disabled='disabled'/>
                                                </td>
-                                               <td><input name='nc_edit' type='submit' value='Edit' disabled='disabled'/></td>
-                                               <td><input name='nc_delete' type='submit' value='Delete' disabled='disabled'/></td>
+                                               <td><input name='nc_edit' type='submit' value='&staff.server.admin.non_cat_types.edit;' disabled='disabled'/></td>
+                                               <td><input name='nc_delete' type='submit' value='&staff.server.admin.non_cat_types.delete;' disabled='disabled'/></td>
                                        </tr>
                                </tbody>
                        </table>
 
                <table class='hide_me'> <!-- repository for template rows -->
                        <tbody>
-                               <tr id='nc_edit_row_temaplate' class='insert_row' edit='1'>
+                               <tr id='nc_edit_row_template' class='insert_row' edit='1'>
                                        <td align='center'>
                                                <span class='padded'>
                                                        <input name='nc_edit_name' type='text'> </input>
                                                <span>
                                                        <input name='nc_edit_interval_count' type='text' size='3' maxlength='3'/>
                                                        <select name='nc_edit_interval_type' style='width: 6em;'>
-                                                               <option value='minutes'>Minutes</option>
-                                                               <option value='hours'>Hours</option>
-                                                               <option value='days'>Days</option>
-                                                               <option value='weeks'>Weeks</option>
-                                                               <option value='months'>Months</option>
+                                                               <option value='minutes'>&staff.server.admin.non_cat_types.editor.minutes;</option>
+                                                               <option value='hours'>&staff.server.admin.non_cat_types.editor.hours;</option>
+                                                               <option value='days'>&staff.server.admin.non_cat_types.editor.days;</option>
+                                                               <option value='weeks'>&staff.server.admin.non_cat_types.editor.weeks;</option>
+                                                               <option value='months'>&staff.server.admin.non_cat_types.editor.months;</option>
                                                        </select>
                                                </span>
                                        </td>
 
                                        <td>
                                                <span class='padded'>
-                                                       <input name='nc_edit_submit' type='submit' value='Submit'> </input>
+                                                       <input name='nc_edit_submit' type='submit' value='&staff.server.admin.non_cat_types.submit;'> </input>
                                                </span>
                                        </td>
                                        <td>
                                                <span class='padded'>
-                                                       <input name='nc_edit_cancel' type='submit' value='Cancel'> </input>
+                                                       <input name='nc_edit_cancel' type='submit' value='&staff.server.admin.non_cat_types.cancel;'> </input>
                                                </span>
                                        </td>
                                </tr>
        </body>
 
        <span class='hide_me' id='nc_delete_confirm'>
-               Are you sure you wish to delete the select non cataloged type?
+               &staff.server.admin.non_cat_types.delete.confirm;
        </span>
 
        <span class='hide_me' id='cd_in_house_exp'>
-               If the 'In-House' flag is set on a non-cataloged type, items that circulate as
-               that type will create "In-House" circulations.  This is ideal for computer use, 
-               room "rentals", etc.
+               &staff.server.admin.non_cat_types.in_house.help;
        </span>
 
        <span class='hide_me' id='nc_update_success'>
-               Non cataloged type successfully updated
+               &staff.server.admin.non_cat_types.update.success;
        </span>
 
        <span class='hide_me' id='nc_type_exists'>
-               A Non-Cat type with the selected name already exists.
+               &staff.server.admin.non_cat_types.name_exists;
        </span>
 
 
 </html>
 
-
-       
index cfb7a4c..395fcca 100644 (file)
@@ -1,3 +1,6 @@
+<!--
+vim: noet:ts=4:sw=4:
+-->
 dump('entering admin/offline_manage_xacts.js\n');
 
 if (typeof admin == 'undefined') admin = {};
@@ -59,53 +62,59 @@ admin.offline_manage_xacts.prototype = {
                        'columns' : [
                                {
                                        'id' : 'org', 'hidden' : 'true', 'flex' : '1',
-                                       'label' : 'Organization',
-                                       'render' : function(my) { return obj.data.hash.aou[ my.org ].shortname(); },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.organization'),
+                                       'render' : function(my) { return obj.data.hash.aou[ my.org ].shortname(); }
                                },
                                { 
                                        'id' : 'description', 'flex' : '2',
-                                       'label' : 'Description', 
-                                       'render' : function(my) { return my.description; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.description'),
+                                       'render' : function(my) { return my.description; }
                                },
                                {
                                        'id' : 'create_time', 'flex' : '1',
-                                       'label' : 'Date Created',
-                                       'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_created'),
+                                       'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; }
                                },
                                {
                                        'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Created By',
-                                       'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.creator ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.created_by'),
+                                       'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.creator ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); }
                                },
                                { 
                                        'id' : 'count', 'flex' : '1',
-                                       'label' : 'Upload Count'
-                                       'render' : function(my) { return my.scripts.length; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.upload_count')
+                                       'render' : function(my) { return my.scripts.length; }
                                },
                                { 
                                        'id' : 'num_complete', 'flex' : '1', 
-                                       'label' : 'Transactions Processed'
-                                       'render' : function(my) { return my.num_complete; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.transactions_processed')
+                                       'render' : function(my) { return my.num_complete; }
                                },
                                { 
                                        'id' : 'in_process', 'flex' : '1',
-                                       'label' : 'Processing?', 
-                                       'render' : function(my) { if (my.end_time) { return 'Completed' } else { return get_bool(my.in_process) ? 'Yes' : 'No'}; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.processing'),
+                                       'render' : function(my) {
+                                               if (my.end_time) {
+                                                       return $('adminStrings').getString('staff.admin.offline_manage_xacts.completed')
+                                               } else {
+                                                       return get_bool(my.in_process) ? $('adminStrings').getString('staff.admin.offline_manage_xacts.yes') : $('adminStrings').getString('staff.admin.offline_manage_xacts.no')
+                                               };
+                                       }
                                },
                                {
                                        'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Date Started',
-                                       'render' : function(my) { if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_started'),
+                                       'render' : function(my) { if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; }
                                },
                                {
                                        'id' : 'end_time', 'flex' : '1',
-                                       'label' : 'Date Completed',
-                                       'render' : function(my) { if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_completed'),
+                                       'render' : function(my) { if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; }
                                },
                                { 
                                        'id' : 'key', 'hidden' : 'true', 'flex' : '1', 
-                                       'label' : 'Session', 
-                                       'render' : function(my) { return my.key; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.session'),
+                                       'render' : function(my) { return my.key; }
                                },
                        ],
                        'map_row_to_columns' : patron.util.std_map_row_to_columns(),
@@ -178,7 +187,7 @@ admin.offline_manage_xacts.prototype = {
                                } catch(E) {
                                        alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + '  obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
                                }
-                       },
+                       }
                } );
 
 
@@ -191,26 +200,26 @@ admin.offline_manage_xacts.prototype = {
                        'columns' : [
                                {
                                        'id' : 'create_time', 'flex' : '1',
-                                       'label' : 'Date Uploaded',
-                                       'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.date_uploaded'),
+                                       'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; }
                                },
                                {
                                        'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Uploaded By',
-                                       'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.requestor ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.uploaded_by'),
+                                       'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.requestor ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); }
                                },
                                { 
                                        'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1', 
-                                       'label' : 'Server/Local Time Delta', 
-                                       'render' : function(my) { return my.time_delta; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.time_delta'),
+                                       'render' : function(my) { return my.time_delta; }
                                },
                                { 
                                        'id' : 'workstation', 'flex' : '1', 
-                                       'label' : 'Workstation', 
-                                       'render' : function(my) { return my.workstation; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.workstation'),
+                                       'render' : function(my) { return my.workstation; }
                                },
                        ],
-                       'map_row_to_columns' : patron.util.std_map_row_to_columns(),
+                       'map_row_to_columns' : patron.util.std_map_row_to_columns()
                } );
 
 
@@ -223,73 +232,73 @@ admin.offline_manage_xacts.prototype = {
                        'columns' : [
                                {
                                        'id' : 'workstation', 'flex' : '1',
-                                       'label' : 'Workstation',
-                                       'render' : function(my) { return my.command._workstation ? my.command._workstation : my.command._worksation; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.workstation'),
+                                       'render' : function(my) { return my.command._workstation ? my.command._workstation : my.command._worksation; }
                                },
                                {
                                        'id' : 'timestamp', 'flex' : '1',
-                                       'label' : 'Timestamp',
-                                       'render' : function(my) { if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return my.command._realtime; }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.timestamp'),
+                                       'render' : function(my) { if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return my.command._realtime; }; }
                                },
                                {
                                        'id' : 'type', 'flex' : '1',
-                                       'label' : 'Type',
-                                       'render' : function(my) { return my.command.type; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.type'),
+                                       'render' : function(my) { return my.command.type; }
                                },
                                { 
                                        'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1', 
-                                       'label' : 'Event Code', 
-                                       'render' : function(my) { return my.event.ilsevent; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_code'),
+                                       'render' : function(my) { return my.event.ilsevent; }
                                },
                                { 
                                        'id' : 'textcode', 'flex' : '1', 
-                                       'label' : 'Event Name', 
-                                       'render' : function(my) { return typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/'); },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_name'),
+                                       'render' : function(my) { return typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/'); }
                                },
                                {
                                        'id' : 'desc', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Event Description',
-                                       'render' : function(my) { return my.event.desc; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_description'),
+                                       'render' : function(my) { return my.event.desc; }
                                },
                                {
                                        'id' : 'i_barcode', 'flex' : '1',
-                                       'label' : 'Item Barcode',
-                                       'render' : function(my) { return my.command.barcode ? my.command.barcode : ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.item_barcode'),
+                                       'render' : function(my) { return my.command.barcode ? my.command.barcode : ""; }
                                },
                                {
                                        'id' : 'p_barcode', 'flex' : '1',
-                                       'label' : 'Patron Barcode',
-                                       'render' : function(my) { if (my.command.patron_barcode) { return my.command.patron_barcode; } else { if (my.command.user.card.barcode) { return my.command.user.card.barcode; } else { return ""; } }; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.patron_barcode'),
+                                       'render' : function(my) { if (my.command.patron_barcode) { return my.command.patron_barcode; } else { if (my.command.user.card.barcode) { return my.command.user.card.barcode; } else { return ""; } }; }
                                },
                                {
                                        'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Due Date',
-                                       'render' : function(my) { return my.command.due_date || ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.due_date'),
+                                       'render' : function(my) { return my.command.due_date || ""; }
                                },
                                {
                                        'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Check In Backdate',
-                                       'render' : function(my) { return my.command.backdate || ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.backdate'),
+                                       'render' : function(my) { return my.command.backdate || ""; }
                                },
                                {
                                        'id' : 'count', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'In House Use Count',
-                                       'render' : function(my) { return my.command.count || ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.count'),
+                                       'render' : function(my) { return my.command.count || ""; }
                                },
                                {
                                        'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Non-Cataloged?',
-                                       'render' : function(my) { return get_bool(my.command.noncat) ? "Yes" : "No"; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat'),
+                                       'render' : function(my) { return get_bool(my.command.noncat) ? $('adminStrings').getString('staff.admin.offline_manage_xacts.yes') : $('adminStrings').getString('staff.admin.offline_manage_xacts.no'); }
                                },
                                {
                                        'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Non-Cataloged Type',
-                                       'render' : function(my) { return data.hash.cnct[ my.command.noncat_type ] ? obj.data.hash.cnct[ my.command.noncat_type ].name() : ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat_type'),
+                                       'render' : function(my) { return data.hash.cnct[ my.command.noncat_type ] ? obj.data.hash.cnct[ my.command.noncat_type ].name() : ""; }
                                },
                                {
                                        'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
-                                       'label' : 'Non-Cataloged Count',
-                                       'render' : function(my) { return my.command.noncat_count || ""; },
+                                       'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat_count'),
+                                       'render' : function(my) { return my.command.noncat_count || ""; }
                                },
                        ],
                        'map_row_to_columns' : patron.util.std_map_row_to_columns(),
@@ -365,7 +374,7 @@ admin.offline_manage_xacts.prototype = {
                        }
                        return robj.length == 0 ? true : false;
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error checking permissions',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.check_perm'),E);
                }
        },
 
@@ -389,16 +398,18 @@ admin.offline_manage_xacts.prototype = {
                        x.send(null);
 
                        dump(url + ' = ' + x.responseText + '\n' );
-                       if (!x.responseText) throw('Bad response from CGI component');
+                       if (!x.responseText) {
+                               throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
+                       }
                        var robj = JSON2js(x.responseText);
 
-                       if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
+                       if (robj.ilsevent != 0) { alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.execute_error') + ' ' + x.responseText); }
 
                        obj.retrieve_seslist(); obj.render_seslist();
                }
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error executing session',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.session_execute_error'),E);
                }
        },
 
@@ -421,13 +432,15 @@ admin.offline_manage_xacts.prototype = {
                x.send(null);
 
                dump(url + ' = ' + x.responseText + '\n' );
-               if (!x.responseText) throw('Bad response from CGI component');
+               if (!x.responseText) {
+                       throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
+               }
                var robj = JSON2js(x.responseText);
 
                return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
 
                } catch(E) {
-                       throw('Error retrieving session errors: ' + E);
+                       throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.session_retrieval') + ' ' + E);
                }
 
        },
@@ -440,19 +453,23 @@ admin.offline_manage_xacts.prototype = {
 
                JSAN.use('util.file'); 
                var pending = new util.file('pending_xacts');
-               if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
+               if ( !pending._file.exists() ) {
+                       throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.non_existent_file'));
+               }
                obj.transition_filename = 'pending_xacts_' + new Date().getTime();
                var count = 0;
                var file = new util.file(obj.transition_filename);
                while (file._file.exists()) {
                        obj.transition_filename = 'pending_xacts_' + new Date().getTime();
                        file = new util.file(obj.transition_filename);
-                       if (count++>100) throw("Taking too long to find a unique filename.");
+                       if (count++>100) {
+                               throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.unique_file'));
+                       }
                }
                pending._file.moveTo(null,obj.transition_filename);
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error renaming xact file',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.renaming_file'),E);
                }
        },
 
@@ -464,12 +481,22 @@ admin.offline_manage_xacts.prototype = {
 
                JSAN.use('util.file');
                var pending = new util.file('pending_xacts');
-               if (pending._file.exists()) { obj.error.yns_alert('Something bad happened.  New offline transactions were accumulated during our attempted upload.  Tell your system admin that the file involved is ' + obj.transition_filename,'Scary Error','Ok',null,null,'Check here to confirm this message'); return; }
+               if (pending._file.exists()) { 
+                       obj.error.yns_alert(
+                                       $('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.transaction_conflicts', [obj.transition_filename]),
+                                       $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.title'),
+                                       $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.ok'),
+                                       null,
+                                       null,
+                                       $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.confirm')
+                       );
+                       return;
+               }
                var file = new util.file(obj.transition_filename);
                file._file.moveTo(null,'pending_xacts');
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error reverting xact file',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.reverting_file'),E);
                }
        },
 
@@ -484,7 +511,7 @@ admin.offline_manage_xacts.prototype = {
                if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete');
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error archiving xact file',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.archiving_file'),E);
                }
        },
 
@@ -494,13 +521,22 @@ admin.offline_manage_xacts.prototype = {
 
                try {
 
-               if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
-               if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
+               if (obj.sel_list.length == 0) { 
+                       alert($('adminStrings').getString('staff.admin.offline_manage_xacts.session_upload'));
+                       return;
+               }
+               if (obj.sel_list.length > 1) {
+                       alert($('adminStrings').getString('staff.admin.offline_manage_xacts.single_session_upload'));
+                       return;
+               }
 
                JSAN.use('util.file');
 
                var file = new util.file('pending_xacts');
-               if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
+               if (!file._file.exists()) {
+                       alert($('adminStrings').getString('staff.admin.offline_manage_xacts.no_transactions'));
+                       return;
+               }
 
                obj.rename_file();
 
@@ -539,7 +575,7 @@ admin.offline_manage_xacts.prototype = {
                                                dump('robj = ' + js2JSON(robj) + '\n');
                                                if ( robj.ilsevent != 0 ) {
                                                        obj.revert_file();
-                                                       alert('There was an error:\n' + js2JSON(robj));
+                                                       alert($('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.uploading_file') + '\n' + js2JSON(robj));
                                                } else {
                                                        obj.archive_file();
                                                }
@@ -559,7 +595,7 @@ admin.offline_manage_xacts.prototype = {
                get_contentWindow(x).xulG = newG;
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error uploading xacts',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.uploading_transactions'),E);
                }
        },
 
@@ -582,14 +618,16 @@ admin.offline_manage_xacts.prototype = {
                x.send(null);
 
                dump(url + ' = ' + x.responseText + '\n' );
-               if (!x.responseText) throw('Bad response from CGI component');
+               if (!x.responseText) {
+                       throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
+               }
                var robj = JSON2js(x.responseText);
 
                return robj;
 
                } catch(E) {
 
-                       obj.error.standard_unexpected_error_alert('Error retrieving session status',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.retrieving_session'),E);
                        return { 'ilsevent' : -2 };     
 
                }
@@ -601,7 +639,11 @@ admin.offline_manage_xacts.prototype = {
 
                try {
 
-               var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
+               var desc = window.prompt(
+                               $('adminStrings').getString('staff.admin.offline_manage_xacts.create_session.prompt'),
+                               '',
+                               $('adminStrings').getString('staff.admin.offline_manage_xacts.create_session')
+               );
                if (desc=='' || desc==null) { return; }
 
                clear_the_cache();
@@ -617,16 +659,18 @@ admin.offline_manage_xacts.prototype = {
                x.send(null);
 
                dump(url + ' = ' + x.responseText + '\n' );
-               if (!x.responseText) throw('Bad response from CGI component');
+               if (!x.responseText) {
+                       throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
+               }
                var robj = JSON2js(x.responseText);
                if (robj.ilsevent == 0) {
                        obj.retrieve_seslist(); obj.render_seslist();
                } else {
-                       alert('Error: ' + x.responseText);
+                       alert($('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.create_session.alert', [x.responseText]));
                }
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error creating session',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.create_session'), E);
                }
 
        },
@@ -651,7 +695,9 @@ admin.offline_manage_xacts.prototype = {
 
                        dump(url + ' = ' + typeof(x.responseText) + '\n' );
 
-                       if (!x.responseText) throw('Bad response from CGI component');
+                       if (!x.responseText) {
+                               throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
+                       }
 
                        var robj = JSON2js( x.responseText );
                        if (typeof robj.ilsevent != 'undefined') throw(robj);
@@ -665,7 +711,7 @@ admin.offline_manage_xacts.prototype = {
                        );
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error retrieving offline sessions.',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.retrieving_sessions'),E);
                }
        },
 
@@ -699,7 +745,7 @@ admin.offline_manage_xacts.prototype = {
                document.getElementById('upload').disabled = true;
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error rendering session list',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_session'),E);
                }
        },
 
@@ -716,7 +762,7 @@ admin.offline_manage_xacts.prototype = {
                obj.script_list.clear();
 
                var status = obj.ses_status();
-               document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
+               $('status_caption').setAttribute('label', $('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.upload_status', [status.description]));
 
                var scripts = status.scripts;
 
@@ -734,7 +780,7 @@ admin.offline_manage_xacts.prototype = {
                exec.chain( funcs );
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error rendering script list',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_script'),E);
                }
        },
        
@@ -751,7 +797,7 @@ admin.offline_manage_xacts.prototype = {
                obj.error_list.clear();
 
                var error_meta = obj.ses_errors();
-               document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
+               $('errors_caption').setAttribute('label',$('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.rendering_errors', [error_meta.description]));
 
                obj.errors = error_meta.errors;
 
@@ -769,7 +815,7 @@ admin.offline_manage_xacts.prototype = {
                exec.chain( funcs );
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error rendering error list',E);
+                       obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_error_list'),E);
                }
        },
 
@@ -854,7 +900,7 @@ admin.offline_manage_xacts.prototype = {
                        alert(E);
                }
 
-       },
+       }
 }
 
 dump('exiting admin/offline_manage_xacts.js\n');
index 0bf9973..84dd92c 100644 (file)
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -34,7 +34,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -44,9 +44,7 @@
                                g.admin.init({});
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'admin/offline_manage_xacts.xul\n' + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['admin/offline_manage_xacts.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
 
        ]]>
        </script>
+       <messagecatalog id="adminStrings" src="/xul/server/locale/<!--#echo var='locale'-->/admin.properties"/>
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
 
        <vbox id="admin_offline_manage_xacts_main" flex="1">
 
                <groupbox flex="1">
-                       <caption label="Offline Sessions"/>
+                       <caption label="&staff.server.admin.offline.xacts.sessions;"/>
                        <hbox>
-                               <button id="refresh" label="Refresh" accesskey="R"/>
-                               <button id="create" label="Create" disabled="true"/>
-                               <button id="execute" label="Process" disabled="true"/>
+                               <button id="refresh" label="&common.refresh;" accesskey="&staff.server.admin.offline.xacts.refresh.accesskey;"/>
+                               <button id="create" label="&staff.server.admin.offline.xacts.create.label;" disabled="true"/>
+                               <button id="execute" label="&staff.server.admin.offline.xacts.execute.label;" disabled="true"/>
                                <spacer flex="1"/>
-                               <button id="upload" label="Upload" disabled="true"/>
+                               <button id="upload" label="&staff.server.admin.offline.xacts.update.label;" disabled="true"/>
                        </hbox>
                        <tree id="session_tree" enableColumnDrag="true" seltype="single" flex="1"/>
                </groupbox>
                <deck flex="1" id="deck">
                        <label value=" "/>
                        <groupbox flex="1">
-                               <caption id="status_caption" label="Uploaded Transaction Files"/>
+                               <caption id="status_caption" label="&staff.server.admin.offline.xacts.status.label;"/>
                                <description style="background-color: lightgreen">
-                               The transactions from the following workstations have been uploaded, but not processed.  When all expected workstations are present here, use the Process button above.
+                &staff.server.admin.offline.xacts.status.desc;
                                </description>
                                <tree id="script_tree" enableColumnDrag="true" seltype="single" flex="1"/>
                        </groupbox>
                        <groupbox flex="1">
-                               <caption id="errors_caption" label="Exceptions"/>
+                               <caption id="errors_caption" label="&staff.server.admin.offline.xacts.errors.label;"/>
                                <description style="background-color: orange">
-                               All transactions from this session have been processed.  The errors, if any, are listed below.
+                &staff.server.admin.offline.xacts.errors.desc;
                                </description>
                                <vbox flex="1">
                                        <hbox>
-                                               <button id='export_btn' label="Export List" />
-                                               <button id='print_export_btn' label="Print Export" />
+                                               <button id='export_btn' label="&staff.server.admin.offline.xacts.export.label;" />
+                                               <button id='print_export_btn' label="&staff.server.admin.offline.xacts.print.label;" />
                                                <spacer flex="1"/>
-                                               <button id='retrieve_item' label="Retrieve Item" disabled="true"/>
-                                               <button id='retrieve_patron' label="Retrieve Patron" disabled="true"/>
-                                               <button id='retrieve_details' label="Details" disabled="true"/>
+                                               <button id='retrieve_item' label="&staff.server.admin.offline.xacts.get_item.label;" disabled="true"/>
+                                               <button id='retrieve_patron' label="&staff.server.admin.offline.xacts.get_patron.label;" disabled="true"/>
+                                               <button id='retrieve_details' label="&staff.server.admin.offline.xacts.get_details.label;" disabled="true"/>
                                        </hbox>
                                        <tree id="error_tree" enableColumnDrag="true" seltype="multiple" flex="1"/>
                                </vbox>
                        </groupbox>
                        <groupbox flex="1">
-                               <caption id="errors_caption" label="The session is now processing.  Hit Refresh to check its status."/>
+                               <caption id="errors_caption" label="&staff.server.admin.offline.xacts.errors.caption;"/>
                        </groupbox>
                </deck>
                <hbox id="iframe_placeholder" hidden="false" flex="0"/>
index 67bd0d0..63965ff 100644 (file)
@@ -140,7 +140,7 @@ function osUpdate( setting, allOrgs ) {
 
 function osUpdateOrg( setting, value, org ) {
        var s = {};
-       s[setting] = value;
+    s[setting] = (value.match(/^\s*$/) == null) ? value : null;
        var req = new Request(ORG_SETTING_UPDATE, SESSION, org, s);
        req.request.alertEvent = false;
        req.send(true);
index 19cb0ed..7b4d911 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Library Settings Editor</title>
+               <title>&staff.server.admin.org_settings.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script>
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
        <body onload='osEditorInit();'>
 
                <div class='welcome_box'>
-                       <span>Welcome </span><b><span id='user'/></b>
+                       <span>&staff.server.admin.org_settings.greeting;</span><b><span id='user'/></b>
                </div>
 
                <center>
-                       <div class='title'> Library Settings Editor </div>
+                       <div class='title'>&staff.server.admin.org_settings.header;</div>
 
                        <br/><br/>
-                       Edit Settings for : <select id='os_orgs' style='width:auto;'/>
+                       &staff.server.admin.org_settings.select_library;<select id='os_orgs' style='width:auto;'/>
                        <br/><br/>
 
                        <table class='data_grid data_grid_center' width='85%'>
                                <thead>
-                                       <tr><td colspan='4' style='padding: 8px;'>Library Settings for <b id='osCurrentOrg'/></td></tr>
+                                       <tr><td colspan='4' style='padding: 8px;'>&staff.server.admin.org_settings.selected_library;<b id='osCurrentOrg'/></td></tr>
                                </thead>
                                <tbody id='os_tbody'>
                                        <tr>
-                                               <td>OPAC Inactivity Timeout (in seconds)</td>
+                                               <td>&staff.server.admin.org_settings.opac_timeout;</td>
                                                <td><input type='text' id='auth.opac_timeout' size='5'/></td>
-                                               <td><button id='auth.opac_timeout.apply'>Apply</button></td>
-                                               <td><button id='auth.opac_timeout.apply_all'>Apply to all Locations</button></td>
+                                               <td><button id='auth.opac_timeout.apply'>&staff.server.admin.org_settings.apply;</button></td>
+                                               <td><button id='auth.opac_timeout.apply_all'>&staff.server.admin.org_settings.apply_all;</button></td>
                                        </tr>
                                        <tr>
-                                               <td>Staff Login Inactivity Timeout (in seconds)</td>
+                                               <td>&staff.server.admin.org_settings.staff_timeout;</td>
                                                <td><input type='text' id='auth.staff_timeout' size='5'/></td>
-                                               <td><button id='auth.staff_timeout.apply'>Apply</button></td>
-                                               <td><button id='auth.staff_timeout.apply_all'>Apply to all Locations</button></td>
+                                               <td><button id='auth.staff_timeout.apply'>&staff.server.admin.org_settings.apply;</button></td>
+                                               <td><button id='auth.staff_timeout.apply_all'>&staff.server.admin.org_settings.apply_all;</button></td>
                                        </tr>
                                        <tr>
-                                               <td>Lost Materials Processing Fee</td>
+                                               <td>&staff.server.admin.org_settings.lost_fee;</td>
                                                <td>&#036;<input ismoney='1' type='text' id='circ.lost_materials_processing_fee' size='5'/></td>
-                                               <td><button id='circ.lost_materials_processing_fee.apply'>Apply</button></td>
-                                               <td><button id='circ.lost_materials_processing_fee.apply_all'>Apply to all Locations</button></td>
+                                               <td><button id='circ.lost_materials_processing_fee.apply'>&staff.server.admin.org_settings.apply;</button></td>
+                                               <td><button id='circ.lost_materials_processing_fee.apply_all'>&staff.server.admin.org_settings.apply_all;</button></td>
                                        </tr>
                                        <tr>
-                                               <td>Default Item Price</td>
+                                               <td>&staff.server.admin.org_settings.default_price;</td>
                                                <td>&#036;<input ismoney='1' type='text' id='cat.default_item_price' size='5'/></td>
-                                               <td><button id='cat.default_item_price.apply'>Apply</button></td>
-                                               <td><button id='cat.default_item_price.apply_all'>Apply to all Locations</button></td>
+                                               <td><button id='cat.default_item_price.apply'>&staff.server.admin.org_settings.apply;</button></td>
+                                               <td><button id='cat.default_item_price.apply_all'>&staff.server.admin.org_settings.apply_all;</button></td>
                                        </tr>
                                        <tr>
-                                               <td>"FROM" email address for patron notices<br/>(note: delivery failures will be returned this address)</td>
+                                               <td>&staff.server.admin.org_settings.from_address;<br/>&staff.server.admin.org_settings.bounce_note;</td>
                                                <td><input type='text' id='org.bounced_emails' size='25'/></td>
-                                               <td><button id='org.bounced_emails.apply'>Apply</button></td>
-                                               <td><button id='org.bounced_emails.apply_all'>Apply to all Locations</button></td>
+                                               <td><button id='org.bounced_emails.apply'>&staff.server.admin.org_settings.apply;</button></td>
+                                               <td><button id='org.bounced_emails.apply_all'>&staff.server.admin.org_settings.apply_all;</button></td>
                                        </tr>
                                </tbody>
                        </table>
                        <br/>
                        <div style='font-size: 9pt;'>
                                <div>
-                                       I. "Apply to all Locations" will force the new setting 
-                                       to be applied to all locations in the location dropdown.
+                                       &staff.server.admin.org_settings.apply_all.note;
                                </div>
                        </div>
                </center>
                <span id='os_success' class='hide_me'>
-                       Update succeeded.
+                       &staff.server.admin.org_settings.update_success;
                </span>
                <span id='os_confirm_all' class='hide_me'>
-                       This will update the setting for all of the locations listed in the dropdown menu.
-                       Are you sure you wish to continue?
+                       &staff.server.admin.org_settings.apply_all.confirm;
                </span>
        </body>
 </html>
index d84f22d..1756852 100644 (file)
@@ -1,8 +1,15 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <head>
-               <title>Evergreen: Statistical Category Editor</title>
+               <title>&staff.server.admin.stat_cat.title;</title>
                <script language='javascript' src='/opac/common/js/utils.js'> </script>
                <script language='javascript' src='/opac/common/js//config.js'> </script> 
                <script language='javascript' src='/opac/common/js/CGI.js'> </script>
 
 
                <div style='position:absolute; top: 5px; right: 5px;'>
-                       <span>Welcome </span><b><span id='sc_user'/></b>
+                       <span>&staff.server.admin.stat_cat.greeting;</span><b><span id='sc_user'/></b>
                </div>
 
                <center>
-                       <div style='font-weight: bold; font-size: 12pt;'> Statistical Category Editor</div>
+                       <div style='font-weight: bold; font-size: 12pt;'>&staff.server.admin.stat_cat.heading;</div>
                </center>
 
                <hr/> 
                        <table class='data_grid data_grid_center' width='80%'>
                                <thead>
                                        <tr>
-                                               <td colspan='4'>Create a new statistical category</td>
+                                               <td colspan='4'>&staff.server.admin.stat_cat.create;</td>
                                        </tr>
                                </thead>
                                <tbody>
                                        <tr>
-                                               <td>Enter the name: </td>
+                                               <td>&staff.server.admin.stat_cat.name;</td>
                                                <td>
                                                        <input type='text' id='sc_new_name'> </input>
                                                        <script>$('sc_new_name').focus();</script>
                                                </td>
-                                               <td>Owning Library: </td>
+                                               <td>&staff.server.admin.stat_cat.owning_library;</td>
                                                <td>
                                                        <select id='sc_owning_lib_selector' style='width:auto;'>
                                                        </select>
                                                </td>
                                        </tr>
                                        <tr>
-                                               <td>Opac Visibility: </td>
+                                               <td>&staff.server.admin.stat_cat.opac_visibility;</td>
                                                <td>    
-                                                       <span>On</span>
+                                                       <span>&staff.server.admin.stat_cat.on;</span>
                                                        <input type='radio' name='opac_visibility' id='sc_make_opac_visible'> </input>
-                                                       <span>Off</span>
+                                                       <span>&staff.server.admin.stat_cat.off;</span>
                                                        <input type='radio' name='opac_visibility' checked='checked'> </input>
                                                </td>
-                                               <td>Type: </td>
+                                               <td>&staff.server.admin.stat_cat.type;</td>
                                                <td>
                                                        <select id='sc_type_selector'>
-                                                               <option value='actor'>Patron</option>
-                                                               <option value='asset'>Copy</option>
+                                                               <option value='actor'>&staff.server.admin.stat_cat.patron;</option>
+                                                               <option value='asset'>&staff.server.admin.stat_cat.copy;</option>
                                                        </select>
                                                </td>
                                        </tr>
                                        <tr>
                                                <td colspan='4'>
-                                                       <input type='submit' value='Create new stat cat' onclick='scNew();' id='sc_new'/>
+                                                       <input type='submit' value='&staff.server.admin.stat_cat.create.submit;' onclick='scNew();' id='sc_new'/>
                                                </td>
                                        </tr>
                                </tbody>
                        <hr/>
                        <br/>
 
-                       <div id='loading' class='has_color'><h2>Loading permissions and stat cats...</h2></div>
+                       <div id='loading' class='has_color'><h2>&staff.server.admin.stat_cat.loading_status;</h2></div>
 
                        <table width='98%'>
                                <tbody>
                                        <tr>
                                                <td width='20%'> </td>
                                                <td id='sc_show_copy' width='30%' class='has_color'
-                                                       align='center'><a href='javascript:scShow("asset");'>Copy Stat Cats</a></td>
+                                                       align='center'><a href='javascript:scShow("asset");'>&staff.server.admin.stat_cat.copy_stat_cats;</a></td>
                                                <td id='sc_show_actor' width='30%' 
-                                                       align='center'><a href='javascript:scShow("actor");'>Patron Stat Cats</a></td>
+                                                       align='center'><a href='javascript:scShow("actor");'>&staff.server.admin.stat_cat.patron_stat_cats;</a></td>
                                                <td width='20%'> </td>
                                        </tr>
                                </tbody>
 
 
                        <br/>
-                       <div>* To edit or view information about an entry, click on the entry in the drop-down menu</div>
+                       <div>&staff.server.admin.stat_cat.info_prompt;</div>
                        <br/>
 
-                       <div style='padding: 20px;' id='sc_none' class='hide_me'><b>No stat cats are defined</b></div>
+                       <div style='padding: 20px;' id='sc_none' class='hide_me'><b>&staff.server.admin.stat_cat.none_defined;</b></div>
 
                        <!--
                        <div style='overflow: auto; max-height: 200px;'>
                                <table width='95%' class='hide_me data_grid data_grid_center' id='sc_table'>
                                        <thead>
                                                <tr>
-                                                       <td>Stat Cat Name</td>
-                                                       <td>Owning Library</td>
-                                                       <td>OPAC Visiblity</td>
-                                                       <td>Entries</td>
-                                                       <td>Add Entry</td>
-                                                       <td>Edit</td>
+                                                       <td>&staff.server.admin.stat_cat.name.label;</td>
+                                                       <td>&staff.server.admin.stat_cat.owning_library.label;</td>
+                                                       <td>&staff.server.admin.stat_cat.opac_visibility.label;</td>
+                                                       <td>&staff.server.admin.stat_cat.entries.label;</td>
+                                                       <td>&staff.server.admin.stat_cat.add_entry;</td>
+                                                       <td>&staff.server.admin.stat_cat.edit;</td>
                                                </tr>
                                        </thead>
        
                                                        <td name='sc_owning_lib'> </td>
        
                                                        <td>
-                                                               <span class='hide_me' name='sc_opac_visible'>On</span> 
-                                                               <span class='hide_me' name='sc_opac_invisible'>Off</span> 
+                                                               <span class='hide_me' name='sc_opac_visible'>&staff.server.admin.stat_cat.on;</span> 
+                                                               <span class='hide_me' name='sc_opac_invisible'>&staff.server.admin.stat_cat.off;</span> 
                                                        </td>
        
-                                                       <td><select class='selector' name='sc_entries_selector'><option>(none)</option></select></td>
-                                                       <td><a href='javascript:void(0);' name='sc_new_entry'>Add</a></td>
-                                                       <td><a href='javascript:void(0);' name='sc_edit'>Edit</a></td>
+                                                       <td><select class='selector' name='sc_entries_selector'><option>&staff.server.admin.stat_cat.none;</option></select></td>
+                                                       <td><a href='javascript:void(0);' name='sc_new_entry'>&staff.server.admin.stat_cat.add.label;</a></td>
+                                                       <td><a href='javascript:void(0);' name='sc_edit'>&staff.server.admin.stat_cat.edit;</a></td>
                                                </tr>
                                        </tbody>
                                </table>
 
 
                <!-- Text spans  / template +++++++++++++++++++++++++++++++++++++  -->
-               <span class='hide_me' id='sc_new_entry_text'>Enter the value for the new stat cat entry</span>
+               <span class='hide_me' id='sc_new_entry_text'>&staff.server.admin.stat_cat.add.prompt;</span>
 
                <span class='hide_me' id='sc_delete_confirm'>
-                       This will delete the selected stat cat and all attached entries
-                       Are you sure you wish to continue?
+                       &staff.server.admin.stat_cat.delete.confirm;
                </span>
 
                <span class='hide_me' id='sc_entry_delete_confirm'>
-                       Are you sure you wish to remove this stat cat entry?
+                       &staff.server.admin.stat_cat.entry_delete.confirm;
                </span>
 
                <table class='hide_me'>
                                </td>
 
                                <td>
-                                       <span>On</span>
+                                       <span>&staff.server.admin.stat_cat.on;</span>
                                        <span name='sc_edit_opac_vis'>
                                                <input type='radio' name='sc_edit_opac_visibility'> </input>
                                        </span>
-                                       <span>Off</span>
+                                       <span>&staff.server.admin.stat_cat.off;</span>
                                        <span name='sc_edit_opac_invis'>
                                                <input type='radio' name='sc_edit_opac_visibility'> </input>
                                        </span>
                                </td>
                                <td colspan='4'>
                                        <span class='padded'>
-                                               <input  type='submit' value='Update Stat Cat' name='sc_edit_submit'/>
+                                               <input  type='submit' value='&staff.server.admin.stat_cat.edit_submit;' name='sc_edit_submit'/>
                                        </span>
                                        <span class='padded'>
-                                               <input  type='submit' value='Delete Stat Cat' name='sc_edit_delete'/>
+                                               <input  type='submit' value='&staff.server.admin.stat_cat.edit_delete;' name='sc_edit_delete'/>
                                        </span>
-                                       <input type='submit' name='sc_edit_cancel' value='Cancel'/>
+                                       <input type='submit' name='sc_edit_cancel' value='&staff.server.admin.stat_cat.cancel;'/>
                                </td>
                        </tr>
 
                        <tr class='insert_row' id='sc_edit_entry_row'>
                                <td colspan='7'>
                                        <span class='padded'>
-                                               <span>Owned By </span><b name='sc_edit_entry_owner'/>
+                                               <span>&staff.server.admin.stat_cat.edit_entry_owner;</span><b name='sc_edit_entry_owner'/>
                                        </span>
                                        <span class='padded'>
                                                <input type='text' name='sc_edit_entry_name' class='padded'/>
                                        </span>
                                        <span class='padded'>
-                                               <input type='submit' name='sc_edit_entry_name_submit' value='Update Entry Value' class='padded'/>
+                                               <input type='submit' name='sc_edit_entry_name_submit' value='&staff.server.admin.stat_cat.edit_entry_name_submit;' class='padded'/>
                                        </span>
                                        <span class='padded'>
-                                               <input type='submit' name='sc_edit_entry_delete' value='Delete Entry' class='padded'/>
+                                               <input type='submit' name='sc_edit_entry_delete' value='&staff.server.admin.stat_cat.edit_entry_delete;' class='padded'/>
                                        </span>
                                        <span class='padded'>
-                                               <input type='submit' name='sc_edit_entry_cancel' value='Cancel'/>
+                                               <input type='submit' name='sc_edit_entry_cancel' value='&staff.server.admin.stat_cat.cancel;'/>
                                        </span>
                                </td>
                        </tr>
 
                        <tr class='insert_row' id='sc_new_entry_row'>
                                <td colspan='7'> 
-                                       <span>Enter the value of the new entry: </span>
+                                       <span>&staff.server.admin.stat_cat.new_entry_name;</span>
                                        <span class='padded'>
                                                <input type='text' name='sc_new_entry_name'/>
                                        </span>
                                                <select name='sc_new_entry_lib' class='select_big'> </select>
                                        </span>
                                        <span class='padded'>
-                                               <input type='submit' name='sc_new_entry_create' value='Create new entry'/>
+                                               <input type='submit' name='sc_new_entry_create' value='&staff.server.admin.stat_cat.new_entry_create;'/>
                                        </span>
                                        <span class='padded'>
-                                               <input type='submit' name='sc_new_entry_cancel' value='Cancel'/>
+                                               <input type='submit' name='sc_new_entry_cancel' value='&staff.server.admin.stat_cat.cancel;'/>
                                        </span>
                                </td>
                        </tr>
        </body>
 
        <span class='hide_me' id='sc_update_success'>
-               Update succeeded
+               &staff.server.admin.stat_cat.update_success;
        </span>
 
 </html>
index 46ab60a..8e27ffb 100644 (file)
@@ -34,7 +34,7 @@ admin.transit_list.prototype = {
                                false
                        );
                } else {
-                       throw('Missing library list.\n');
+                       throw(document.getElementById('adminStrings').getString('staff.admin.transit_list.missing_list') + '\n');
                }
 
                file = new util.file('transit_list_prefs.'+obj.data.server_unadorned);
@@ -76,7 +76,7 @@ admin.transit_list.prototype = {
                                if (util.date.check('YYYY-MM-DD',_string[1]+'-'+_string[2]+'-'+_string[3])) {
                                        _date = util.date.buildDate( _string[1], _string[2], _string[3], 0, 0, 0);
                                } else {
-                                       alert('Invalid Date (' + _string + '), setting to Today'); 
+                                       alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.invalid_date', [_string])); 
                                        _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
                                }
                        }
@@ -89,7 +89,7 @@ admin.transit_list.prototype = {
                        }
 
                        if (! util.date.check('YYYY-MM-DD',util.date.formatted_date(_date,"%F")) ) { 
-                               alert('Invalid Date (' + _date + ',' + util.date.formatted_date(_date,"%F") + '), setting to Today'); 
+                               alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.invalid_date', [_date, util.date.formatted_date(_date,"%F")])); 
                                _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
                        }
                                
@@ -99,7 +99,7 @@ admin.transit_list.prototype = {
 
                        return util.date.formatted_date(_date,'%{iso8601}');
                } catch(E) {
-                       try { obj.error.standard_unexpected_error_alert('processing date',E); } catch(F) { alert(E); }
+                       try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.date_processing.error'),E); } catch(F) { alert(E); }
                        _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
                        return util.date.formatted_date(_date,'%{iso8601}');
                }
@@ -151,16 +151,16 @@ admin.transit_list.prototype = {
                                                if (rows.length > 0) {
                                                        exec.chain( rows );
                                                } else {
-                                                       alert('No matching transits.');
+                                                       alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.no_match'));
                                                }
 
                                        } catch(E) {
-                                               try { obj.error.standard_unexpected_error_alert('retrieving transits',E); } catch(F) { alert(E); }
+                                               try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.retrieving_transit.error'),E); } catch(F) { alert(E); }
                                        }
                                }
                        );
                } catch(E) {
-                       try { obj.error.standard_unexpected_error_alert('pre-retrieving transits',E); } catch(F) { alert(E); }
+                       try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.preretrieving_transit.error'),E); } catch(F) { alert(E); }
                }
        },
 
@@ -227,7 +227,7 @@ admin.transit_list.prototype = {
                                                        function(transit,hold) { return obj.get_rest_of_row_given_transit_and_hold(params,transit,hold); }
                                                );
                                        } catch(E) {
-                                               try { obj.error.standard_unexpected_error_alert('retrieving row',E); } catch(F) { alert(E); }
+                                               try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.retrieving_row.error'),E); } catch(F) { alert(E); }
                                        }
                                },
                                'on_select' : function(ev) {
@@ -281,7 +281,7 @@ admin.transit_list.prototype = {
                                                                        var r_ahr = req3.getResultObject();
                                                                        if (typeof r_ahr.ilsevent != 'undefined') throw(r_ahr);
                                                                        if (r_ahr.length == 0) {
-                                                                               try { obj.error.standard_unexpected_error_alert('Empty array returned by hold retrieve.  retrieving hold id = ' + r_atc.hold() + ' for transit id = ' + transit_id,E); } catch(F) { alert(E); }
+                                                                               try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.empty_array.error') + document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.empty_array.error', [r_atc.hold(), transit_id]),E); } catch(F) { alert(E); }
                                                                                do_this(r_atc,null);
                                                                        } else {
                                                                                if (instanceOf(r_ahr[0],ahr)) {
@@ -291,7 +291,7 @@ admin.transit_list.prototype = {
                                                                                }
                                                                        }
                                                                } catch(E) {
-                                                                       try { obj.error.standard_unexpected_error_alert('retrieving hold id = ' + r_atc.hold() + ' for transit id = ' + transit_id,E); } catch(F) { alert(E); }
+                                                                       try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.empty_array.error', [r_atc.hold(), transit_id]),E); } catch(F) { alert(E); }
                                                                        do_this(r_atc,null);
                                                                }
                                                        }
@@ -301,7 +301,7 @@ admin.transit_list.prototype = {
                                        }
 
                                } catch(E) {
-                                       try { obj.error.standard_unexpected_error_alert('retrieving transit id = ' + transit_id,E); } catch(F) { alert(E); }
+                                       try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.transit_id.error', [transit_id]),E); } catch(F) { alert(E); }
                                }
                        }
                );
@@ -324,7 +324,7 @@ admin.transit_list.prototype = {
                                        row.my.acp = r_acp;
 
                                        obj.network.simple_request(
-                                               'FM_ACN_RETRIEVE',
+                                               'FM_ACN_RETRIEVE.authoritative',
                                                [ r_acp.call_number() ],
                                                function(req2) {
                                                        try {
@@ -334,7 +334,7 @@ admin.transit_list.prototype = {
 
                                                                if (row.my.acn.record() > 0) {
                                                                        obj.network.simple_request(
-                                                                               'MODS_SLIM_RECORD_RETRIEVE',
+                                                                               'MODS_SLIM_RECORD_RETRIEVE.authoritative',
                                                                                [ r_acn.record() ],
                                                                                function(req3) {
                                                                                        try {
@@ -433,11 +433,9 @@ admin.transit_list.prototype = {
        
        'spawn_copy_editor' : function(which_list) {
 
-               /* FIXME -  a lot of redundant calls here */
-
                var obj = this;
 
-               JSAN.use('util.widgets'); JSAN.use('util.functional');
+               JSAN.use('util.functional');
 
                var list = which_list == 0 ? obj.selection_list : obj.selection_list2;
 
@@ -448,35 +446,7 @@ admin.transit_list.prototype = {
                        }
                );
 
-               var copies = util.functional.map_list(
-                       list,
-                       function (acp_id) {
-                               return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
-                       }
-               );
-
-               var edit = 0;
-               try {
-                       edit = obj.network.request(
-                               api.PERM_MULTI_ORG_CHECK.app,
-                               api.PERM_MULTI_ORG_CHECK.method,
-                               [ 
-                                       ses(), 
-                                       obj.data.list.au[0].id(), 
-                                       util.functional.map_list(
-                                               copies,
-                                               function (o) {
-                                                       return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
-                                               }
-                                       ),
-                                       copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                               ]
-                       ).length == 0 ? 1 : 0;
-               } catch(E) {
-                       obj.error.sdump('D_ERROR','batch permission check: ' + E);
-               }
-
-               JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
+               JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
 
        },
 
index 253c76e..9401ee6 100644 (file)
@@ -11,7 +11,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
        ]]>
        </script>
 
+       <messagecatalog id="adminStrings" src='/xul/server/locale/<!--#echo var="locale"-->/admin.properties'/>
+       <messagecatalog id="circStrings" src='/xul/server/locale/<!--#echo var="locale"-->/circ.properties'/>
+
        <vbox flex="1" class="my_overflow">
                <hbox>
                        <groupbox id="lib_hbox" orient="horizontal">
-                               <caption label="Transit Filter" class="shrinkable_groupbox"/> 
+                               <caption label="&staff.server.admin.transit.filter.caption;" class="shrinkable_groupbox"/> 
                                <vbox>
-                                       <label value="Transit Library" class="header"/>
+                                       <label value="&staff.server.admin.transit.library.label;" class="header"/>
                                        <hbox>
                                                <menulist id="transit_direction">
                                                        <menupopup>
-                                                               <menuitem label="Transit to" value="transit_to" selected="true"/>
-                                                               <menuitem label="Transit from" value="transit_from" />
+                                                               <menuitem label="&staff.server.admin.transit.to.label;" value="transit_to" selected="true"/>
+                                                               <menuitem label="&staff.server.admin.transit.from.label;" value="transit_from" />
                                                        </menupopup>
                                                </menulist>
                                                <hbox id="libmenu_placeholder"/>
                                        </hbox>
-                                       <label value="Transit Date falls between" class="header"/> 
+                                       <label value="&staff.server.admin.transit.date.label;" class="header"/> 
                                        <hbox>
                                                <menulist id="sdate" editable="true">
                                                        <menupopup>
-                                                               <menuitem label="Today" selected="true"/>
-                                                               <menuitem label="Today - 7 days" />
-                                                               <menuitem label="Today - 14 days" />
-                                                               <menuitem label="Today - 21 days" />
-                                                               <menuitem label="Today - 30 days" />
-                                                               <menuitem label="The Beginning" />
+                                                               <menuitem label="&staff.server.admin.transit.date.today;" selected="true"/>
+                                                               <menuitem label="&staff.server.admin.transit.date.week;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.2weeks;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.3weeks;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.30days;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.start;" />
                                                        </menupopup>
                                                </menulist>
                                                <menulist id="edate" editable="true">
                                                        <menupopup>
-                                                               <menuitem label="Today" selected="true"/>
-                                                               <menuitem label="Today - 7 days" />
-                                                               <menuitem label="Today - 14 days" />
-                                                               <menuitem label="Today - 21 days" />
-                                                               <menuitem label="Today - 30 days" />
+                                                               <menuitem label="&staff.server.admin.transit.date.today;" selected="true"/>
+                                                               <menuitem label="&staff.server.admin.transit.date.week;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.2weeks;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.3weeks;" />
+                                                               <menuitem label="&staff.server.admin.transit.date.30days;" />
                                                        </menupopup>
                                                </menulist>
                                        </hbox>
                                </vbox>
-                               <button label="Retrieve Transits" accesskey="T" command="cmd_kick_off"/>
+                               <button label="&staff.server.admin.transit.retrieve.label;" accesskey="&staff.server.admin.transit.retrieve.accesskey;" command="cmd_kick_off"/>
                        </groupbox>
                </hbox>
 
                <groupbox flex="1">
-                       <caption label="Transits" />
+                       <caption label="&staff.server.admin.transit.list.label;" />
                        <hbox>
-                               <button label="Print Transits" command="cmd_print_list" />
+                               <button label="&staff.server.admin.transit.list.print;" command="cmd_print_list" />
                                <spacer flex="1"/>
                                <menubar>
-                                       <menu label="Actions for Selected Transits" accesskey="S">
+                                       <menu label="&staff.server.admin.transit.list.actions;" accesskey="&staff.server.admin.transit.list.actions.accesskey;">
                                                <menupopup>
-                                                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-                                                       <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-                                                       <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-                                                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                                                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                                                       <menuitem command="sel_clip" label="&staff.server.admin.transit.list.copy.label;" accesskey="&staff.server.admin.transit.list.copy.accesskey;" />
+                                                       <menuitem command="sel_bucket" label="&staff.server.admin.transit.list.add.label;" accesskey="&staff.server.admin.transit.list.add.accesskey;"/>
+                                                       <menuitem command="sel_opac" label="&staff.server.admin.transit.list.show.label;" accesskey="&staff.server.admin.transit.list.show.accesskey;" />
+                                                       <menuitem command="sel_copy_details" label="&staff.server.admin.transit.list.details.label;" accesskey="&staff.server.admin.transit.list.details.accesskey;" />
+                                                       <menuitem command="sel_patron" label="&staff.server.admin.transit.list.circs.label;" accesskey="&staff.server.admin.transit.list.circs.accesskey;"/>
                                                        <menuseparator />
-                                                       <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
-                                                       <menuitem command="sel_transit_abort" label="Abort Transits" />
+                                                       <menuitem command="sel_edit" label="&staff.server.admin.transit.list.edit.label;" accesskey="&staff.server.admin.transit.list.edit.accesskey;" />
+                                                       <menuitem command="sel_transit_abort" label="&staff.server.admin.transit.list.abort.label;" />
                                                        <menuseparator />
-                                                       <menuitem command="save_columns" label="Save Columns"/>
+                                                       <menuitem command="save_columns" label="&staff.server.admin.transit.list.save.label;"/>
                                                </menupopup>
                                        </menu>
                                </menubar>
 
        <popupset id="transit_list_popupset">
                <popup id="transit_list_actions" position="at_pointer"> 
-                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-                       <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-                       <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
-                       <menuseparator/>
-                       <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
-                       <menuitem command="sel_transit_abort" label="Abort Transits" />
-                       <menuseparator/>
-                       <menuitem command="save_columns" label="Save Columns"/>
+                       <menuitem command="sel_clip" label="&staff.server.admin.transit.list.copy.label;" accesskey="&staff.server.admin.transit.list.copy.accesskey;" />
+                       <menuitem command="sel_bucket" label="&staff.server.admin.transit.list.add.label;" accesskey="&staff.server.admin.transit.list.add.accesskey;"/>
+                       <menuitem command="sel_opac" label="&staff.server.admin.transit.list.show.label;" accesskey="&staff.server.admin.transit.list.show.accesskey;" />
+                       <menuitem command="sel_copy_details" label="&staff.server.admin.transit.list.details.label;" accesskey="&staff.server.admin.transit.list.details.accesskey;" />
+                       <menuitem command="sel_patron" label="&staff.server.admin.transit.list.circs.label;" accesskey="&staff.server.admin.transit.list.circs.accesskey;"/>
+                       <menuseparator />
+                       <menuitem command="sel_edit" label="&staff.server.admin.transit.list.edit.label;" accesskey="&staff.server.admin.transit.list.edit.accesskey;" />
+                       <menuitem command="sel_transit_abort" label="&staff.server.admin.transit.list.abort.label;" />
+                       <menuseparator />
+                       <menuitem command="save_columns" label="&staff.server.admin.transit.list.save.label;"/>
                </popup>
        </popupset>
 
index c0f553e..16c3e34 100644 (file)
@@ -1,16 +1,16 @@
-<?xml version='1.0'?>
+<?xml version='1.0' encoding="UTF-8"?>
 
 <!DOCTYPE html PUBLIC 
        "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
        <!ENTITY nbsp " "> <!-- calendar needs this entity -->
 ]>
 
-
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
 <head>
-       <title>Upload Offline Transactions</title>
+       <title>&staff.server.admin.upload_xacts.title;</title>
        <link rel="stylesheet" type="text/css" media="all" href="chrome://global/skin/" title="chrome_skin" />
        <script type="text/javascript" src="/xul/server/main/JSAN.js"></script>
        <script type="text/javascript" src="/xul/server/main/constants.js" />
@@ -27,7 +27,7 @@
        <script type="text/javascript" src="upload_xacts.js" />
 </head>
 <body onload="try{my_init();}catch(E){alert(E);}">
-       <h3>Uploading transactions...</h3>
+       <h3>&staff.server.admin.upload_xacts.header;</h3>
        <form id="form" method='post' enctype='multipart/form-data' style="display: none">
                action:<input type='text' id="action" name='action' value='load'></input>
                ws:<input type='text' id="ws" name='ws' value=''></input>
@@ -36,7 +36,7 @@
                seskey:<input type='text' id="seskey" name='seskey' value=''> </input>
                file:<input type='file' id="file" name='file'> </input> 
                html:<input type='text' id="html" name='html' value='1'> </input> 
-               <input type='submit' id="submit" name='Submit' value='Upload' disabled="true"> </input>
+               <input type='submit' id="submit" name='Submit' value='&staff.server.admin.upload_xacts.upload;' disabled="true"> </input>
        </form>
 </body>
 </html>
index fa11522..7e17d8c 100644 (file)
@@ -1,6 +1,9 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Brief Bib Display -->
+<!--
+vim: noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -39,7 +42,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                JSAN.use('util.network'); g.network = new util.network();
                                JSAN.use('util.date');
 
-                               document.getElementById('caption').setAttribute('tooltiptext','Record ID = ' + docid);
+                               document.getElementById('caption').setAttribute('tooltiptext',document.getElementById('catStrings').getFormattedString('staff.cat.bib_brief.record_id', [docid]));
 
                                if (docid > -1) {
 
                                        data.last_record = docid; data.stash('last_record');
 
-                                       g.network.request(
-                                               api.MODS_SLIM_RECORD_RETRIEVE.app,
-                                               api.MODS_SLIM_RECORD_RETRIEVE.method,
+                                       g.network.simple_request(
+                                               'MODS_SLIM_RECORD_RETRIEVE.authoritative',
                                                [ docid ],
                                                function (req) {
                                                        var mods = req.getResultObject();
@@ -97,9 +99,8 @@
                                                                }
                                                        }
        
-                                                       g.network.request(
-                                                               api.FM_BRE_RETRIEVE_VIA_ID.app,
-                                                               api.FM_BRE_RETRIEVE_VIA_ID.method,
+                                                       g.network.simple_request(
+                                                               'FM_BRE_RETRIEVE_VIA_ID.authoritative',
                                                                [ ses(), [ docid ] ],
                                                                function (req) {
                                                                        try {
                                                                                );
                                                                                var t = document.getElementById('caption').getAttribute('label');
                                                                                if (get_bool( meta.deleted() )) { 
-                                                                                       t += ' (Deleted) '; 
+                                                                                       t += ' ' + document.getElementById('catStrings').getString('staff.cat.bib_brief.deleted') + ' '; 
                                                                                        document.getElementById('caption').setAttribute('style','background: red; color: white;');
                                                                                }
                                                                                if ( ! get_bool( meta.active() ) ) { 
-                                                                                       t += ' (Inactive) '; 
+                                                                                       t += ' ' + document.getElementById('catStrings').getString('staff.cat.bib_brief.inactive') + ' '; 
                                                                                        document.getElementById('caption').setAttribute('style','background: red; color: white;');
                                                                                }
                                                                                document.getElementById('caption').setAttribute('label',t);
 
                                } else {
                                        var t = document.getElementById('caption').getAttribute('label');
-                                       t += ' (Not Cataloged) '; 
+                                       t += ' ' + document.getElementById('catStrings').getString('staff.cat.bib_brief.noncat') + ' '; 
                                        document.getElementById('caption').setAttribute('style','background: red; color: white;');
                                        document.getElementById('caption').setAttribute('label',t);
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncat/bib_brief.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['cat/bib_brief.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
                        try {
                                JSAN.use('util.window'); var win = new util.window();
                                if (docid < 0) {
-                                       alert('Item not cataloged.');
+                                       alert(document.getElementById("catStrings").getString('staff.cat.bib_brief.noncat.alert'));
                                } else {
                                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                                        //win.open( urls.XUL_MARC_VIEW + '?noprint=1&docid=' + docid, 'marc_view', 'chrome,resizable,modal,width=400,height=400');
        ]]>
        </script>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+    <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties"/>
+
        <groupbox id="groupbox" flex="1" style="overflow: auto; min-height: 100px;">
-               <caption label="Record Summary" id="caption"/>
+               <caption label="&staff.cat.bib_brief.record_summary;" id="caption"/>
                        <html:table width="90%">
                                <html:tr valign="top">
                                        <html:td colspan="3">
-                                               <html:span style="font-weight: bold;">Title: </html:span><html:span id="title" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.title; </html:span><html:span id="title" />
                                        </html:td>
                                        <html:td>
-                                               (<html:a href="javascript:view_marc();" style="text-decoration: underline; color: blue;">View MARC</html:a>)
+                                               (<html:a href="javascript:view_marc();" style="text-decoration: underline; color: blue;">&staff.cat.bib_brief.view_marc;</html:a>)
                                        </html:td>
                                </html:tr>
                                <html:tr valign="top">
                                        <html:td colspan="2">
-                                               <html:span style="font-weight: bold;">Author: </html:span><html:span id="author" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.author; </html:span><html:span id="author" />
                                        </html:td>
                                        <html:td>
-                                               <html:span style="font-weight: bold;">Edition: </html:span><html:span id="edition" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.edition; </html:span><html:span id="edition" />
                                        </html:td>
                                        <html:td>
-                                               <html:span style="font-weight: bold;">Pub Date: </html:span><html:span id="pubdate" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.pub_date; </html:span><html:span id="pubdate" />
                                        </html:td>
                                </html:tr>
                                <html:tr valign="top">
                                        <html:td>
-                                               <html:span style="font-weight: bold;">TCN: (</html:span><html:span id="tcn_source"/><html:span style="font-weight: bold;">) </html:span><html:span id="tcn" style="text-decoration: underline; color: blue;" onclick="copy_to_clipboard(event)"/>
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.title_control_number; (</html:span><html:span id="tcn_source"/><html:span style="font-weight: bold;">) </html:span><html:span id="tcn" style="text-decoration: underline; color: blue;" onclick="copy_to_clipboard(event)"/>
                                        </html:td>
                                        <html:td>
-                                               <html:span style="font-weight: bold;">Created By: </html:span><html:span id="creator" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.created_by; </html:span><html:span id="creator" />
                                                <html:span id="creator_bc" style="text-decoration: underline; color: blue;" onclick="try{spawn_patron(this);}catch(E){alert(E);}"/>
                                        </html:td>
                                        <html:td>
-                                               <html:span style="font-weight: bold;">Last Edited By: </html:span><html:span id="editor" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.last_edited_by; </html:span><html:span id="editor" />
                                                <html:span id="editor_bc" style="text-decoration: underline; color: blue;" onclick="try{spawn_patron(this);}catch(E){alert(E);}"/>
                                        </html:td>
                                        <html:td>
-                                               <html:span style="font-weight: bold;">Last Edited On: </html:span><html:span id="edit_date" />
+                                               <html:span style="font-weight: bold;">&staff.cat.bib_brief.last_edited_on; </html:span><html:span id="edit_date" />
                                        </html:td>
                                </html:tr>
                        </html:table>
index da235d4..e7e43ed 100644 (file)
@@ -1,4 +1,5 @@
 dump('entering cat.copy_browser.js\n');
+// vim:noet:sw=4:ts=4:
 
 if (typeof cat == 'undefined') cat = {};
 cat.copy_browser = function (params) {
@@ -38,7 +39,9 @@ cat.copy_browser.prototype = {
                                                ],
                                                'cmd_broken' : [
                                                        ['command'],
-                                                       function() { alert('Not Yet Implemented'); }
+                                                       function() { 
+                                                               alert(document.getElementById('commonStrings').getString('common.unimplemented'));
+                                                       }
                                                ],
                                                'cmd_show_my_libs' : [
                                                        ['command'],
@@ -193,7 +196,7 @@ cat.copy_browser.prototype = {
 
                                                                        if (edit==0) return; // no read-only view for this interface
 
-                                                                       var title = 'Add Item';
+                                                                       var title = document.getElementById('catStrings').getString('staff.cat.copy_browser.add_item.title');
 
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        var w = win.open(
@@ -207,7 +210,7 @@ cat.copy_browser.prototype = {
                                                                        w.refresh = function() { obj.refresh_list(); }
                                                                        w.xulG = { 'doc_id':obj.docid, 'ou_ids' : list, 'copy_shortcut' : copy_shortcut };
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> add copies',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.add_item.error'),E);
                                                                }
                                                        }
                                                ],
@@ -235,7 +238,7 @@ cat.copy_browser.prototype = {
                                                                        cat.util.add_copies_to_bucket( list );
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> add copies to bucket',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.add_items_bucket.error'),E);
                                                                }
                                                        }
                                                ],
@@ -264,13 +267,13 @@ cat.copy_browser.prototype = {
                                                                                try {
                                                                                        cat.util.replace_barcode(list[i]);
                                                                                } catch(E) {
-                                                                                       obj.error.standard_unexpected_error_alert('Barcode ' +list[i] + ' not likely replaced.',E);
+                                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.replace_barcode.failed', [list[i]]),E);
                                                                                }
                                                                        }
                                                                        obj.refresh_list();
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> replace barcode',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.replace_barcode.error'),E);
                                                                        obj.refresh_list();
                                                                }
                                                        }
@@ -295,37 +298,11 @@ cat.copy_browser.prototype = {
                                                                                }
                                                                        );
 
-                                                                       var edit = 0;
-                                                                       try {
-                                                                               edit = obj.network.request(
-                                                                                       api.PERM_MULTI_ORG_CHECK.app,
-                                                                                       api.PERM_MULTI_ORG_CHECK.method,
-                                                                                       [ 
-                                                                                               ses(), 
-                                                                                               obj.data.list.au[0].id(), 
-                                                                                               util.functional.map_list(
-                                                                                                       list,
-                                                                                                       function (o) {
-                                                                                                               var o_acp = obj.map_acp[ 'acp_' + o ];
-                                                                                                               if (o_acp.call_number() == -1) {
-                                                                                                                       return o_acp.circ_lib();
-                                                                                                               } else {
-                                                                                                                       return obj.map_acn[ 'acn_' + o_acp.call_number() ].owning_lib();
-                                                                                                               }
-                                                                                                       }
-                                                                                               ),
-                                                                                               list.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                                                                                       ]
-                                                                               ).length == 0 ? 1 : 0;
-                                                                       } catch(E) {
-                                                                               obj.error.sdump('D_ERROR','batch permission check: ' + E);
-                                                                       }
-
-                                                                       JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
+                                                                       JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
                                                                        obj.refresh_list();
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('Copy Browser -> Edit Items',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_items.error'),E);
                                                                }
                                                        }
                                                ],
@@ -349,7 +326,20 @@ cat.copy_browser.prototype = {
                                                                                }
                                                                        );
 
-                                                                       var r = obj.error.yns_alert('Are you sure you would like to delete ' + (list.length != 1 ? 'these ' + list.length + ' items' : 'this one item') + '?', 'Delete Items?', 'Delete', 'Cancel', null, 'Check here to confirm this action');
+                                                                       var delete_msg;
+                                                                       if (list.length != 1) {
+                                                                               delete_msg = document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.delete_items.confirm.plural', [list.length]);
+                                                                       } else {
+                                                                               delete_msg = document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.confirm');
+                                                                       }
+                                                                       var r = obj.error.yns_alert(
+                                                                                       delete_msg,
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.title'),
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.delete'),
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.cancel'),
+                                                                                       null,
+                                                                                       document.getElementById('commonStrings').getString('common.confirm')
+                                                                       );
 
                                                                        if (r == 0) {
                                                                                var acn_hash = {}; var acn_list = [];
@@ -370,7 +360,7 @@ cat.copy_browser.prototype = {
                                                                                        [ ses(), acn_list, true ],
                                                                                        null,
                                                                                        {
-                                                                                               'title' : 'Override Delete Failure?',
+                                                                                               'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.override'),
                                                                                                'overridable_events' : [
                                                                                                        1208 /* TITLE_LAST_COPY */,
                                                                                                        1227 /* COPY_DELETE_WARNING */,
@@ -381,13 +371,13 @@ cat.copy_browser.prototype = {
                                                                                if (typeof robj.ilsevent != 'undefined') {
                                                                                        if ( (robj.ilsevent != 0) && (robj.ilsevent != 1227 /* COPY_DELETE_WARNING */) && (robj.ilsevent != 1208 /* TITLE_LAST_COPY */) ) throw(robj);
                                                                                }
-                                                                               alert('Action complete.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.complete'));
                                                                                obj.refresh_list();
                                                                        }
 
                                                                        
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> delete items',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.error'),E);
                                                                        obj.refresh_list();
                                                                }
                                                        }
@@ -416,11 +406,11 @@ cat.copy_browser.prototype = {
                                                                        obj.data.stash('temp_barcodes_for_labels');
                                                                        xulG.new_tab(
                                                                                xulG.url_prefix( urls.XUL_SPINE_LABEL ),
-                                                                               { 'tab_name' : 'Spine Labels' },
+                                                                               { 'tab_name' : document.getElementById('catStrings').getString('staff.cat.copy_browser.print_spine.tab') },
                                                                                {}
                                                                        );
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> Spine Labels',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.print_spine.error'),E);
                                                                }
                                                        }
                                                ],
@@ -458,11 +448,11 @@ cat.copy_browser.prototype = {
                                                                        }
 
                                                                        if (edit==0) {
-                                                                               alert("You don't have permission to add volumes to that library.");
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.add_volume.permission_error'));
                                                                                return; // no read-only view for this interface
                                                                        }
 
-                                                                       var title = 'Add Volume/Item';
+                                                                       var title = document.getElementById('catStrings').getString('staff.cat.copy_browser.add_volume.title');
 
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        var w = win.open(
@@ -476,7 +466,7 @@ cat.copy_browser.prototype = {
                                                                        w.refresh = function() { obj.refresh_list() };
                                                                        w.xulG = { 'doc_id' : obj.docid, 'ou_ids' : list };
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> add volumes',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.add_volume.error'),E);
                                                                }
                                                        }
                                                ],
@@ -520,7 +510,7 @@ cat.copy_browser.prototype = {
                                                                        }
 
                                                                        if (edit==0) {
-                                                                               alert("You don't have permission to edit this volume.");
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.permission_error'));
                                                                                return; // no read-only view for this interface
                                                                        }
 
@@ -532,7 +522,12 @@ cat.copy_browser.prototype = {
                                                                                }
                                                                        );
 
-                                                                       var title = list.length == 1 ? 'Volume' : 'Volumes';
+                                                                       var title;
+                                                                       if (list.length == 1) {
+                                                                               title = document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.title');
+                                                                       } else {
+                                                                               title = document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.title.plural');
+                                                                       }
 
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        //obj.data.volumes_temp = js2JSON( list );
@@ -573,22 +568,22 @@ cat.copy_browser.prototype = {
                                                                                        [ ses(), volumes, true ]
                                                                                );
                                                                                if (typeof r.ilsevent != 'undefined') {
-                                            switch(r.ilsevent) {
+                                            switch(Number(r.ilsevent)) {
                                                 case 1705 /* VOLUME_LABEL_EXISTS */ :
-                                                    alert("Edit failed:  You tried to change a volume's callnumber to one that is already in use for the given library.  You should transfer the items to the desired callnumber instead.");
+                                                    alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.failed'));
                                                     break;
                                                 default: throw(r);
                                             }
                                         } else {
-                                                                               alert('Volumes modified.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.success'));
                                         }
                                                                        } catch(E) {
-                                                                               obj.error.standard_unexpected_error_alert('volume update error: ',E);
+                                                                               obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.error'),E);
                                                                        }
                                                                        obj.refresh_list();
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('Copy Browser -> Volume Edit',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_volume.exception'),E);
                                                                }
                                                        }
                                                ],
@@ -612,7 +607,21 @@ cat.copy_browser.prototype = {
                                                                                }
                                                                        );
 
-                                                                       var r = obj.error.yns_alert('Are you sure you would like to delete ' + (list.length != 1 ? 'these ' + list.length + ' volumes' : 'this one volume') + '?', 'Delete Volumes?', 'Delete', 'Cancel', null, 'Check here to confirm this action');
+                                                                       var del_prompt;
+                                                                       if (list.length == 1) {
+                                                                               del_prompt = document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.prompt');
+                                                                       } else {
+                                                                               del_prompt = document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.delete_volume.prompt.plural', [list.length]);
+                                                                       }
+
+                                                                       var r = obj.error.yns_alert(
+                                                                                       del_prompt,
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.title'),
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.delete'),
+                                                                                       document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.cancel'),
+                                                                                       null,
+                                                                                       document.getElementById('commonStrings').getString('common.confirm')
+                                                                       );
 
                                                                        if (r == 0) {
                                                                                for (var i = 0; i < list.length; i++) {
@@ -623,7 +632,7 @@ cat.copy_browser.prototype = {
                                                                                        [ ses(), list, true ],
                                                                                        null,
                                                                                        {
-                                                                                               'title' : 'Override Delete Failure?',
+                                                                                               'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.override'),
                                                                                                'overridable_events' : [
                                                                                                ]
                                                                                        }
@@ -631,16 +640,16 @@ cat.copy_browser.prototype = {
                                                                                if (robj == null) throw(robj);
                                                                                if (typeof robj.ilsevent != 'undefined') {
                                                                                        if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
-                                                                                               alert('You must delete all the copies on the volume before you may delete the volume itself.');
+                                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.copies_remain'));
                                                                                                return;
                                                                                        }
                                                                                        if (robj.ilsevent != 0) throw(robj);
                                                                                }
-                                                                               alert('Volumes deleted.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.success'));
                                                                                obj.refresh_list();
                                                                        }
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('copy browser -> delete volumes',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_volume.exception'),E);
                                                                        obj.refresh_list();
                                                                }
 
@@ -667,9 +676,16 @@ cat.copy_browser.prototype = {
                                                                        if (list.length == 1) {
                                                                                obj.data.marked_library = { 'lib' : list[0], 'docid' : obj.docid };
                                                                                obj.data.stash('marked_library');
-                                                                               alert('Library + Record marked as Volume Transfer Destination');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.alert'));
                                                                        } else {
-                                                                               obj.error.yns_alert('Choose just one Library to mark as Volume Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
+                                                                               obj.error.yns_alert(
+                                                                                               document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.prompt'),
+                                                                                               document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.title'),
+                                                                                               document.getElementById('commonStrings').getString('common.ok'),
+                                                                                               null,
+                                                                                               null,
+                                                                                               document.getElementById('commonStrings').getString('common.confirm')
+                                                                                               );
                                                                        }
                                                                } catch(E) {
                                                                        obj.error.standard_unexpected_error_alert('copy browser -> mark library',E);
@@ -698,9 +714,16 @@ cat.copy_browser.prototype = {
                                                                        if (list.length == 1) {
                                                                                obj.data.marked_volume = list[0];
                                                                                obj.data.stash('marked_volume');
-                                                                               alert('Volume marked as Item Transfer Destination');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.alert'));
                                                                        } else {
-                                                                               obj.error.yns_alert('Choose just one Volume to mark as Item Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
+                                                                               obj.error.yns_alert(
+                                                                                               document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.prompt'),
+                                                                                               document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.title'),
+                                                                                               document.getElementById('commonStrings').getString('common.ok'),
+                                                                                               null,
+                                                                                               null,
+                                                                                               document.getElementById('commonStrings').getString('common.confirm')
+                                                                                               );
                                                                        }
                                                                } catch(E) {
                                                                        obj.error.standard_unexpected_error_alert('copy browser -> mark volume',E);
@@ -719,7 +742,7 @@ cat.copy_browser.prototype = {
                                                                try {
                                                                        obj.data.stash_retrieve();
                                                                        if (!obj.data.marked_library) {
-                                                                               alert('Please mark a library as the destination from within holdings maintenance and then try this again.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_volume.alert'));
                                                                                return;
                                                                        }
                                                                        
@@ -740,20 +763,24 @@ cat.copy_browser.prototype = {
                                                                        );
 
                                                                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
-                                                                       var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
-                                                                       xml += '<description>Transfer volumes ';
 
-                                                                       xml += util.functional.map_list(
+                                                                       var acn_list = util.functional.map_list(
                                                                                list,
                                                                                function (o) {
                                                                                        return obj.map_acn[ 'acn_' + o ].label();
                                                                                }
-                                                                       ).join(", ");
+                                                                       ).join(document.getElementById('commonStrings').getString('common.grouping_string'));
 
-                                                                       xml += ' to library ' + obj.data.hash.aou[ obj.data.marked_library.lib ].shortname();
-                                                                       xml += ' on the following record?</description>';
-                                                                       xml += '<hbox><button label="Transfer" name="fancy_submit"/>';
-                                                                       xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
+                                                                       var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
+                                                                       xml += '<description>';
+                                                                       xml += document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.transfer.prompt', [acn_list, obj.data.hash.aou[ obj.data.marked_library.lib ].shortname()]);
+                                                                       xml += '</description>';
+                                                                       xml += '<hbox><button label="' + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.submit.label') + '" name="fancy_submit"/>';
+                                                                       xml += '<button label="' 
+                                                                               + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.cancel.label') 
+                                                                               + '" accesskey="' 
+                                                                               + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.cancel.accesskey') 
+                                                                               + '" name="fancy_cancel"/></hbox>';
                                                                        xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
                                                                        xml += '</vbox>';
                                                                        JSAN.use('OpenILS.data');
@@ -765,17 +792,23 @@ cat.copy_browser.prototype = {
                                                                                //+ '?xml_in_stash=temp_transfer'
                                                                                //+ '&title=' + window.escape('Volume Transfer'),
                                                                                'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
-                                                                               { 'xml' : xml, 'title' : 'Volume Transfer' }
+                                                                               {
+                                                                                       'xml' : xml,
+                                                                                       'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.title')
+                                                                               }
                                                                        );
 
-                                                                       if (fancy_prompt_data.fancy_status == 'incomplete') { alert('Transfer Aborted'); return; }
+                                                                       if (fancy_prompt_data.fancy_status == 'incomplete') {
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.incomplete'));
+                                                                               return;
+                                                                       }
 
                                                                        var robj = obj.network.simple_request(
                                                                                'FM_ACN_TRANSFER', 
                                                                                [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : list } ],
                                                                                null,
                                                                                {
-                                                                                       'title' : 'Override Volume Transfer Failure?',
+                                                                                       'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.override.failure'),
                                                                                        'overridable_events' : [
                                                                                                1208 /* TITLE_LAST_COPY */,
                                                                                                1219 /* COPY_REMOTE_CIRC_LIB */,
@@ -785,16 +818,16 @@ cat.copy_browser.prototype = {
 
                                                                        if (typeof robj.ilsevent != 'undefined') {
                                                                                if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
-                                                                                       alert('That destination cannot have volumes.');
+                                                                                       alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.ineligible_destination'));
                                                                                } else {
                                                                                        throw(robj);
                                                                                }
                                                                        } else {
-                                                                               alert('Volumes transferred.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.success'));
                                                                        }
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('All volumes not likely transferred.',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.unexpected_error'),E);
                                                                }
                                                                obj.refresh_list();
                                                        }
@@ -806,7 +839,7 @@ cat.copy_browser.prototype = {
                                                                try {
                                                                        obj.data.stash_retrieve();
                                                                        if (!obj.data.marked_volume) {
-                                                                               alert('Please mark a volume as the destination from within holdings maintenance and then try this again.');
+                                                                               alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_items.missing_volume'));
                                                                                return;
                                                                        }
                                                                        
@@ -826,7 +859,7 @@ cat.copy_browser.prototype = {
                                                                                }
                                                                        );
 
-                                                                       var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
+                                                                       var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_volume ]);
 
                                                                        JSAN.use('cat.util'); cat.util.transfer_copies( { 
                                                                                'copy_ids' : list, 
@@ -836,7 +869,7 @@ cat.copy_browser.prototype = {
                                                                        } );
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('All copies not likely transferred.',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_items.unexpected_error'),E);
                                                                }
                                                                obj.refresh_list();
                                                        }
@@ -847,8 +880,10 @@ cat.copy_browser.prototype = {
 
                        obj.list_init(params);
 
-                       obj.org_ids = obj.network.simple_request('FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID',[ obj.docid ]);
+                       obj.org_ids = obj.network.simple_request('FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative',[ obj.docid ]);
                        if (typeof obj.org_ids.ilsevent != 'undefined') throw(obj.org_ids);
+            JSAN.use('util.functional'); 
+            obj.org_ids = util.functional.map_list( obj.org_ids, function (o) { return Number(o); });
 
                        var org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
                        //obj.show_libs( org );
@@ -894,7 +929,7 @@ cat.copy_browser.prototype = {
                                        false
                                );
                        } else {
-                               throw('Missing library list.\n');
+                               throw(document.getElementById('catStrings').getString('staff.cat.copy_browser.missing_library') + '\n');
                        }
 
                        JSAN.use('util.widgets'); 
@@ -937,7 +972,7 @@ cat.copy_browser.prototype = {
        'show_consortial_count' : function() {
                var obj = this;
                try {
-                       obj.network.simple_request('FM_ACP_COUNT',[ obj.data.tree.aou.id(), obj.docid ],function(req){ 
+                       obj.network.simple_request('FM_ACP_COUNT.authoritative',[ obj.data.tree.aou.id(), obj.docid ],function(req){ 
                                try {
                                        var robj = req.getResultObject();
                                        var x = document.getElementById('consortial_total');
@@ -945,7 +980,7 @@ cat.copy_browser.prototype = {
                                        x = document.getElementById('consortial_available');
                                        if (x) x.setAttribute('value',robj[0].available);
                                } catch(E) {
-                                       obj.error.standard_unexpected_error_alert('Error retrieving consortial copy count.',E);
+                                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.consortial_copy_count.error'),E);
                                }
                        });
                } catch(E) {
@@ -1250,7 +1285,7 @@ cat.copy_browser.prototype = {
                        };
                
                        var acn_tree_list;
-                       if ( obj.org_ids.indexOf( org.id() ) == -1 ) {
+                       if ( obj.org_ids.indexOf( Number( org.id() ) ) == -1 ) {
                                if ( get_bool( obj.data.hash.aout[ org.ou_type() ].can_have_vols() ) ) {
                                        data.row.my.volume_count = '0';
                                        data.row.my.copy_count = '<0>';
@@ -1261,7 +1296,7 @@ cat.copy_browser.prototype = {
                        } else {
                                var v_count = 0; var c_count = 0;
                                acn_tree_list = obj.network.simple_request(
-                                       'FM_ACN_TREE_LIST_RETRIEVE_VIA_RECORD_ID_AND_ORG_IDS',
+                                       'FM_ACN_TREE_LIST_RETRIEVE_VIA_RECORD_ID_AND_ORG_IDS.authoritative',
                                        [ ses(), obj.docid, [ org.id() ] ]
                                );
                                for (var i = 0; i < acn_tree_list.length; i++) {
@@ -1422,17 +1457,21 @@ cat.copy_browser.prototype = {
                        JSAN.use('circ.util');
                        var columns = [
                                {
-                                       'id' : 'tree_location', 'label' : 'Location/Barcode', 'flex' : 1,
-                                       'primary' : true, 'hidden' : false, 
+                                       'id' : 'tree_location',
+                                       'label' : document.getElementById('catStrings').getString('staff.cat.copy_browser.list_init.tree_location'),
+                                       'flex' : 1, 'primary' : true, 'hidden' : false, 
                                        'render' : function(my) { return my.acp ? my.acp.barcode() : my.acn ? my.acn.label() : my.aou ? my.aou.shortname() + " : " + my.aou.name() : "???"; },
                                },
                                {
-                                       'id' : 'volume_count', 'label' : 'Volumes', 'flex' : 0,
-                                       'primary' : false, 'hidden' : false, 
+                                       'id' : 'volume_count',
+                                       'label' : document.getElementById('catStrings').getString('staff.cat.copy_browser.list_init.volume_count'),
+                                       'flex' : 0, 'primary' : false, 'hidden' : false, 
                                        'render' : function(my) { return my.volume_count; },
                                },
                                {
-                                       'id' : 'copy_count', 'label' : 'Copies', 'flex' : 0,
+                                       'id' : 'copy_count',
+                                       'label' : document.getElementById('catStrings').getString('staff.cat.copy_browser.list_init.copy_count'),
+                                       'flex' : 0,
                                        'primary' : false, 'hidden' : false, 
                                        'render' : function(my) { return my.copy_count; },
                                },
@@ -1633,7 +1672,7 @@ cat.copy_browser.prototype = {
                                obj.controller.view.sel_patron.setAttribute('disabled','false');
                        }
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Copy Browser Actions',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.actions.error'),E);
                }
        },
 
@@ -1644,7 +1683,10 @@ cat.copy_browser.prototype = {
                        obj.map_tree = {};
                        obj.map_acn = {};
                        obj.map_acp = {};
-                       obj.org_ids = obj.network.simple_request('FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID',[ obj.docid ]);
+                       obj.org_ids = obj.network.simple_request('FM_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative',[ obj.docid ]);
+                       if (typeof obj.org_ids.ilsevent != 'undefined') throw(obj.org_ids);
+            JSAN.use('util.functional'); 
+            obj.org_ids = util.functional.map_list( obj.org_ids, function (o) { return Number(o); });
                        /*
                        var org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
                        obj.show_libs( org );
@@ -1653,7 +1695,7 @@ cat.copy_browser.prototype = {
                        // FIXME - we get a null from the copy_count call if we call it too quickly here
                        setTimeout( function() { obj.show_consortial_count(); }, 2000 );
                } catch(E) {
-                       this.error.standard_unexpected_error_alert('Problem refreshing the volume/copy tree.',E);
+                       this.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.refresh_list.error'),E);
                }
        },
 }
index 478a6a7..e8a9e39 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Copy Browser -->
+<!--
+vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -12,7 +15,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+<!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 
        <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
        <!-- BEHAVIOR -->
-        <script type="text/javascript">
+       <script type="text/javascript">
                var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};
        </script>
-        <scripts id="openils_util_scripts"/>
+       <scripts id="openils_util_scripts"/>
 
        <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
        <script>
@@ -36,7 +39,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -51,8 +56,7 @@
                                //}
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncat/copy_browser.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['cat/copy_browser.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
        ]]>
        </script>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <commandset id="cat_copy_browser">
                <command id="save_columns" />
                <command id="cmd_broken" />
 
        <popupset>
                <popup id="copy_browser_actions">
-                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C"/>
-                       <menuitem command="cmd_add_items_to_buckets" label="Add Items to Buckets" accesskey="B"/>
-                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                       <menuitem command="sel_clip" label="&staff.cat.copy_browser.actions.sel_clip.label;" accesskey="&staff.cat.copy_browser.actions.sel_clip.accesskey;"/>
+                       <menuitem command="cmd_add_items_to_buckets" label="&staff.cat.copy_browser.actions.cmd_add_items_to_buckets.label;" accesskey="&staff.cat.copy_browser.actions.cmd_add_items_to_buckets.accesskey;"/>
+                       <menuitem command="sel_copy_details" label="&staff.cat.copy_browser.actions.sel_copy_details.label;" accesskey="&staff.cat.copy_browser.actions.sel_copy_details.label;" />
+                       <menuitem command="sel_patron" label="&staff.cat.copy_browser.actions.sel_patron.label;" accesskey="&staff.cat.copy_browser.actions.sel_patron.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_edit_items" label="Edit Item Attributes" accesskey="E"/>
-                       <menuitem command="cmd_transfer_items" label="Transfer Items to Previously Marked Volume" accesskey="T"/>
+                       <menuitem command="cmd_edit_items" label="&staff.cat.copy_browser.actions.cmd_edit_items.label;" accesskey="&staff.cat.copy_browser.actions.cmd_edit_items.accesskey;"/>
+                       <menuitem command="cmd_transfer_items" label="&staff.cat.copy_browser.actions.cmd_transfer_items.label;" accesskey="&staff.cat.copy_browser.actions.cmd_transfer_items.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_add_volumes" label="Add Volumes" accesskey="V"/>
-                       <menuitem command="cmd_mark_library" label="Mark Library as Volume Transfer Destination" accesskey="M"/>
+                       <menuitem command="cmd_add_volumes" label="&staff.cat.copy_browser.actions.cmd_add_volumes.label;" accesskey="&staff.cat.copy_browser.actions.cmd_add_volumes.accesskey;"/>
+                       <menuitem command="cmd_mark_library" label="&staff.cat.copy_browser.actions.cmd_mark_library.label;" accesskey="&staff.cat.copy_browser.actions.cmd_mark_library.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_add_items" label="Add Items" accesskey="A"/>
-                       <menuitem command="cmd_edit_volumes" label="Edit Volumes" accesskey="E"/>
-                       <menuitem command="cmd_mark_volume" label="Mark Volume as Item Transfer Destination" accesskey="M"/>
-                       <menuitem command="cmd_transfer_volume" label="Transfer Volumes to Previously Marked Library" accesskey="T"/>
+                       <menuitem command="cmd_add_items" label="&staff.cat.copy_browser.actions.cmd_add_items.label;" accesskey="&staff.cat.copy_browser.actions.cmd_add_items.accesskey;"/>
+                       <menuitem command="cmd_edit_volumes" label="&staff.cat.copy_browser.actions.cmd_edit_volumes.label;" accesskey="&staff.cat.copy_browser.actions.cmd_edit_volumes.accesskey;"/>
+                       <menuitem command="cmd_mark_volume" label="&staff.cat.copy_browser.actions.cmd_mark_volume.label;" accesskey="&staff.cat.copy_browser.actions.cmd_mark_volume.accesskey;"/>
+                       <menuitem command="cmd_transfer_volume" label="&staff.cat.copy_browser.actions.cmd_transfer_volume.label;" accesskey="&staff.cat.copy_browser.actions.cmd_transfer_volume.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_delete_items" label="Delete Items" accesskey=""/>
-                       <menuitem command="cmd_delete_volumes" label="Delete Volumes" accesskey=""/>
+                       <menuitem command="cmd_delete_items" label="&staff.cat.copy_browser.actions.cmd_delete_items.label;" accesskey=""/>
+                       <menuitem command="cmd_delete_volumes" label="&staff.cat.copy_browser.actions.cmd_delete_volumes.label;" accesskey=""/>
                        <menuseparator/>
-                       <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-                       <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="g"/>
+                       <menuitem command="sel_mark_items_damaged" label="&staff.cat.copy_browser.actions.sel_mark_items_damaged.label;" accesskey="&staff.cat.copy_browser.actions.sel_mark_items_damaged.accesskey;"/>
+                       <menuitem command="sel_mark_items_missing" label="&staff.cat.copy_browser.actions.sel_mark_items_missing.label;" accesskey="&staff.cat.copy_browser.actions.sel_mark_items_missing.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_print_spine_labels" label="Print Item Spine Labels" accesskey="P"/>
-                       <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-                       <menuitem command="save_columns" label="Save Columns"/>
-                       <menuitem command="cmd_refresh_list" label="Refresh Listing" accesskey="R"/>
+                       <menuitem command="cmd_print_spine_labels" label="&staff.cat.copy_browser.actions.cmd_print_spine_labels.label;" accesskey="&staff.cat.copy_browser.actions.cmd_print_spine_labels.accesskey;"/>
+                       <menuitem command="cmd_replace_barcode" label="&staff.cat.copy_browser.actions.cmd_replace_barcode.label;" accesskey=""/>
+                       <menuitem command="save_columns" label="&staff.cat.copy_browser.actions.save_columns.label;"/>
+                       <menuitem command="cmd_refresh_list" label="&staff.cat.copy_browser.actions.cmd_refresh_list.label;" accesskey="&staff.cat.copy_browser.actions.cmd_refresh_list.accesskey;"/>
                </popup>
        </popupset>
 
        <groupbox flex="1" class="my_overflow">
-               <caption label="Holdings Maintenance"/>
-               <hbox><label id="legend" style="font-size: large" class="has_copies" value="Green in the list below means the library has volumes for this record." hidden="true"/></hbox>
+               <caption label="staff.cat.copy_browser.holdings_maintenance.caption"/>
+               <hbox><label id="legend" style="font-size: large" class="has_copies" value="&staff.cat.copy_browser.holdings_maintenance.legend;" hidden="true"/></hbox>
                <hbox>
                        <hbox id="x_lib_menu"/>
                        <spacer flex="1"/>
-                       <label value="Consortial Total:"/><label id="consortial_total"/>
-                       <label value="Available:"/><label id="consortial_available"/>
+                       <label value="&staff.cat.copy_browser.holdings_maintenance.consortial_total;"/><label id="consortial_total"/>
+                       <label value="&staff.cat.copy_browser.holdings_maintenance.consortial_available;"/><label id="consortial_available"/>
                </hbox>
                <hbox>
-                       <checkbox id="show_acns" label="Show Volumes" />
-                       <checkbox id="show_acps" label="Show Items" />
-                       <button id="refresh_button" label="Refresh" command="cmd_refresh_list" />
-                       <button label="Show Libs With Items" command="cmd_show_libs_with_copies" accesskey="L"/>
+                       <checkbox id="show_acns" label="&staff.cat.copy_browser.holdings_maintenance.show_acns;" />
+                       <checkbox id="show_acps" label="&staff.cat.copy_browser.holdings_maintenance.show_acps;" />
+                       <button id="refresh_button" label="&staff.cat.copy_browser.holdings_maintenance.refresh_button.label;" command="cmd_refresh_list" />
+                       <button label="&staff.cat.copy_browser.holdings_maintenance.show_libs.label;" command="cmd_show_libs_with_copies" accesskey="&staff.cat.copy_browser.holdings_maintenance.show_libs.accesskey;"/>
                        <!-- <button label="Show My Libs" command="cmd_show_my_libs" accesskey="M"/>-->
                        <!--
                        <button label="Show All Libs" command="cmd_show_all_libs" accesskey=""/>
                        -->
                        <spacer flex="1"/>
                        <menubar>
-                               <menu label="Actions for Selected Rows" accesskey="f">
+                               <menu label="&staff.cat.copy_browser.holdings_maintenance.actions.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.actions.accesskey;">
                                        <menupopup>
-                                               <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C"/>
-                                               <menuitem command="cmd_add_items_to_buckets" label="Add Items to Buckets" accesskey="B"/>
-                                               <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                                               <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                                               <menuitem command="sel_clip" label="&staff.cat.copy_browser.holdings_maintenance.sel_clip.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.sel_clip.accesskey;"/>
+                                               <menuitem command="cmd_add_items_to_buckets" label="&staff.cat.copy_browser.holdings_maintenance.add_items_to_bucket.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.add_items_to_bucket.accesskey;"/>
+                                               <menuitem command="sel_copy_details" label="&staff.cat.copy_browser.holdings_maintenance.sel_copy_details.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.sel_copy_details.accesskey;" />
+                                               <menuitem command="sel_patron" label="&staff.cat.copy_browser.holdings_maintenance.sel_patron.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.sel_patron.accesskey;"/>
                                                <menuseparator/>
-                                               <menuitem command="cmd_edit_items" label="Edit Item Attributes" accesskey="E"/>
-                                               <menuitem command="cmd_transfer_items" label="Transfer Items to Previously Marked Volume" accesskey="T"/>
+                                               <menuitem command="cmd_edit_items" label="&staff.cat.copy_browser.holdings_maintenance.cmd_edit_items.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_edit_items.accesskey;"/>
+                                               <menuitem command="cmd_transfer_items" label="&staff.cat.copy_browser.holdings_maintenance.cmd_transfer_items.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_transfer_items.accesskey;"/>
                                                <menuseparator/>
-                                               <menuitem command="cmd_add_volumes" label="Add Volumes" accesskey="V"/>
-                                               <menuitem command="cmd_mark_library" label="Mark Library as Volume Transfer Destination" accesskey="M"/>
+                                               <menuitem command="cmd_add_volumes" label="&staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.accesskey;"/>
+                                               <menuitem command="cmd_mark_library" label="&staff.cat.copy_browser.holdings_maintenance.cmd_mark_library.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_mark_library.accesskey;"/>
                                                <menuseparator/>
-                                               <menuitem command="cmd_add_items" label="Add Items" accesskey="A"/>
-                                               <menuitem command="cmd_edit_volumes" label="Edit Volumes" accesskey="E"/>
-                                               <menuitem command="cmd_mark_volume" label="Mark Volume as Item Transfer Destination" accesskey="M"/>
-                                               <menuitem command="cmd_transfer_volume" label="Transfer Volumes to Previously Marked Library" accesskey="T"/>
+                                               <menuitem command="cmd_add_items" label="&staff.cat.copy_browser.holdings_maintenance.cmd_add_items.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_add_items.accesskey;"/>
+                                               <menuitem command="cmd_edit_volumes" label="&staff.cat.copy_browser.holdings_maintenance.cmd_edit_volumes.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_edit_volumes.accesskey;"/>
+                                               <menuitem command="cmd_mark_volume" label="&staff.cat.copy_browser.holdings_maintenance.cmd_mark_volume.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_mark_volume.accesskey;"/>
+                                               <menuitem command="cmd_transfer_volume" label="&staff.cat.copy_browser.holdings_maintenance.cmd_transfer_volume.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_transfer_volume.accesskey;"/>
                                                <menuseparator/>
-                                               <menuitem command="cmd_delete_items" label="Delete Items" accesskey=""/>
-                                               <menuitem command="cmd_delete_volumes" label="Delete Volumes" accesskey=""/>
+                                               <menuitem command="cmd_delete_items" label="&staff.cat.copy_browser.holdings_maintenance.cmd_delete_items.label;" accesskey=""/>
+                                               <menuitem command="cmd_delete_volumes" label="&staff.cat.copy_browser.holdings_maintenance.cmd_delete_volumes.label;" accesskey=""/>
                                                <menuseparator/>
-                                               <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-                                               <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="g"/>
+                                               <menuitem command="sel_mark_items_damaged" label="&staff.cat.copy_browser.holdings_maintenance.sel_mark_items_damaged.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.sel_mark_items_damaged.accesskey;"/>
+                                               <menuitem command="sel_mark_items_missing" label="&staff.cat.copy_browser.holdings_maintenance.sel_mark_items_missing.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.sel_mark_items_missing.accesskey;"/>
                                                <menuseparator/>
-                                               <menuitem command="cmd_print_spine_labels" label="Print Item Spine Labels" accesskey="P"/>
-                                               <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-                                               <menuitem command="save_columns" label="Save Columns"/>
-                                               <menuitem command="cmd_refresh_list" label="Refresh Listing" accesskey="R"/>
+                                               <menuitem command="cmd_print_spine_labels" label="&staff.cat.copy_browser.holdings_maintenance.cmd_print_spine_labels.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_print_spine_labels.accesskey;"/>
+                                               <menuitem command="cmd_replace_barcode" label="&staff.cat.copy_browser.holdings_maintenance.cmd_replace_barcode.label;" accesskey=""/>
+                                               <menuitem command="save_columns" label="&staff.cat.copy_browser.holdings_maintenance.save_columns.label;"/>
+                                               <menuitem command="cmd_refresh_list" label="&staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.accesskey;"/>
                                        </menupopup>
                                </menu>
                        </menubar>
index d3d7ed9..e210314 100644 (file)
@@ -1,3 +1,4 @@
+// vim:noet:sw=4:ts=4:
 dump('entering cat.copy_buckets.js\n');
 
 if (typeof cat == 'undefined') cat = {};
@@ -19,12 +20,12 @@ cat.copy_buckets.prototype = {
                if (this.first_pause) {
                        this.first_pause = false;
                } else {
-                       alert("Action completed.");
+                       alert($('catStrings').getString('staff.cat.copy_buckets.render_pending_copies.complete'));
                }
                var obj = this;
                obj.list1.clear();
                for (var i = 0; i < obj.copy_ids.length; i++) {
-                       var item = obj.flesh_item_for_list( obj.copy_ids[i] );
+                       var item = obj.prep_item_for_list( obj.copy_ids[i] );
                        if (item) obj.list1.append( item );
                }
        },
@@ -49,11 +50,39 @@ cat.copy_buckets.prototype = {
 
                JSAN.use('util.list'); 
 
+        function retrieve_row(params) {
+            var row = params.row;
+            try {
+                obj.network.simple_request('FM_ACP_DETAILS', [ ses(), row.my.copy_id ],
+                    function(blob_req) {
+                        try {
+                            var blob = blob_req.getResultObject();
+                            if (typeof blob.ilsevent != 'undefined') throw(blob);
+                            row.my.acp = blob.copy;
+                            row.my.mvr = blob.mvr;
+                            row.my.acn = blob.volume;
+                            row.my.ahr = blob.hold;
+                            row.my.circ = blob.circ;
+                            params.row_node.setAttribute('retrieve_id', js2JSON( [ blob.copy.id(), blob.copy.barcode(), row.my.bucket_item_id ] ));
+                            if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
+
+                        } catch(E) {
+                            obj.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_buckets.retrieve_row.error', [row.my.acp_id]), E);
+                        }
+                    }
+                );
+            } catch(E) {
+                obj.error.sdump('D_ERROR','retrieve_row: ' + E );
+            }
+            return row;
+        }
+
                obj.list1 = new util.list('pending_copies_list');
                obj.list1.init(
                        {
                                'columns' : columns,
                                'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                'retrieve_row' : retrieve_row,
                                'on_select' : function(ev) {
                                        try {
                                                JSAN.use('util.functional');
@@ -84,6 +113,7 @@ cat.copy_buckets.prototype = {
                        {
                                'columns' : columns,
                                'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                'retrieve_row' : retrieve_row,
                                'on_select' : function(ev) {
                                        try {
                                                JSAN.use('util.functional');
@@ -137,7 +167,10 @@ cat.copy_buckets.prototype = {
                                                function(e) {
                                                        return function() {
                                                                JSAN.use('util.widgets'); JSAN.use('util.functional');
-                                                               var items = [ ['Choose a bucket...',''], ['Retrieve shared bucket...',-1] ].concat(
+                                                               var items = [
+                                                                       [$('catStrings').getString('staff.cat.copy_buckets.menulist.render.choose_bucket'),''],
+                                                                       [$('catStrings').getString('staff.cat.copy_buckets.menulist.render.retrieve_bucket'),-1]
+                                                               ].concat(
                                                                        util.functional.map_list(
                                                                                obj.network.simple_request(
                                                                                        'BUCKET_RETRIEVE_VIA_USER',
@@ -167,7 +200,7 @@ cat.copy_buckets.prototype = {
                                                                function change_bucket(ev) {
                                                                        var bucket_id = ev.target.value;
                                                                        if (bucket_id < 0 ) {
-                                                                               bucket_id = window.prompt('Enter bucket number:');
+                                                                               bucket_id = window.prompt($('catStrings').getString('staff.cat.copy_buckets.menulist.change_bucket.prompt'));
                                                                                ev.target.value = bucket_id;
                                                                                ev.target.setAttribute('value',bucket_id);
                                                                        }
@@ -178,9 +211,9 @@ cat.copy_buckets.prototype = {
                                                                        );
                                                                        if (typeof bucket.ilsevent != 'undefined') {
                                                                                if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
-                                                                                       alert('Could not find a bucket with ID = ' + bucket_id);
+                                                                                       alert($('catStrings').getFormattedString('staff.cat.copy_buckets.menulist.change_bucket.undefined', [bucket_id]));
                                                                                } else {
-                                                                                       obj.error.standard_unexpected_error_alert('Error retrieving bucket.  Did you use a valid bucket id?',bucket);
+                                                                                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.menulist.change_bucket.error'),bucket);
                                                                                }
                                                                                return;
                                                                        }
@@ -202,7 +235,7 @@ cat.copy_buckets.prototype = {
                                                                        var items = bucket.items() || [];
                                                                        obj.list2.clear();
                                                                        for (var i = 0; i < items.length; i++) {
-                                                                               var item = obj.flesh_item_for_list( 
+                                                                               var item = obj.prep_item_for_list( 
                                                                                        items[i].target_copy(),
                                                                                        items[i].id()
                                                                                );
@@ -239,12 +272,12 @@ cat.copy_buckets.prototype = {
 
                                                                        if (typeof robj == 'object') throw robj;
 
-                                                                       var item = obj.flesh_item_for_list( obj.copy_ids[i], robj );
+                                                                       var item = obj.prep_item_for_list( obj.copy_ids[i], robj );
                                                                        if (!item) continue;
 
                                                                        obj.list2.append( item );
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('Addition likely failed.',E);
+                                                                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_add.error'), E);
                                                                }
                                                        }
                                                }
@@ -255,7 +288,7 @@ cat.copy_buckets.prototype = {
                                                        var bucket_id = obj.controller.view.bucket_menulist.value;
                                                        if (!bucket_id) return;
                                                        for (var i = 0; i < obj.selection_list1.length; i++) {
-                                                               var acp_id = obj.selection_list1[i][0];
+                                var acp_id = obj.selection_list1[i][0];
                                                                //var barcode = obj.selection_list1[i][1];
                                                                var bucket_item = new ccbi();
                                                                bucket_item.isnew('1');
@@ -267,12 +300,12 @@ cat.copy_buckets.prototype = {
 
                                                                        if (typeof robj == 'object') throw robj;
 
-                                                                       var item = obj.flesh_item_for_list( acp_id, robj );
+                                                                       var item = obj.prep_item_for_list( acp_id, robj );
                                                                        if (!item) continue;
 
                                                                        obj.list2.append( item );
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('Deletion likely failed.',E);
+                                                                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_sel_add.error'), E);
                                                                }
                                                        }
 
@@ -285,7 +318,7 @@ cat.copy_buckets.prototype = {
                                                                var acp_id = obj.selection_list2[i][0];
                                                                //var barcode = obj.selection_list1[i][1];
                                                                //var bucket_item_id = obj.selection_list1[i][2];
-                                                               var item = obj.flesh_item_for_list( acp_id );
+                                                               var item = obj.prep_item_for_list( acp_id );
                                                                if (item) {
                                                                        obj.list1.append( item );
                                                                        obj.copy_ids.push( acp_id );
@@ -306,10 +339,10 @@ cat.copy_buckets.prototype = {
                                                                                [ ses(), 'copy', bucket_item_id ]);
                                                                        if (typeof robj == 'object') throw robj;
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('Deletion likely failed.',E);
+                                                                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_item.error'), E);
                                                                }
-                                                        }
-                                                       alert("Action completed.");
+                                                       }
+                                                       alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_item.complete'));
                                                        setTimeout(
                                                                function() {
                                                                        JSAN.use('util.widgets'); 
@@ -324,15 +357,15 @@ cat.copy_buckets.prototype = {
                                                        try {
                                                                var bucket = obj.controller.view.bucket_menulist.value;
                                                                var name = obj.bucket_id_name_map[ bucket ];
-                                                               var conf = window.confirm('Delete the bucket named ' + name + '?');
+                                                               var conf = window.confirm($('catStrings').getFormattedString('staff.cat.copy_buckets.copy_buckets_delete_bucket.confirm', [name]));
                                                                if (!conf) return;
                                                                obj.list2.clear();
                                                                var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'copy',bucket]);
                                                                if (typeof robj == 'object') throw robj;
-                                                               alert("Action completed.");
+                                                               alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_bucket.complete'));
                                                                obj.controller.render('copy_buckets_menulist_placeholder');
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Bucket deletion likely failed.',E);
+                                                               obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_bucket.error'),E);
                                                        }
                                                }
                                        ],
@@ -340,7 +373,11 @@ cat.copy_buckets.prototype = {
                                                ['command'],
                                                function() {
                                                        try {
-                                                               var name = prompt('What would you like to name the bucket?','','Bucket Creation');
+                                                               var name = prompt(
+                                                                       $('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.prompt'),
+                                                                       '',
+                                                                       $('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.title')
+                                                               );
 
                                                                if (name) {
                                                                        var bucket = new ccb();
@@ -352,13 +389,13 @@ cat.copy_buckets.prototype = {
 
                                                                        if (typeof robj == 'object') {
                                                                                if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
-                                                                                       alert('You already have a bucket with that name.');
+                                                                                       alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.container_exists'));
                                                                                        return;
                                                                                }
                                                                                throw robj;
                                                                        }
 
-                                                                       alert('Bucket "' + name + '" created.');
+                                                                       alert($('catStrings').getFormattedString('staff.cat.copy_buckets.copy_buckets_new_bucket.success', [name]));
 
                                                                        obj.controller.render('copy_buckets_menulist_placeholder');
                                                                        obj.controller.view.bucket_menulist.value = robj;
@@ -370,7 +407,7 @@ cat.copy_buckets.prototype = {
                                                                        );
                                                                }
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Bucket creation failed.',E);
+                                                               obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.error'),E);
                                                        }
                                                }
                                        ],
@@ -390,40 +427,11 @@ cat.copy_buckets.prototype = {
                                                                        }
                                                                );
 
-                                                               var copies = util.functional.map_list(
-                                                                       list,
-                                                                       function (acp_id) {
-                                                                               return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
-                                                                       }
-                                                               );
-
-                                                               var edit = 0;
-                                                               try {
-                                                                       edit = obj.network.request(
-                                                                               api.PERM_MULTI_ORG_CHECK.app,
-                                                                               api.PERM_MULTI_ORG_CHECK.method,
-                                                                               [ 
-                                                                                       ses(), 
-                                                                                       obj.data.list.au[0].id(), 
-                                                                                       util.functional.map_list(
-                                                                                               copies,
-                                                                                               function (o) {
-                                                                                                       return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
-                                                                                               }
-                                                                                       ),
-                                                                                       copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                                                                               ]
-                                                                       ).length == 0 ? 1 : 0;
-                                                               } catch(E) {
-                                                                       obj.error.sdump('D_ERROR','batch permission check: ' + E);
-                                                               }
-
-                                                               JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
+                                                               JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
 
                                                                obj.render_pending_copies(); // FIXME -- need a generic refresh for lists
                                                                setTimeout(
                                                                        function() {
-                                                                               JSAN.use('util.widgets'); 
                                                                                util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
                                                                        }, 0
                                                                );
@@ -462,7 +470,7 @@ cat.copy_buckets.prototype = {
 
                                                                var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
                                                                if (typeof robj.ilsevent != 'undefined') {
-                                                                       switch(robj.ilsevent) {
+                                                                       switch(Number(robj.ilsevent)) {
                                                                                case 1227 /* COPY_DELETE_WARNING */ : 
                                                                                        var copy;
                                                                                        for (var i = 0; i < copies.length; i++) { if (copies[i].id()==robj.payload) copy = function(a){return a;}(copies[i]); }
@@ -474,7 +482,8 @@ cat.copy_buckets.prototype = {
                                                                                        err += $('catStrings').getString('cat.batch_operation_failed') + '\n';
                                                                                        alert(err);
                                                                                break;
-                                                                               default: obj.error.standard_unexpected_error_alert('Batch Item Deletion',robj);
+                                                                               default:
+                                                                                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.batch.error'), robj);
                                                                        }
                                                                }
 
@@ -499,7 +508,7 @@ cat.copy_buckets.prototype = {
 
                                                                obj.data.stash_retrieve();
                                                                if (!obj.data.marked_volume) {
-                                                                       alert('Please mark a volume as the destination from within the copy browser and then try this again.');
+                                                                       alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_transfer_to_volume.no_volume'));
                                                                        return;
                                                                }
 
@@ -510,13 +519,16 @@ cat.copy_buckets.prototype = {
                                                                        }
                                                                )
 
-                                                               var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
+                                                               var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_volume ]);
 
-                                                               var msg = 'Transfer the items in bucket "';
-                                                               msg += obj.controller.view.bucket_menulist.getAttribute('label') + '" ';
-                                                               msg += 'from their original volumes to ';
-                                                               msg += obj.data.hash.aou[ volume.owning_lib() ].shortname() + "'s volume labelled ";
-                                                               msg += '"' + volume.label() + '" on the following record?';
+                                                               var msg = $('catStrings').getFormattedString(
+                                                                       'staff.cat.copy_buckets.copy_buckets_transfer_to_volume.confirm',
+                                                                       [
+                                                                               obj.controller.view.bucket_menulist.getAttribute('label'),
+                                                                               volume.label(),
+                                                                               obj.data.hash.aou[ volume.owning_lib() ].shortname()
+                                                                       ]
+                                                               );
 
                                                                JSAN.use('cat.util'); cat.util.transfer_copies( { 
                                                                        'copy_ids' : copy_ids, 
@@ -535,13 +547,13 @@ cat.copy_buckets.prototype = {
                                                                );
                                                                
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Items not likely transferred.',E);
+                                                               obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_transfer_to_volume.error'), E);
                                                        }
                                                }
                                        ],
                                        'cmd_broken' : [
                                                ['command'],
-                                               function() { alert('Not Yet Implemented'); }
+                                               function() { alert($('commonStrings').getString('common.unimplemented')); }
                                        ],
                                        'cmd_copy_buckets_print' : [
                                                ['command'],
@@ -647,19 +659,24 @@ cat.copy_buckets.prototype = {
                                                ['command'],
                                                function() {
                                                        try {
-                                                               obj.list2.select_all();
-                                                               JSAN.use('util.functional');
-                                                               var barcodes = util.functional.map_list(
-                                                                       obj.list2.dump_retrieve_ids(),
-                                                                       function(o) { return JSON2js(o)[1]; }
-                                                               );
-                                                               var url = urls.XUL_COPY_STATUS; // + '?barcodes=' + window.escape( js2JSON(barcodes) );
-                                                               //JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
-                                                               //data.temp_barcodes_for_copy_status = barcodes;
-                                                               //data.stash('temp_barcodes_for_copy_status');
-                                                               xulG.new_tab( url, {}, { 'barcodes' : barcodes });
+                                obj.list2.on_all_fleshed =
+                                    function() {
+                                        try {
+                                            obj.list2.select_all();
+                                            JSAN.use('util.functional');
+                                            var barcodes = util.functional.map_list(
+                                                obj.list2.dump_retrieve_ids(),
+                                                function(o) { return JSON2js(o)[1]; }
+                                            );
+                                            var url = urls.XUL_COPY_STATUS;
+                                            xulG.new_tab( url, {}, { 'barcodes' : barcodes });
+                                        } catch(E) {
+                                            obj.error.standard_unexpected_error_alert('export to copy status',E);
+                                        }
+                                    }
+                                obj.list2.full_retrieve();
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Copy Status from Copy Buckets',E);
+                                                               obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.cmd_export_to_copy_status.error'), E);
                                                        }
                                                }
                                        ],
@@ -678,26 +695,22 @@ cat.copy_buckets.prototype = {
        
        },
 
-       'flesh_item_for_list' : function(acp_id,bucket_item_id) {
+       'prep_item_for_list' : function(acp_id,bucket_item_id) {
                var obj = this;
                try {
-                       var copy = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ acp_id ]);
-                       if (copy == null || typeof copy.ilsevent != 'undefined') {
-                               throw(copy);
-                       } else {
-                               var item = {
-                                       'retrieve_id' : js2JSON( [ copy.id(), copy.barcode(), bucket_item_id ] ),
-                                       'row' : {
-                                               'my' : {
-                                                       'mvr' : obj.network.simple_request('MODS_SLIM_RECORD_RETRIEVE_VIA_COPY', [ copy.id() ]),
-                                                       'acp' : copy,
-                                               }
-                                       }
-                               };
-                               return item;
-                       }
+            var item = {
+                'retrieve_id' : js2JSON( [ acp_id, null, bucket_item_id ] ),
+                'row' : {
+                    'my' : {
+                        'acn' : -2,
+                        'copy_id' : acp_id,
+                        'bucket_item_id' : bucket_item_id
+                    }
+                }
+            };
+            return item;
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('List building failed.',E);
+                       obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.prep_item_for_list.error'), E);
                        return null;
                }
 
index e45957a..fd52b6d 100644 (file)
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -20,7 +20,7 @@
 <?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
 <?xul-overlay href="/xul/server/cat/copy_buckets_overlay.xul"?>
 
-<window id="copy_buckets_win" title="Copy Buckets"
+<window id="copy_buckets_win" title="&staff.cat.copy_buckets.window_title;"
        onload="try { my_init(); font_helper(); } catch(E) { alert(E); }" height="600" width="800" persist="height,width"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
@@ -35,7 +35,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                );
        
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Copy Buckets'); } catch(E) { alert(E); }
+                                       try { window.xulG.set_tab_name(document.getElementById("catStrings").getString('cat.copy_buckets.tab')); } catch(E) { alert(E); }
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'cat.copy_buckets.xul\n' + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ["cat/copy_buckets.xul", E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -76,6 +74,8 @@
        </script>
 
        <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale' -->/cat.properties"/>
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale' -->/common.properties"/>
 
        <commandset id="copy_buckets_cmds">
                <command id="sel_clip1" />
index 5240c74..6c3e062 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE overlay PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 <overlay id="copy_buckets_overlay" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
 <vbox id="cmvb1" flex="1">
        <groupbox flex="1">
-               <caption label="Pending Copies" />
+               <caption label="&staff.cat.copy_buckets_overlay.pending_copies;" />
                <hbox id="pending_buckets_top_ui" />
                <tree id="pending_copies_list" flex="1" enableColumnDrag="true"/>
                <hbox id="pending_buckets_bottom_ui" />
        </groupbox>
        <splitter><grippy /></splitter>
        <groupbox flex="2">
-               <caption label="Bucket View" />
+               <caption label="&staff.cat.copy_buckets_overlay.bucket_view;" />
                <hbox id="copy_buckets_top_ui" />
                <hbox id="info_box"/>
                <tree id="copies_in_bucket_list" flex="1" enableColumnDrag="true"/>
 </vbox>
 
 <hbox id="pending_buckets_bottom_ui">
-       <button id="save_button1" command="save_columns1" label="Save Columns" />
-       <button id="clip_button1" command="sel_clip1" label="Copy to Clipboard" disabled="true" />
-       <button id="cmd_print_export_btn1" command="cmd_print_export1" label="Print Export" />
-       <button id="cmd_export_btn1" command="cmd_export1" label="Export" />
+       <button id="save_button1" command="save_columns1" label="&staff.cat.copy_buckets_overlay.pending_buckets.save_columns1;" />
+       <button id="clip_button1" command="sel_clip1" label="&staff.cat.copy_buckets_overlay.pending_buckets.sel_clip1;" disabled="true" />
+       <button id="cmd_print_export_btn1" command="cmd_print_export1" label="&staff.cat.copy_buckets_overlay.pending_buckets.cmd_print_export1;" />
+       <button id="cmd_export_btn1" command="cmd_export1" label="&staff.cat.copy_buckets_overlay.pending_buckets.cmd_export1;" />
        <spacer flex="1"/>
-       <button label="Add All" command="copy_buckets_add" accesskey="A" image="/xul/server/skin/media/images/down_arrow.gif"/>
-       <button label="Add Selected" command="copy_buckets_sel_add" accesskey="" image="/xul/server/skin/media/images/down_arrow.gif"/>
+       <button label="&staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_add.label;" command="copy_buckets_add" accesskey="&staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_add.accesskey;" image="/xul/server/skin/media/images/down_arrow.gif"/>
+       <button label="&staff.cat.copy_buckets_overlay.pending_buckets.copy_buckets_sel_add.label;" command="copy_buckets_sel_add" accesskey="" image="/xul/server/skin/media/images/down_arrow.gif"/>
 </hbox>
 
 <hbox id="copy_buckets_top_ui">
        <hbox id="copy_buckets_menulist_placeholder" />
-       <button command="copy_buckets_new_bucket" label="New Bucket"/>
-       <button command="copy_buckets_delete_bucket" label="Delete Bucket"/>
-       <button id="refresh" label="Refresh"/>
+       <button command="copy_buckets_new_bucket" label="&staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_new_bucket.label;"/>
+       <button command="copy_buckets_delete_bucket" label="&staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_delete_bucket.label;"/>
+       <button id="refresh" label="&staff.cat.copy_buckets_overlay.copy_buckets.refresh.label;"/>
        <spacer flex="1"/>
-       <button id="save_button2" command="save_columns2" label="Save Columns" />
-       <button id="clip_button2" command="sel_clip2" label="Copy to Clipboard" disabled="true" />
-       <button command="copy_buckets_delete_item" label="Remove Selected From Bucket" disabled="true" image="/xul/server/skin/media/images/icon_delete.gif"/>
-       <button command="copy_buckets_export" label="Add Selected" disabled="true" image="/xul/server/skin/media/images/up_arrow.gif"/>
+       <button id="save_button2" command="save_columns2" label="&staff.cat.copy_buckets_overlay.copy_buckets.save_columns2.label;" />
+       <button id="clip_button2" command="sel_clip2" label="&staff.cat.copy_buckets_overlay.copy_buckets.sel_clip2.label;" disabled="true" />
+       <button command="copy_buckets_delete_item" label="&staff.cat.copy_buckets_overlay.copy_buckets.delete_item.label;" disabled="true" image="/xul/server/skin/media/images/icon_delete.gif"/>
+       <button command="copy_buckets_export" label="&staff.cat.copy_buckets_overlay.copy_buckets.export.label;" disabled="true" image="/xul/server/skin/media/images/up_arrow.gif"/>
 </hbox>
 
 <hbox id="info_box" hidden="true" style="font-size: large;">
-       <label value="Bucket #"/>
+       <label value="&staff.cat.copy_buckets_overlay.info_box.bucket.label;"/>
        <label id="bucket_number" style="color: blue; text-decoration: underline; -moz-user-focus: normal;" onclick="copy_to_clipboard(event)"/>
        <label id="bucket_name" style="color: blue;"/>
-       <label value="Owner:"/>
+       <label value="&staff.cat.copy_buckets_overlay.info_box.owner.label;"/>
        <label id="bucket_owner" style="color: blue;"/>
 </hbox>
 
 <hbox id="copy_buckets_bottom_ui">
-       <button id="copy_buckets_print" label="Print" command="cmd_copy_buckets_print" accesskey="P"/>
-       <button id="cmd_print_export_btn2" command="cmd_print_export2" label="Print Export" />
+       <button id="copy_buckets_print" label="&staff.cat.copy_buckets_overlay.copy_buckets.print.label;" command="cmd_copy_buckets_print" accesskey="&staff.cat.copy_buckets_overlay.copy_buckets.print.accesskey;"/>
+       <button id="cmd_print_export_btn2" command="cmd_print_export2" label="&staff.cat.copy_buckets_overlay.copy_buckets.print_export.label;" />
        <button id="copy_buckets_export" 
-               label="Export"
+               label="&staff.cat.copy_buckets_overlay.copy_buckets.cmd_copy_buckets_export.label;"
                command="cmd_copy_buckets_export"
                accesskey=""/>
        <spacer flex="1"/>
        <hbox style="background: grey">
-               <vbox><spacer flex="1"/><label value="Batch:" style="font-weight: bold"/><spacer flex="1"/></vbox>
-               <button label="Show Status" command="cmd_export_to_copy_status"/>
-               <button command="copy_buckets_transfer_to_volume" label="Transfer to Specific Volume"/>
-               <button command="copy_buckets_batch_copy_edit" label="Edit Item Attributes" image="/xul/server/skin/media/images/grinder.gif"/>
-               <button command="copy_buckets_batch_copy_delete" label="Delete All from Catalog" />
+               <vbox><spacer flex="1"/><label value="&staff.cat.copy_buckets_overlay.copy_buckets.batch.label;" style="font-weight: bold"/><spacer flex="1"/></vbox>
+               <button label="&staff.cat.copy_buckets_overlay.copy_buckets.cmd_export_to_copy_status.label;" command="cmd_export_to_copy_status"/>
+               <button command="copy_buckets_transfer_to_volume" label="&staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_transfer_to_volume.label;"/>
+               <button command="copy_buckets_batch_copy_edit" label="&staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_batch_copy_edit.label;" image="/xul/server/skin/media/images/grinder.gif"/>
+               <button command="copy_buckets_batch_copy_delete" label="&staff.cat.copy_buckets_overlay.copy_buckets.copy_buckets_batch_copy_delete.label;" />
        </hbox>
 </hbox>
 
index 8a189e0..dce25e4 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
+<!--
+ vim:noet:sw=4:ts=4:
+ -->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -12,7 +15,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -37,7 +40,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') {
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                        }
                                );
 
-                               $('desc').appendChild( document.createTextNode( 
-                                       (g.copy_ids.length == 1 ?
-                                               'Copy this 1 item into which bucket?' :
-                                               'Copy these ' + g.copy_ids.length + ' items into which bucket?') 
-                               ) );
+                               $('desc').appendChild(
+                                       document.createTextNode( 
+                                               (g.copy_ids.length == 1 ?
+                                                       $('catStrings').getString('staff.cat.copy_buckets_quick.bucket_prompt') :
+                                                       $('catStrings').getFormattedString('staff.cat.copy_buckets_quick.bucket_prompt.plural', [g.copy_ids.length]) 
+                                               ) 
+                                       )
+                               );
                                var robj = g.network.simple_request('BUCKET_RETRIEVE_VIA_USER',[ ses(), g.data.list.au[0].id() ]);
                                if (typeof robj.ilsevent != 'undefined') throw(robj);
 
 
                g.new_bucket = function() {
                        try {
-                               var name = prompt('What would you like to name the bucket?','','Bucket Creation');
+                               var name = prompt(
+                                       $('catStrings').getString('staff.cat.copy_buckets_quick.copy_buckets_new_bucket.prompt'),
+                                       '',
+                                       $('catStrings').getString('staff.cat.copy_buckets_quick.copy_buckets_new_bucket.title')
+                               );
                                if (name) {
                                        var bucket = new ccb();
                                        bucket.btype('staff_client');
                                        g.add_to_bucket(bucket_id);
                                }
                        } catch(E) {
-                               g.error.standard_unexpected_error_alert('Bucket creation failed.',E);
+                               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets_quick.copy_buckets_new_bucket.error'), E);
                        }
                }
 
                                        if (typeof robj == 'object') throw robj;
 
                                } catch(E) {
-                                       g.error.standard_unexpected_error_alert('Addition likely failed for bucket = ' + bucket_id + ' and copy id = ' + g.copy_ids[i],E);
+                                       g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_buckets_quick.addition.error', [bucket_id, g.copy_ids[i]]), E);
                                }
                        }
                        window.close();
        ]]>
        </script>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <vbox flex="1" style="overflow: auto">
        <groupbox flex="1">
-               <caption label="Item Buckets"/>
+               <caption label="&staff.cat.copy_buckets_quick.item_buckets.label;"/>
                <description id="desc"/>
                <listbox id="bucket_list" rows="5" flex="1" style="overflow: auto"/>
                <hbox>
-                       <button label="Add to Selected Bucket" accesskey="A" oncommand="g.add_to_bucket()"/>
-                       <button label="Add to New Bucket" accesskey="N" oncommand="g.new_bucket()"/>
+                       <button label="&staff.cat.copy_buckets_quick.item_buckets.add_to_bucket.label;" accesskey="&staff.cat.copy_buckets_quick.item_buckets.add_to_bucket.accesskey;" oncommand="g.add_to_bucket()"/>
+                       <button label="&staff.cat.copy_buckets_quick.item_buckets.new_bucket.label;" accesskey="&staff.cat.copy_buckets_quick.item_buckets.new_bucket.accesskey;" oncommand="g.new_bucket()"/>
                </hbox>
                <hbox>
                        <!--
                        <button label="Advanced" accesskey="v" oncommand="g.advanced()"/>
                        -->
-                       <button label="Cancel" accesskey="C" oncommand="window.close()"/>
+                       <button label="&staff.cat.copy_buckets_quick.item_buckets.cancel.label;" accesskey="&staff.cat.copy_buckets_quick.item_buckets.cancel.accesskey;" oncommand="window.close()"/>
                </hbox>
        </groupbox>
        </vbox>
index 5e0c94c..d679ccd 100644 (file)
@@ -1,14 +1,20 @@
+// vim:noet:sw=4:ts=4
 var g = {};
+g.map_acn = {};
 
 var xulG = {};
 
+function $(id) { return document.getElementById(id); }
+
 function my_init() {
        try {
                /******************************************************************************************************/
                /* setup JSAN and some initial libraries */
 
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+               if (typeof JSAN == 'undefined') {
+                       throw( $('commonStrings').getString('common.jsan.missing') );
+               }
                JSAN.errorLevel = "die"; // none, warn, or die
                JSAN.addRepository('/xul/server/');
                JSAN.use('util.error'); g.error = new util.error();
@@ -28,7 +34,7 @@ function my_init() {
                if (!copy_ids) copy_ids = [];
 
                if (copy_ids.length > 0) g.copies = g.network.simple_request(
-                       'FM_ACP_FLESHED_BATCH_RETRIEVE',
+                       'FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative',
                        [ copy_ids ]
                );
 
@@ -54,10 +60,54 @@ function my_init() {
                /* Is the interface an editor or a viewer, single or multi copy, existing copies or new copies? */
 
                if (xul_param('edit',{'modal_xulG':true}) == '1') { 
-                       g.edit = true;
-                       document.getElementById('caption').setAttribute('label','Copy Editor'); 
-                       document.getElementById('save').setAttribute('hidden','false'); 
-                       g.retrieve_templates();
+
+            // Editor desired, but let's check permissions
+                       g.edit = false;
+
+            try {
+                var check = g.network.simple_request(
+                    'PERM_MULTI_ORG_CHECK',
+                    [ 
+                        ses(), 
+                        g.data.list.au[0].id(), 
+                        util.functional.map_list(
+                            g.copies,
+                            function (o) {
+                                var lib;
+                                var cn_id = o.call_number();
+                                if (cn_id == -1) {
+                                    lib = o.circ_lib(); // base perms on circ_lib instead of owning_lib if pre-cat
+                                } else {
+                                    if (! g.map_acn[ cn_id ]) {
+                                        var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
+                                        if (typeof req.ilsevent == 'undefined') {
+                                            g.map_acn[ cn_id ] = req;
+                                            lib = g.map_acn[ cn_id ].owning_lib();
+                                        } else {
+                                            lib = o.circ_lib();
+                                        }
+                                    } else {
+                                        lib = g.map_acn[ cn_id ].owning_lib();
+                                    }
+                                }
+                                return typeof lib == 'object' ? lib.id() : lib;
+                            }
+                        ),
+                        g.copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
+                    ]
+                );
+                g.edit = check.length == 0;
+            } catch(E) {
+                g.error.standard_unexpected_error_alert('batch permission check',E);
+            }
+
+                       if (g.edit) {
+                $('caption').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.caption')); 
+                       $('save').setAttribute('hidden','false'); 
+                       g.retrieve_templates();
+            } else {
+                           $('top_nav').setAttribute('hidden','true');
+            }
                } else {
                        $('top_nav').setAttribute('hidden','true');
                }
@@ -65,12 +115,12 @@ function my_init() {
                if (g.copies.length > 0 && g.copies[0].id() < 0) {
                        document.getElementById('copy_notes').setAttribute('hidden','true');
                        g.apply("status",5 /* In Process */);
-                       $('save').setAttribute('label','Create Copies');
+                       $('save').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.create_copies'));
                } else {
                        g.panes_and_field_names.left_pane = 
                                [
                                        [
-                                               "Status",
+                                               $('catStrings').getString('staff.cat.copy_editor.status'),
                                                { 
                                                        render: 'typeof fm.status() == "object" ? fm.status().name() : g.data.hash.ccs[ fm.status() ].name()', 
                                                        input: g.safe_to_edit_copy_status() ? 'c = function(v){ g.apply("status",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.data.list.ccs, function(obj) { return [ obj.name(), obj.id(), typeof my_constants.magical_statuses[obj.id()] != "undefined" ? true : false ]; } ).sort() ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);' : undefined,
@@ -113,8 +163,7 @@ function my_init() {
                g.render();
 
        } catch(E) {
-               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                       "system administrator or software developer the following:\ncat/copy_editor.xul\n" + E + '\n';
+               var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/copy_editor.js', E]);
                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); dump(js2JSON(E)); }
                alert(err_msg);
        }
@@ -143,7 +192,7 @@ g.retrieve_templates = function() {
             false
         );
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error retrieving templates',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.retrieve_templates.error'), E);
        }
 }
 
@@ -173,7 +222,7 @@ g.apply_template = function() {
                        g.render();
                }
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error applying template',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.apply_templates.error'), E);
        }
 }
 
@@ -182,7 +231,11 @@ g.apply_template = function() {
 
 g.save_template = function() {
        try {
-               var name = window.prompt('Enter template name:','','Save As Template');
+               var name = window.prompt(
+                       $('catStrings').getString('staff.cat.copy_editor.save_as_template.prompt'),
+                       '',
+                       $('catStrings').getString('staff.cat.copy_editor.save_as_template.title')
+               );
                if (!name) return;
                g.templates[name] = g.changed;
                var robj = g.network.simple_request(
@@ -191,19 +244,19 @@ g.save_template = function() {
                if (typeof robj.ilsevent != 'undefined') {
                        throw(robj);
                } else {
-                       alert('Template "' + name + '" saved.');
+                       alert($('catStrings').getFormattedString('staff.cat.copy_editor.save_as_template.success', [name]));
                        setTimeout(
                                function() {
                                        try {
                                                g.retrieve_templates();
                                        } catch(E) {
-                                               g.error.standard_unexpected_error_alert('Error saving template',E);
+                                               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
                                        }
                                },0
                        );
                }
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error saving template',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
        }
 }
 
@@ -214,7 +267,7 @@ g.delete_template = function() {
        try {
                var name = g.template_menu.value;
                if (!name) return;
-               if (! window.confirm('Delete template "' + name + '"?') ) return;
+               if (! window.confirm($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]))) return;
                delete(g.templates[name]);
                var robj = g.network.simple_request(
                        'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
@@ -222,19 +275,19 @@ g.delete_template = function() {
                if (typeof robj.ilsevent != 'undefined') {
                        throw(robj);
                } else {
-                       alert('Template "' + name + '" deleted.');
+                       alert($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]));
                        setTimeout(
                                function() {
                                        try {
                                                g.retrieve_templates();
                                        } catch(E) {
-                                               g.error.standard_unexpected_error_alert('Error deleting template',E);
+                                               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
                                        }
                                },0
                        );
                }
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error deleting template',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
        }
 }
 
@@ -245,9 +298,9 @@ g.export_templates = function() {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                JSAN.use('util.file'); var f = new util.file('');
-        f.export_file( { 'title' : 'Save Templates File As', 'data' : g.templates } );
+        f.export_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.export_templates.title'), 'data' : g.templates } );
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error exporting templates',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.export_templates.error'), E);
        }
 }
 
@@ -258,15 +311,19 @@ g.import_templates = function() {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                JSAN.use('util.file'); var f = new util.file('');
-        var temp = f.import_file( { 'title' : 'Import Templates File' } );
+        var temp = f.import_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.import_templates.title') } );
                if (temp) {
                        for (var i in temp) {
 
                                if (g.templates[i]) {
 
                                        var r = g.error.yns_alert(
-                                               'Replace the existing template with the imported template?\n' + g.error.pretty_print( js2JSON( temp[i] ) ),
-                                               'Template ' + i + ' already exists.','Yes','No',null,'Click here'
+                                               $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.prompt') + '\n' + g.error.pretty_print( js2JSON( temp[i] ) ),
+                                               $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.replace.title', [i]),
+                                               $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.yes'),
+                                               $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.no'),
+                                               null,
+                                               $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.click_here')
                                        );
 
                                        if (r == 0 /* Yes */) g.templates[i] = temp[i];
@@ -280,8 +337,12 @@ g.import_templates = function() {
                        }
 
                        var r = g.error.yns_alert(
-                               'Save all of these imported templates permanently to this account?',
-                               'Final Warning', 'Yes', 'No', null, 'Click here'
+                               $('catStrings').getString('staff.cat.copy_editor.import_templates.save.prompt'),
+                               $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.save.title'),
+                               $('catStrings').getString('staff.cat.copy_editor.import_templates.save.yes'),
+                               $('catStrings').getString('staff.cat.copy_editor.import_templates.save.no'),
+                               null,
+                               $('catStrings').getString('staff.cat.copy_editor.import_templates.save.click_here')
                        );
 
                        if (r == 0 /* Yes */) {
@@ -291,13 +352,13 @@ g.import_templates = function() {
                                if (typeof robj.ilsevent != 'undefined') {
                                        throw(robj);
                                } else {
-                                       alert('All templates saved.');
+                                       alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.success'));
                                        setTimeout(
                                                function() {
                                                        try {
                                                                g.retrieve_templates();
                                                        } catch(E) {
-                                                               g.error.standard_unexpected_error_alert('Error saving templates',E);
+                                                               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.error'), E);
                                                        }
                                                },0
                                        );
@@ -307,12 +368,12 @@ g.import_templates = function() {
                                var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } );
                                g.template_menu = util.widgets.make_menulist( list );
                                $('template_placeholder').appendChild(g.template_menu);
-                               alert("Note: These imported templates will get saved along with any new template you try to create, but if that doesn't happen, then these templates will disappear with the next invocation of the item attribute editor.");
+                               alert($('catStrings').getString('staff.cat.copy_editor.import_templates.note'));
                        }
 
                }
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error importing templates',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.error'), E);
        }
 }
 
@@ -381,16 +442,15 @@ g.apply_stat_cat = function(sc_id,entry_id) {
 /******************************************************************************************************/
 /* Apply an "owning lib" to all the copies being edited.  That is, change and auto-vivicating volumes */
 
-g.map_acn = {};
 g.apply_owning_lib = function(ou_id) {
        g.error.sdump('D_TRACE','ou_id = ' + ou_id + '\n');
        for (var i = 0; i < g.copies.length; i++) {
                var copy = g.copies[i];
                try {
                        if (!g.map_acn[copy.call_number()]) {
-                               var volume = g.network.simple_request('FM_ACN_RETRIEVE',[ copy.call_number() ]);
+                               var volume = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ copy.call_number() ]);
                                if (typeof volume.ilsevent != 'undefined') {
-                                       g.error.standard_unexpected_error_alert('Error retrieving Volume information for copy ' + copy.barcode() + ".  The owning library for this copy won't be changed.",volume);
+                                       g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.undefined_volume.error', [copy.barcode()]), volume);
                                        continue;
                                }
                                g.map_acn[copy.call_number()] = volume;
@@ -401,7 +461,7 @@ g.apply_owning_lib = function(ou_id) {
                                [ses(),old_volume.label(),old_volume.record(),ou_id]
                        );
                        if (typeof acn_id.ilsevent != 'undefined') {
-                               g.error.standard_unexpected_error_alert('Error changing owning lib for copy ' + copy.barcode() + ".  The owning library for this copy won't be changed.",acn_id);
+                               g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.call_number.error', [copy.barcode()]), acn_id);
                                continue;
                        }
                        copy.call_number(acn_id);
@@ -468,6 +528,33 @@ g.populate_alert_message_input = function(tb) {
        }
 }
 
+/***************************************************************************************************************/
+/* This returns a list of acpl's appropriate for the copies being edited (and caches them in the global stash) */
+
+g.get_acpl_list_for_lib = function(lib_id,but_only_these) {
+    g.data.stash_retrieve();
+    var label = 'acpl_list_for_lib_'+lib_id;
+    if (typeof g.data[label] == 'undefined') {
+        var robj = g.network.simple_request('FM_ACPL_RETRIEVE', [ lib_id ]); // This returns acpl's for all ancestors and descendants as well as the lib
+        if (typeof robj.ilsevent != 'undefined') throw(robj);
+        var temp_list = [];
+        for (var j = 0; j < robj.length; j++) {
+            var my_acpl = robj[j];
+            if (typeof g.data.hash.acpl[ my_acpl.id() ] == 'undefined') {
+                g.data.hash.acpl[ my_acpl.id() ] = my_acpl;
+                g.data.list.acpl.push( my_acpl );
+            }
+            var only_this_lib = my_acpl.owning_lib(); if (!only_this_lib) continue;
+            if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
+            if (but_only_these.indexOf( String( only_this_lib ) ) != -1) { // This filters out some of the libraries (usually the descendants)
+                temp_list.push( my_acpl );
+            }
+        }
+        g.data[label] = temp_list; g.data.stash(label,'hash','list');
+    }
+    return g.data[label];
+}
+
 /******************************************************************************************************/
 /* This returns a list of acpl's appropriate for the copies being edited */
 
@@ -476,95 +563,98 @@ g.get_acpl_list = function() {
 
                JSAN.use('util.functional');
 
-               function get(lib_id,only_these) {
-            g.data.stash_retrieve();
-                       var label = 'acpl_list_for_lib_'+lib_id;
-                       if (typeof g.data[label] == 'undefined') {
-                               var robj = g.network.simple_request('FM_ACPL_RETRIEVE', [ lib_id ]);
-                               if (typeof robj.ilsevent != 'undefined') throw(robj);
-                               var temp_list = [];
-                               for (var j = 0; j < robj.length; j++) {
-                                       var my_acpl = robj[j];
-                                       if (typeof g.data.hash.acpl[ my_acpl.id() ] == 'undefined') {
-                                               g.data.hash.acpl[ my_acpl.id() ] = my_acpl;
-                                               g.data.list.acpl.push( my_acpl );
-                                       }
-                    var only_this_lib = my_acpl.owning_lib(); if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
-                                       if (only_these.indexOf( String( only_this_lib ) ) != -1) {
-                                               temp_list.push( my_acpl );
-                                       }
-                               }
-                               g.data[label] = temp_list; g.data.stash(label,'hash','list');
-                       }
-                       return g.data[label];
-               }
-
-        var temp_acpl_list = [];
+        var my_acpls = {};
 
-        /* find acpl's based on owning_lib */
+        /**************************************/
+        /* get owning libs from call numbers */
 
-               var libs = []
+               var owning_libs = {}
                for (var i = 0; i < g.copies.length; i++) {
-                       var cn_id = g.copies[i].call_number();
+            var callnumber = g.copies[i].call_number();
+            if (!callnumber) continue;
+                       var cn_id = typeof callnumber == 'object' ? callnumber.id() : callnumber;
                        if (cn_id > 0) {
                                if (! g.map_acn[ cn_id ]) {
-                                       g.map_acn[ cn_id ] = g.network.simple_request('FM_ACN_RETRIEVE',[ cn_id ]);
+                                       var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
+                    if (typeof req.ilsevent == 'undefined') {
+                                       g.map_acn[ cn_id ] = req;
+                    } else {
+                        continue;
+                    }
                                }
                 var consider_lib = g.map_acn[ cn_id ].owning_lib();
-                if ( libs.indexOf( String( consider_lib ) ) > -1 ) { /* already in list */ } else { libs.push( consider_lib ); }
+                if (!consider_lib) continue;
+                owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
                        }
                }
                if (g.callnumbers) {
                        for (var i in g.callnumbers) {
                 var consider_lib = g.callnumbers[i].owning_lib;
-                if (typeof consider_lib == 'object') consider_lib = consider_lib.id();
-                               if ( libs.indexOf( String( consider_lib ) ) > -1 ) { /* already in list */ } else { libs.push( consider_lib ); }
+                if (!consider_lib) continue;
+                owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
                        }
                }
+
+        /***************************************************************************************************/
+        /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
+
                JSAN.use('util.fm_utils');
-               var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
-               if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
-
-               if (ancestor) {
-                   var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
-                       var acpl_list = get(ancestor, ancestors);
-            if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
-                if (acpl_list[i] != null) {
-                    temp_acpl_list.push(acpl_list[i]);
+        var libs = []; for (var i in owning_libs) libs.push(i);
+        if (libs.length > 0) {
+            var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
+            if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
+
+            if (ancestor) {
+                var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
+                var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
+                if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
+                    if (acpl_list[i] != null) {
+                        my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
+                    }
                 }
             }
-               }
+        }
         
-        /* find acpl's based on circ_lib */
+        /*****************/
+        /* get circ libs */
 
-        var circ_libs = [];
+        var circ_libs = {};
 
         for (var i = 0; i < g.copies.length; i++) {
             var consider_lib = g.copies[i].circ_lib();
-            if (typeof consider_lib == 'object') consider_lib = consider_lib.id();
-                       if ( circ_libs.indexOf( String( consider_lib ) ) > -1 ) { /* already in list */ } else { circ_libs.push( consider_lib ); }
+            if (!consider_lib) continue;
+            circ_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
         }
 
-        if (circ_libs.length > 0) {
-               var circ_ancestor = util.fm_utils.find_common_aou_ancestor( circ_libs );
-               if (typeof circ_ancestor == 'object' && circ_ancestor != null) circ_ancestor = circ_ancestor.id();
-
-               if (circ_ancestor) {
-                   var circ_ancestors = util.fm_utils.find_common_aou_ancestors( circ_libs );
-                       var circ_acpl_list = get(circ_ancestor, circ_ancestors);
-                var flat_acpl_list = util.functional.map_list( temp_acpl_list, function(o){return o.id();} );
-                for (var i = 0; i < circ_acpl_list.length; i++) {
-                    var consider_acpl = circ_acpl_list[i].id();
-                    if ( flat_acpl_list.indexOf( String( consider_acpl ) ) > -1 ) { 
-                        /* already in list */ 
-                    } else { 
-                        if (circ_acpl_list[i] != null) temp_acpl_list.push( circ_acpl_list[i] ); 
+        /***************************************************************************************************/
+        /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
+
+        libs = []; for (var i in circ_libs) libs.push(i);
+        if (libs.length > 0) {
+               var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
+               if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
+
+               if (ancestor) {
+                   var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
+                       var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
+                if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
+                    if (acpl_list[i] != null) {
+                        my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
                     }
                 }
             }
         }
 
-        return temp_acpl_list;
+        var acpl_list = []; for (var i in my_acpls) acpl_list.push( g.data.hash.acpl[ i ] );
+        return acpl_list.sort(
+            function(a,b) {
+                var label_a = g.data.hash.aou[ a.owning_lib() ].shortname() + ' : ' + a.name();
+                var label_b = g.data.hash.aou[ b.owning_lib() ].shortname() + ' : ' + b.name();
+                if (label_a < label_b) return -1;
+                if (label_a > label_b) return 1;
+                return 0;
+            }
+        );
        
        } catch(E) {
                g.error.standard_unexpected_error_alert('get_acpl_list',E);
@@ -585,9 +675,8 @@ g.special_exception = {
        'Owning Lib : Call Number' : function(label,value) {
                JSAN.use('util.widgets');
                if (value>0) { /* an existing call number */
-                       g.network.request(
-                               api.FM_ACN_RETRIEVE.app,
-                               api.FM_ACN_RETRIEVE.method,
+                       g.network.simple_request(
+                               'FM_ACN_RETRIEVE.authoritative',
                                [ value ],
                                function(req) {
                                        var cn = '??? id = ' + value;
@@ -753,7 +842,7 @@ g.panes_and_field_names = {
        [
                "Loan Duration",
                { 
-                       render: 'switch(fm.loan_duration()){ case 1: case "1": "Short"; break; case 2: case "2": "Normal"; break; case 3:case "3": "Long"; break; }',
+                       render: 'switch(Number(fm.loan_duration())){ case 1: "Short"; break; case 2: "Normal"; break; case 3: "Long"; break; }',
                        input: 'c = function(v){ g.apply("loan_duration",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ "Short", "1" ], [ "Normal", "2" ], [ "Long", "3" ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
 
                }
@@ -761,7 +850,7 @@ g.panes_and_field_names = {
        [
                "Fine Level",
                {
-                       render: 'switch(fm.fine_level()){ case 1: case "1": "Low"; break; case 2: case "2": "Normal"; break; case 3: case "3": "High"; break; }',
+                       render: 'switch(Number(fm.fine_level())){ case 1: "Low"; break; case 2: "Normal"; break; case 3: "High"; break; }',
                        input: 'c = function(v){ g.apply("fine_level",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ "Low", "1" ], [ "Normal", "2" ], [ "High", "3" ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
                }
        ],
@@ -976,8 +1065,13 @@ g.render = function() {
                                                label1.appendChild( document.createTextNode(value) );
                                        }
                                        var label2 = document.createElement('description'); row.appendChild(label2);
-                                       var unit = count == 1 ? 'copy' : 'copies';
-                                       label2.appendChild( document.createTextNode(count + ' ' + unit) );
+                                       var copy_count;
+                                       if (count == 1) {
+                                               copy_count = $('catStrings').getString('staff.cat.copy_editor.copy_count');
+                                       } else {
+                                               copy_count = $('catStrings').getFormattedString('staff.cat.copy_editor.copy_count.plural', [count]);
+                                       }
+                                       label2.appendChild( document.createTextNode(copy_count) );
                                }
                                var hbox = document.createElement('hbox'); 
                                hbox.setAttribute('id',fn);
@@ -1011,7 +1105,7 @@ g.render = function() {
             } catch(E) { alert(E); }
         }
     }
-    g.template_menu.value = g.template_menu.getAttribute('value');
+    if (g.template_menu) g.template_menu.value = g.template_menu.getAttribute('value');
 
 }
 
@@ -1088,12 +1182,12 @@ g.render_input = function(node,blob) {
                                        util.widgets.remove_children(hbox2);
                                        hbox.appendChild(x);
                                        var apply = document.createElement('button');
-                                       apply.setAttribute('label','Apply');
-                                       apply.setAttribute('accesskey','A');
+                                       apply.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.apply.label'));
+                                       apply.setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.apply.accesskey'));
                                        hbox2.appendChild(apply);
                                        apply.addEventListener('command',function() { c(x.value); },false);
                                        var cancel = document.createElement('button');
-                                       cancel.setAttribute('label','Cancel');
+                                       cancel.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.cancel.label'));
                                        cancel.addEventListener('command',function() { setTimeout( function() { g.summarize( g.copies ); g.render(); document.getElementById(caption.id).focus(); }, 0); }, false);
                                        hbox2.appendChild(cancel);
                                        setTimeout( function() { x.focus(); }, 0 );
@@ -1132,11 +1226,11 @@ g.stash_and_close = function() {
                                if (typeof r.ilsevent != 'undefined') {
                                        g.error.standard_unexpected_error_alert('copy update',r);
                                } else {
-                                       alert('Items added/modified.');
+                                       alert($('catStrings').getString('staff.cat.copy_editor.handle_update.success'));
                                }
                                /* FIXME -- revisit the return value here */
                        } catch(E) {
-                               alert('copy update error: ' + js2JSON(E));
+                               alert($('catStrings').getString('staff.cat.copy_editor.handle_update.error') + ' ' + js2JSON(E));
                        }
                }
                //g.data.temp_copies = js2JSON( g.copies );
@@ -1237,7 +1331,7 @@ g.add_stat_cat = function(sc) {
 
                g.panes_and_field_names.right_pane4.push( temp_array );
        } catch(E) {
-               g.error.standard_unexpected_error_alert('Error adding stat cat to display definition',E);
+               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.add_stat_cat.error'), E);
     }
 }
 
@@ -1321,7 +1415,12 @@ g.populate_stat_cats = function() {
             var cn_id = g.copies[i].call_number();
                        if (cn_id > 0) {
                                if (! g.map_acn[ cn_id ]) {
-                                       g.map_acn[ cn_id ] = g.network.simple_request('FM_ACN_RETRIEVE',[ cn_id ]);
+                    var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
+                    if (typeof req.ilsevent == 'undefined') {
+                                       g.map_acn[ cn_id ] = req;
+                    } else {
+                        continue;
+                    }
                                }
                 var owning_lib = g.map_acn[ cn_id ].owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
                 sc_libs[ owning_lib ] = true;
@@ -1332,7 +1431,7 @@ g.populate_stat_cats = function() {
         g.panes_and_field_names.right_pane4.sort();
 
     } catch(E) {
-        g.error.standard_unexpected_error_alert('Error populating stat cats for display',E);
+        g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.populate_stat_cat.error'),E);
     }
 }
 
index 9dfc6ff..367117a 100644 (file)
@@ -11,7 +11,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -21,7 +21,7 @@
 <window id="cat_copy_editor_win" 
        onload="try { my_init(); font_helper(); } catch(E) { alert(E); }"
        width="800" height="580" persist="width height"
-       title="Copies"
+       title="&staff.cat.copy_editor.window.label;"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
        <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
        <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
        <script type="text/javascript" src="copy_editor.js"/>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <iframe id="brief_display"/>
 
        <groupbox flex="1" style="overflow: auto">
-               <caption id="caption" label="Copy Viewer"/>
+               <caption id="caption" label="&staff.cat.copy_editor.groupbox1.label;"/>
 
                <hbox id="top_nav">
                        <hbox style="background: grey">
-                               <vbox><spacer flex="1"/><label value="Templates:" style="font-weight: bold"/><spacer flex="1"/></vbox>
+                               <vbox><spacer flex="1"/><label value="&staff.cat.copy_editor.templates.label;" style="font-weight: bold"/><spacer flex="1"/></vbox>
                                <hbox id="template_placeholder"/>
-                               <button id="apply_template" label="Apply" accesskey="y" oncommand="g.apply_template()"/>
-                               <button id="delete_template" label="Delete" oncommand="g.delete_template()"/>
-                               <button id="import_templates" label="Import" oncommand="g.import_templates()"/>
-                               <button id="export_templates" label="Export" oncommand="g.export_templates()"/>
-                               <button id="save_template" label="Save" oncommand="g.save_template()"/>
+                               <button id="apply_template" label="&staff.cat.copy_editor.templates.apply_template.label;" accesskey="&staff.cat.copy_editor.templates.apply_template.accesskey;" oncommand="g.apply_template()"/>
+                               <button id="delete_template" label="&staff.cat.copy_editor.templates.delete_template.label;" oncommand="g.delete_template()"/>
+                               <button id="import_templates" label="&staff.cat.copy_editor.templates.import_template.label;" oncommand="g.import_templates()"/>
+                               <button id="export_templates" label="&staff.cat.copy_editor.templates.export_template.label;" oncommand="g.export_templates()"/>
+                               <button id="save_template" label="&staff.cat.copy_editor.templates.save_template.label;" oncommand="g.save_template()"/>
                        </hbox>
                        <spacer flex="1"/>
-                       <button label="Reset" accesskey="R" oncommand="g.reset()"/>
+                       <button label="&staff.cat.copy_editor.templates.reset.label;" accesskey="&staff.cat.copy_editor.templates.reset.accesskey;" oncommand="g.reset()"/>
                </hbox>
 
                <hbox flex="1" style="overflow: scroll">
                        <vbox flex="1">
-                               <label value="Identification" style="font-weight: bold; font-size: large"/>
+                               <label value="&staff.cat.copy_editor.identification.label;" style="font-weight: bold; font-size: large"/>
                                <vbox id="left_pane" flex="1"/>
                        </vbox>
                        <splitter><grippy /></splitter>
                        <vbox flex="1">
-                               <button style="font-weight: bold; font-size: normal" label="Location" accesskey="1" oncommand="document.getElementById('right_pane').firstChild.firstChild.focus();"/>
+                               <button style="font-weight: bold; font-size: normal" label="&staff.cat.copy_editor.identification.location.label;" accesskey="&staff.cat.copy_editor.identification.location.accesskey;" oncommand="document.getElementById('right_pane').firstChild.firstChild.focus();"/>
                                <vbox id="right_pane" flex="1"/>
                        </vbox>
                        <splitter><grippy /></splitter>
                        <vbox flex="1">
-                               <button style="font-weight: bold; font-size: normal" label="Circulation" accesskey="2" oncommand="document.getElementById('right_pane2').firstChild.firstChild.focus();"/>
+                               <button style="font-weight: bold; font-size: normal" label="&staff.cat.copy_editor.identification.circulation.label;" accesskey="&staff.cat.copy_editor.identification.circulation.accesskey;" oncommand="document.getElementById('right_pane2').firstChild.firstChild.focus();"/>
                                <vbox id="right_pane2" flex="1"/>
                        </vbox>
                        <splitter><grippy /></splitter>
                        <vbox flex="1">
-                               <button style="font-weight: bold; font-size: normal" label="Miscellaneous" accesskey="3" oncommand="document.getElementById('right_pane3').firstChild.firstChild.focus();"/>
+                               <button style="font-weight: bold; font-size: normal" label="&staff.cat.copy_editor.identification.miscellaneous.label;" accesskey="&staff.cat.copy_editor.identification.miscellaneous.accesskey;" oncommand="document.getElementById('right_pane3').firstChild.firstChild.focus();"/>
                                <vbox id="right_pane3" flex="1"/>
                        </vbox>
                        <splitter><grippy /></splitter>
                        <vbox flex="1">
-                               <button style="font-weight: bold; font-size: normal" label="Statistics" accesskey="4" oncommand="document.getElementById('right_pane4').firstChild.firstChild.focus();"/>
-                <menu label="Library Filter" id="stat_cat_lib_filter_menu">
+                               <button style="font-weight: bold; font-size: normal" label="&staff.cat.copy_editor.identification.statistics.label;" accesskey="&staff.cat.copy_editor.identification.statistics.accesskey;" oncommand="document.getElementById('right_pane4').firstChild.firstChild.focus();"/>
+                <menu label="&staff.cat.copy_editor.stat_cat_lib_filter_menu.label;" id="stat_cat_lib_filter_menu">
                     <menupopup />
                 </menu>
                                <vbox id="right_pane4" flex="1"/>
@@ -85,9 +88,9 @@
 
                <hbox id="nav">
                        <spacer flex="1"/>
-                       <button id="copy_notes" label="Copy Notes" accesskey="N" oncommand="g.copy_notes();"/>
-                       <button id="save" label="Modify Copies" hidden="true" accesskey="M" oncommand="g.stash_and_close();"/>
-                       <button id="cancel" label="Close" accesskey="C" oncommand="window.close();"/>
+                       <button id="copy_notes" label="&staff.cat.copy_editor.copy_notes.label;" accesskey="&staff.cat.copy_editor.copy_notes.accesskey;" oncommand="g.copy_notes();"/>
+                       <button id="save" label="&staff.cat.copy_editor.save.label;" hidden="true" accesskey="&staff.cat.copy_editor.save.accesskey;" oncommand="g.stash_and_close();"/>
+                       <button id="cancel" label="&staff.cat.copy_editor.cancel.label;" accesskey="&staff.cat.copy_editor.cancel.accesskey;" oncommand="window.close();"/>
                </hbox>
 
                <spacer/>
index 95f1718..317e911 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
+<!--
+ vim:noet:sw=4:ts=4
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -12,7 +15,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( $("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
 
                                JSAN.use('util.error'); g.error = new util.error();
                                JSAN.use('util.network'); g.network = new util.network();
-                               JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util');
+                               JSAN.use('util.date'); JSAN.use('util.money'); 
                                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
 
                                g.error.sdump('D_TRACE','my_init() for copy_notes.xul');
@@ -53,8 +58,7 @@
                                refresh();
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncopy_notes.xul\n" + js2JSON(E) + '\n';
+                               var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/copy_notes.xul', js2JSON(E)]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -86,8 +90,8 @@
                        var np = $('notes_panel');
                                var hbox = document.createElement('hbox'); np.appendChild(hbox);
                                        var btn = document.createElement('button'); hbox.appendChild(btn);
-                                               btn.setAttribute('label','Add New Note');
-                                               btn.setAttribute('accesskey','A');
+                                               btn.setAttribute('label', $('catStrings').getString('staff.cat.copy_notes.render_notes.label'));
+                                               btn.setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_notes.render_notes.accesskey'));
                                                btn.setAttribute('oncommand','new_note()');
 
                        for (var i = 0; i < g.notes.length; i++) {
                                var node = $('note_template').cloneNode(true); np.appendChild(node); node.hidden = false;
                                apply(node,'create_date',g.notes[i].create_date().toString().substr(0,10));
                                util.widgets.apply(node,'name','create_date',
-                                       function(n){n.setAttribute("tooltiptext","Note ID: " + g.notes[i].id() + " Creator ID: " + g.notes[i].creator());}
+                                       function(n) {
+                                               n.setAttribute(
+                                                       "tooltiptext",
+                                                       $('catStrings').getString('staff.cat.copy_notes.widgets_apply.note_id') + " "
+                                                       + g.notes[i].id() + " " 
+                                                       + $('catStrings').getString('staff.cat.copy_notes.widgets_apply.creator_id') + " "
+                                                       + g.notes[i].creator()
+                                               );
+                                       }
                                );
                                apply(node,'title',g.notes[i].title());
-                               apply(node,'pub',get_bool( g.notes[i].pub() ) ? "Public" : "Private");
+                               apply(node,'pub',get_bool( g.notes[i].pub() ) ? $('catStrings').getString('staff.cat.copy_notes.widgets.public') : $('catStrings').getString('staff.cat.copy_notes.widgets.private'));
                                apply(node,'value',g.notes[i].value());
                                apply(node,'id',g.notes[i].id());
                                apply(node,'creator',g.notes[i].creator());
                                /* button bar */
                                var hb = document.createElement('hbox'); np.appendChild(hb);
                                        var btn1 = document.createElement('button'); hb.appendChild(btn1);
-                                               btn1.setAttribute('label','Delete This Note');
+                                               btn1.setAttribute('label', $('catStrings').getString('staff.cat.copy_notes.delete_note.label'));
                                                btn1.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
 
                                                btn1.addEventListener(
                                                        'command',
                                                        function(id){ return function() { 
-                                                               var r = g.error.yns_alert('Delete the note titled "' + g.notes[id].title() + '" created on ' + g.notes[id].create_date().toString().substr(0,10) + '?','Delete Note','Yes','No',null,'Check here to confirm this action'); 
+                                                               var r = g.error.yns_alert(
+                                                                       $('catStrings').getFormattedString('staff.cat.copy_notes.delete_note.prompt.msg', [g.notes[id].title(), g.notes[id].create_date().toString().substr(0,10)]),
+                                                                       $('catStrings').getString('staff.cat.copy_notes.delete_note.prompt.title'),
+                                                                       $('catStrings').getString('staff.cat.copy_notes.delete_note.prompt.yes'),
+                                                                       $('catStrings').getString('staff.cat.copy_notes.delete_note.prompt.no'),
+                                                                       null,
+                                                                       $('commonStrings').getString('common.confirm')
+                                                               ); 
                                                                if (r == 0) {
                                                                        g.network.simple_request('FM_ACPN_DELETE',[ses(),g.notes[id].id()]);
-                                                                       setTimeout(function(){ alert('Note deleted.'); refresh();},0);
+                                                                       setTimeout(function() { 
+                                                                               alert($('catStrings').getString('staff.cat.copy_notes.delete_note.success'));
+                                                                               refresh(); },0
+                                                                       );
                                                                }
                                                        } }(i),
                                                        false
                                                );
                                        var spacer = document.createElement('spacer'); hb.appendChild(spacer); spacer.flex = 1;
                                        var btn2 = document.createElement('button'); hb.appendChild(btn2);
-                                               btn2.setAttribute('label','Close Window');
+                                               btn2.setAttribute('label', $('catStrings').getString('staff.cat.copy_notes.delete_note.close_window'));
                                                btn2.setAttribute('oncommand','window.close();');
                        }
 
                function new_note() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
-                               var xml = '<groupbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1"><caption label="New Note"/><grid flex="1"><columns><column/><column flex="1"/></columns><rows><row><label value="Public?"/><checkbox id="pub" name="fancy_data" checked="false"/></row><row><label value="Title"/><textbox id="title" name="fancy_data"/></row><row><label value="Note"/><textbox multiline="true" id="note" name="fancy_data"/></row><row><spacer/><hbox><button label="Cancel" name="fancy_cancel" accesskey="C"/><button label="Add Note" accesskey="A" name="fancy_submit"/></hbox></row></rows></grid></groupbox>';
+                               var xml = '<groupbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1"> \
+                                       <caption label="' + $('catStrings').getString('staff.cat.copy_notes.new_note.label') + '"/> \
+                                       <grid flex="1"><columns><column/><column flex="1"/></columns> \
+                                               <rows> \
+                                                       <row><label value="' + $('catStrings').getString('staff.cat.copy_notes.new_note.public') + '"/><checkbox id="pub" name="fancy_data" checked="false"/></row> \
+                                                       <row><label value="' + $('catStrings').getString('staff.cat.copy_notes.new_note.title') + '"/><textbox id="title" name="fancy_data"/></row> \
+                                                       <row><label value="' + $('catStrings').getString('staff.cat.copy_notes.new_note.note') + '"/><textbox multiline="true" id="note" name="fancy_data"/></row> \
+                                                       <row><spacer/><hbox> \
+                                                               <button label="' + $('catStrings').getString('staff.cat.copy_notes.new_note.cancel.label') + '" name="fancy_cancel" accesskey="' + $('catStrings').getString('staff.cat.copy_notes.new_note.cancel.accesskey') + '"/> \
+                                                               <button label="' + $('catStrings').getString('staff.cat.copy_notes.new_note.add_note.label') + '" accesskey="' + $('catStrings').getString('staff.cat.copy_notes.new_note.add_note.accesskey') + '" name="fancy_submit"/></hbox></row> \
+                                               </rows></grid></groupbox>';
                                //g.data.init({'via':'stash'});
                                //g.data.temp_note_xml = xml; g.data.stash('temp_note_xml');
                                JSAN.use('util.window'); var win = new util.window();
                                        //+ '&focus=' + window.escape('title')
                                        //+ '&title=' + window.escape('Add Note'),
                                        'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
-                                       { 'xml' : xml, 'focus' : 'title', 'title' : 'Add Note' }
+                                       { 'xml' : xml, 'focus' : 'title', 'title' : $('catStrings').getString('staff.cat.copy_notes.new_note.add_note.label') }
                                );
                                //g.data.init({'via':'stash'});
                                if (fancy_prompt_data.fancy_status == 'complete') {
                                        note.owning_copy( g.copy_id );
                                        var r = g.network.simple_request('FM_ACPN_CREATE',[ ses(), note ]);
                                        if (typeof r.ilsevent != 'undefined') throw(r);
-                                       setTimeout(function(){alert('Note added.');refresh();},0);
+                                       setTimeout(function() {
+                                               alert($('catStrings').getString('staff.cat.copy_notes.new_note.success'));
+                                               refresh();},0
+                                       );
                                }
                        } catch(E) {
-                               g.error.standard_unexpected_error_alert('The note was not likely created.',E);
+                               g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_notes.new_note.error'),E);
                        }
                }
 
        ]]>
        </script>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <stack hidden="true" id="note_template" flex="1">
                <groupbox flex="1" style="background-color: black;"/>
                <groupbox flex="1" style="background-color: #FFDE00; -moz-border-radius-topright: 35px;" >
index 15daa05..344e4aa 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Brief Bib Display -->
+<!--
+       vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -39,7 +42,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( $("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -53,7 +58,7 @@
                                var copy = xul_param('copy',{'stash_name':'temp_copy','clear_xpcom':true});
                                var callnumber = xul_param('callnumber',{'stash_name':'temp_callnumber','clear_xpcom':true});
 
-                               $('caption').setAttribute('tooltiptext','Copy ID = ' + (copy_id || copy.id() ) );
+                               $('caption').setAttribute('tooltiptext', $('catStrings').getFormattedString('staff.cat.copy_summary.copy_id', [(copy_id || copy.id())]));
 
                                JSAN.use('circ.util');
                                var columns = circ.util.columns( 
@@ -68,7 +73,7 @@
                                        } 
                                ).concat(
                                        {
-                                               'id' : 'total_circs', 'label' : 'Total Circs', 'flex' : 1,
+                                               'id' : 'total_circs', 'label' : $('catStrings').getString('staff.cat.copy_summary.total_circs.label'), 'flex' : 1,
                                                'primary' : false, 'hidden' : false, 'persist' : 'hidden width ordinal',
                                                'render' : 'v = obj.network.simple_request("FM_CIRC_COUNT_RETRIEVE_VIA_COPY",[ my.acp.id() ]).total.count; v;' 
                                        }
                                                function acn_callback(rreq) {
                                                        try {
                                                                $w('barcode',copy.barcode());   
-                                                               $w('ref',get_bool(copy.ref()) ? 'Yes' : 'No');  
-                                                               $w('opac_visible',get_bool(copy.opac_visible()) ? 'Yes' : 'No');        
-                                                               $w('circulate',get_bool(copy.circulate()) ? 'Yes' : 'No');      
-                                                               $w('holdable',get_bool(copy.holdable()) ? 'Yes' : 'No');        
-                                                               $w('age_protect',copy.age_protect() == null ? '<Unset>' : ( typeof copy.age_protect() == 'object' ? copy.age_protect().name() : g.data.hash.crahp[ copy.age_protect() ].name() ) );     
+                                                               $w('ref',get_bool(copy.ref()) ? $('catStrings').getString('staff.cat.copy_summary.yes') : $('catStrings').getString('staff.cat.copy_summary.no'));      
+                                                               $w('opac_visible',get_bool(copy.opac_visible()) ? $('catStrings').getString('staff.cat.copy_summary.yes') : $('catStrings').getString('staff.cat.copy_summary.no'));    
+                                                               $w('circulate',get_bool(copy.circulate()) ? $('catStrings').getString('staff.cat.copy_summary.yes') : $('catStrings').getString('staff.cat.copy_summary.no'));  
+                                                               $w('holdable',get_bool(copy.holdable()) ? $('catStrings').getString('staff.cat.copy_summary.yes') : $('catStrings').getString('staff.cat.copy_summary.no'));    
+                                                               $w('age_protect',copy.age_protect() == null ? $('staff.cat.copy_summary.unset') : ( typeof copy.age_protect() == 'object' ? copy.age_protect().name() : g.data.hash.crahp[ copy.age_protect() ].name() ) );     
                                                                $w('location',typeof copy.location() == 'object' ? copy.location().name() : g.data.lookup('acpl',copy.location()).name() );     
                                                                $w('create_date',util.date.formatted_date(copy.create_date(),'%F'));
                                                                $w('edit_date',util.date.formatted_date(copy.edit_date(),'%F'));
                                                        try {
                                                                var cn = rreq.getResultObject();
                                                                if (typeof cn.ilsevent != 'undefined') {
-                                                                       switch(cn.ilsevent) {
+                                                                       switch(Number(cn.ilsevent)) {
                                                                                case 1508 /* ASSET_CALL_NUMBER_NOT_FOUND */ :
-                                                                                       $w('callnumber','Not Cataloged');       
+                                                                                       $w('callnumber', $('catStrings').getString('staff.cat.copy_summary.not_cataloged'));    
                                                                                break;
                                                                                default:
                                                                                        throw(cn);
                                                        acn_callback( { 'getResultObject' : function() { return callnumber; } } );
                                                } else {
                                                        g.network.simple_request(
-                                                               'FM_ACN_RETRIEVE',
+                                                               'FM_ACN_RETRIEVE.authoritative',
                                                                [ copy.call_number() ], acn_callback
                                                        );
                                                }
        ]]>
        </script>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <groupbox id="groupbox" flex="1" style="overflow: none; min-height: 80;">
-               <caption label="Item Summary" id="caption"/>
+               <caption label="&staff.cat.copy_summary.label;" id="caption"/>
                <deck id="item_deck" persist="selectedIndex">
                        <tree id="item_summary_list" enableColumnDrag="true" flex="1"/>
                        <grid>
                                </columns>
                                <rows>
                                        <row>
-                                               <label style="font-weight: bold" value="Barcode:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.barcode.label;"/>
                                                <label id="barcode" style="color: blue; text-decoration: underline; -moz-user-focus: normal;" onclick="copy_to_clipboard(event);"/>
-                                               <label style="font-weight: bold" value="Location:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.location.label;"/>
                                                <label id="location"/>
-                                               <label style="font-weight: bold" value="Call Number:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.call_number.label;"/>
                                                <label id="callnumber"/>
-                                               <label style="font-weight: bold" value="Status:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.status.label;"/>
                                                <label id="status"/>
                                        </row>
                                        <row>
-                                               <label style="font-weight: bold" value="Circulate:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.circulate.label;"/>
                                                <label id="circulate"/>
-                                               <label style="font-weight: bold" value="Reference:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.reference.label;"/>
                                                <label id="ref"/>
-                                               <label style="font-weight: bold" value="Holdable:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.holdable.label;"/>
                                                <label id="holdable"/>
-                                               <label style="font-weight: bold" value="Opac Visible:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.opac_visible.label;"/>
                                                <label id="opac_visible"/>
                                        </row>
                                        <row>
-                                               <label style="font-weight: bold" value="Created:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.created.label;"/>
                                                <label id="create_date"/>
-                                               <label style="font-weight: bold" value="Edited:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.edited.label;"/>
                                                <label id="edit_date"/>
-                                               <label style="font-weight: bold" value="Age Protect:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.age_protect.label;"/>
                                                <label id="age_protect"/>
-                                               <label style="font-weight: bold" value="Total Circs:"/>
+                                               <label style="font-weight: bold" value="&staff.cat.copy_summary.total_circs.label;"/>
                                                <label id="total_circs"/>
                                        </row>
                                </rows>
                        </grid>
                </deck>
                <hbox>
-                       <button label="Alternate View" oncommand="toggle_deck()"/>
-                       <button id="save_columns" label="Save Columns" oncommand="try { g.list.save_columns(); } catch(E) { alert(E); }"/>
-                       <button id="sel_clip" label="Copy to Clipboard" oncommand="try { g.list.node.view.selection.selectAll(); g.list.clipboard(); } catch(E) { alert(E); }"/>
-                       <button id="print_export" label="Print Export" oncommand="try { g.list.on_all_fleshed = function() { JSAN.use('util.print'); var p = new util.print(); p.simple( g.list.dump_csv(), { 'content_type' : 'text/plain' } ); setTimeout( function() { g.list.on_all_fleshed = null; }, 0); }; g.list.full_retrieve(); } catch(E) { alert(E); }"/>
+                       <button label="&staff.cat.copy_summary.alternate_view.label;" oncommand="toggle_deck()"/>
+                       <button id="save_columns" label="&staff.cat.copy_summary.save_columns.label;" oncommand="try { g.list.save_columns(); } catch(E) { alert(E); }"/>
+                       <button id="sel_clip" label="&staff.cat.copy_summary.sel_clip.label;" oncommand="try { g.list.node.view.selection.selectAll(); g.list.clipboard(); } catch(E) { alert(E); }"/>
+                       <button id="print_export" label="&staff.cat.copy_summary.print_export.label;" oncommand="try { g.list.on_all_fleshed = function() { JSAN.use('util.print'); var p = new util.print(); p.simple( g.list.dump_csv(), { 'content_type' : 'text/plain' } ); setTimeout( function() { g.list.on_all_fleshed = null; }, 0); }; g.list.full_retrieve(); } catch(E) { alert(E); }"/>
                </hbox>
        </groupbox>
 
index 480d3b4..990d5b0 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Example Template for remote xul -->
+<!--
+       vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -38,7 +41,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( document.getElementById('commonStrings').getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                                        var params = {
                                                                'record' : { 'marc' : marc },
                                                                'save' : {
-                                                                       'label' : 'Create Record',
+                                                                       'label' : $('catStrings').getString('staff.cat.marc_new.create_record.label'),
                                                                        'func' : function(new_marcxml) {
                                                                                try {
                                                                                        var robj = g.network.simple_request(
                                                                                                'MARC_XML_RECORD_IMPORT',
-                                                                                               [ ses(), new_marcxml, 'System Local', 1 ]
+                                                                                               [ ses(), new_marcxml, $('catStrings').getString('staff.cat.marc_new.system_local.label'), 1 ]
                                                                                        );
                                                                                        if (typeof robj.ilsevent != 'undefined') throw(robj);
-                                                                                       alert('Record created.');
+                                                                                       alert($('catStrings').getString('staff.cat.marc_new.record_created.label'));
 
                                                                                        /* Replace tab with OPAC-view of record */
 
                                                                                        };
                                                                                        xulG.set_tab(
                                                                                                xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
-                                                                                               {'tab_name':'Retrieving title...'},
+                                                                                               {'tab_name': $('catStrings').getString('staff.cat.marc_new.retrieving.label')},
                                                                                                content_params
                                                                                        );
 
                                                                                } catch(E) {
                                                                                        g.error.standard_unexpected_error_alert(
-                                                                                               'Error creating MARC record.', E
+                                                                                               $('catStrings').getString('staff.cat.marc_new.creating_record.error'), E
                                                                                        );
                                                                                }
                                                                        }
 
                                                } catch(E) {
                                                        g.error.standard_unexpected_error_alert(
-                                                               'Error loading MARC template: ' + template_name,
-                                                               E
+                                                               $('catStrings').getFormattedString('staff.cat.marc_new.loading_template.error', [template_name]), E
                                                        );
                                                }
 
        ]]>
        </script>
 
+       <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <vbox flex="1">
                <hbox id="actions">
                        <hbox id="menu_placeholder" />
-                       <button id="load" label="Load" accesskey="L"/>
+                       <button id="load" label="&staff.cat.marc_new.load.label;" accesskey="&staff.cat.marc_new.load.accesskey;"/>
                </hbox>
                <iframe id="marc_editor" flex="1"/>
        </vbox>
index 23811b8..372dd35 100644 (file)
@@ -24,7 +24,7 @@
                xsltProcessor.importStylesheet(xsl);
             return true;
         } catch(E) {
-            alert('An error occured and we are unable to display the MARC here.\nError in xsl_marc2html_init: ' + E);
+            alert('An error occurred and we are unable to display the MARC here.\nError in xsl_marc2html_init: ' + E);
             return false;
         }
        }
@@ -39,7 +39,7 @@
             var fragment = xsltProcessor.transformToFragment(node, document);
             document.body.appendChild(fragment);
         } catch(E) {
-            alert('An error occured and we are unable to display the MARC here.\nError in apply_xsl_marc2html: ' + E);
+            alert('An error occurred and we are unable to display the MARC here.\nError in apply_xsl_marc2html: ' + E);
         }
        }
 
index 30e6136..67f8021 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: MARC View -->
+<!--
+vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +38,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( document.getElementById('commonStrings').getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -68,8 +73,7 @@
                                );
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncat/marc_view.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['cat/marc_view.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -79,7 +83,7 @@
        </script>
 
        <groupbox flex="1">
-               <caption label="MARC View"/>
+               <caption label="&staff.cat.marc_view.title;"/>
                <iframe id="marc_frame" flex="1"/>
        </groupbox>
 
diff --git a/Open-ILS/xul/staff_client/server/cat/marcedit-tooltips.xml b/Open-ILS/xul/staff_client/server/cat/marcedit-tooltips.xml
deleted file mode 100644 (file)
index 2344f5c..0000000
+++ /dev/null
@@ -1,6728 +0,0 @@
-<fields>
-  <field repeatable="false" tag="001">
-    <description>The control number assigned by the organization creating, using, or distributing the record. The MARC code for the organization is contained in field 003 (Control Number Identifier).</description>
-  </field>
-  <field repeatable="false" tag="003">
-    <description>The MARC code for the organization whose control number is contained in field 001 (Control Number).</description>
-  </field>
-  <field repeatable="false" tag="005">
-    <description>Sixteen characters that indicate the date and time of the latest record transaction and serve as a version identifier for the record. They are recorded according to Representation of Dates and Times (ISO 8601). The date requires 8 numeric characters in the pattern yyyymmdd. The time requires 8 numeric characters in the pattern hhmmss.f, expressed in terms of the 24-hour (00-23) clock.</description>
-  </field>
-  <field repeatable="true" tag="006">
-    <description>This field contains 18 character positions (00-17) that provide for coding information about special aspects of the item being cataloged that cannot be coded in field 008 (Fixed-Length Data Elements). It is used in cases when an item has multiple characteristics. It is also used to record the coded serial aspects of nontextual continuing resources.</description>
-  </field>
-  <field repeatable="true" tag="007">
-    <description>This field contains special information about the physical characteristics in a coded form. The information may represent the whole item or parts of an item such as accompanying material.</description>
-  </field>
-  <field repeatable="false" tag="008">
-    <description>This field contains 40 character positions (00-39) that provide coded information about the record as a whole and about special bibliographic aspects of the item being cataloged. These coded data elements are potentially useful for retrieval and data management purposes.</description>
-  </field>
-  <field repeatable="false" tag="010">
-    <description>A unique number assigned to a MARC record by the Library of Congress. Valid MARC prefixes for LC control numbers are published in MARC 21 Format for Bibliographic Data.</description>
-    <subfield code="a" repeatable="false">
-      <description>LC control number </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>NUCMC control number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid LC control number </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="013">
-    <description>Information used to control patent documents. In addition to information about patents, this field may contain information relating to inventors' certificates, utility certificates, utility models, patents or certificates of addition, inventors' certificates of addition, utility certificates of addition, and published applications for any of these.</description>
-    <subfield code="a" repeatable="false">
-      <description>Number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Country Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Type of number A designation of the type of patent document identifier</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date The date a patent or certificate was granted, or the date of acceptance of an application. The date requires 8 numeric characters in the pattern yyyymmdd (4 for the year, 2 for the month, and 2 for the day).</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Status Text that explains or clarifies the status of the patent document identified by the number in the field.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Party to document Information that identifies the country or agency that is party to the document. The source of country codes is the MARC Code List for Countries .See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="015">
-    <description>The bibliography entry number for cataloging information that is derived from a national bibliography.</description>
-    <subfield code="a" repeatable="true">
-      <description>National bibliography number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="016">
-    <description>Unique numbers that have been assigned to a record by a national bibliographic agency other than the Library of Congress. The control number may also appear in field 001 (Control Number) in records distributed by the same national agency. This number is a record control number used in a national bibliographic agency system, rather than a number used for an entry in a national bibliographic, field 015 (National Bibliography Number).</description>
-    <indicator position="1" value="7">
-      <description>Source specified in subfield $2Used when the source of the control number is indicated by a code in subfield $2.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled or invalid record control number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="017">
-    <description>The copyright registration or legal deposit number for an item that was acquired by copyright or legal deposit.</description>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-  </field>
-  <field repeatable="false" tag="018">
-    <description>A unique identification code for a component part of a monograph or a continuing resource.</description>
-  </field>
-  <field repeatable="true" tag="020">
-    <description>The ISBN assigned to a monographic publication by designated agencies in each country participating in the program. The field may include terms of availability and canceled or invalid ISBNs. It may be repeated for multiple numbers associated with different entities (e.g., ISBNs for the hard bound and paperback manifestations; ISBNs for a set as a whole and for the individual parts in the set).</description>
-    <subfield code="a" repeatable="false">
-      <description>International Standard Book Number The valid ISBN and any parenthetical qualifying information. ISBN and the embedded hyphens may be generated for display.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Terms of availability The price or a brief statement of availability and any parenthetical information qualifying the information.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid ISBN A canceled or invalid ISBN and any parenthetical qualifying information. ISBN (invalid) and the embedded hyphens may be generated for display.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="022">
-    <description>The ISSN, a unique identification number assigned to a continuing resource.</description>
-    <indicator position="1" value="0">
-      <description>Continuing resource of international interest</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Continuing resource not of international interest</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>International Standard Serial Number The valid ISSN for the continuing resource. ISSN may be generated for display.</description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Incorrect ISSN ISSN (incorrect) may be generated for display.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled ISSN ISSN (canceled) may be generated for display.</description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="024">
-    <description>A standard number or code published on an item which cannot be accommodated in another field (e.g., field 020 (International Standard Book Number), 022 (International Standard Serial Number) , and 027 (Standard Technical Report Number)). The type of standard number or code is identified in the first indicator position or in subfield $2 (Source of number or code).</description>
-    <indicator position="1" value="0">
-      <description>International Standard Recording Code (ISRC)Number Standard: ISO 3901: International Standard Recording Code (Maintenance Agency )For display, hyphens (-) may be generated to separate subelements of the number, e.g., NL-C01-84-13261</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Universal Product Code (UPC)</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>International Standard Music Number (ISMN)Number Standard: ISO 10957: International Standard Music Number (Maintenance Agency )For display, hyphens (-) or spaces may be generated to separate subelements of the number.</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>International Article Number (EAN)</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Serial Item and Contribution Identifier (SICI)Number Standard: ANSI/NISO Z39.56: Serial Item and Contribution IdentifierFor display, hyphens (-) may be generated to separate subelements of the number, e.g., 8756-2324(198603/04)65:2L.4:QTP:1-P</description>
-    </indicator>
-    <indicator position="1" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>Unspecified type of standard number or code</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>No difference</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Difference</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Standard number or code </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Terms of availability </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Additional codes following the standard number or code </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid standard number or code </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of number or code Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="025">
-    <description>A number assigned by the Library of Congress to an item that was acquired through one of its overseas acquisition programs.</description>
-  </field>
-  <field repeatable="true" tag="026">
-    <description>Used to assist in the identification of antiquarian books by recording information comprising groups of characters taken from specified positions on specified pages of the book, in accordance with the principles laid down in various published guidelines.</description>
-  </field>
-  <field repeatable="true" tag="027">
-    <description>The STRN assigned to a technical report. The assignment of STRNs is coordinated by the National Technical Information Service (NTIS), which also maintains an assignment registry.</description>
-    <subfield code="a" repeatable="false">
-      <description>Standard technical report number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="028">
-    <description>The formatted number used for sound recordings, printed music, and videorecordings. Publisher's numbers that are given in an unformatted form are recorded in field 500 (General Note). A print constant identifying the kind of publisher number may be generated based on the value in the first indicator position.</description>
-    <indicator position="1" value="0">
-      <description>Issue numberAssigned by the publisher to identify the issue or continuing resource designation.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Matrix numberIdentifies the master from which the recording was pressed.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Plate numberAssigned by a publisher to a printed music publication.</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Other music number</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Videorecording number</description>
-    </indicator>
-    <indicator position="1" value="5">
-      <description>Other publisher number</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>No note, no added entry</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Note, added entry</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Note, no added entry</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>No note, added entry</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Publisher number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Source </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="030">
-    <description>The CODEN designation for a bibliographic title. (The CODEN is assigned by the International CODEN Section of Chemical Abstracts Service.)</description>
-    <subfield code="a" repeatable="false">
-      <description>CODEN The valid CODEN for the title.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid CODEN </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="031">
-    <description>Coded data representing the musical incipit for music using established notation schemes that employ ordinary ASCII symbols. It is primarily used to identify music manuscripts, but can be applied to any material containing music.</description>
-    <subfield code="b" repeatable="false">
-      <description>Number of movement </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Number of excerpt </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Caption or heading </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Role </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Clef </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Voice/instrument </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Key signature </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Time signature </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Musical notation </description>
-    </subfield>
-    <subfield code="q" repeatable="true">
-      <description>General note </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key or mode </description>
-    </subfield>
-    <subfield code="s" repeatable="true">
-      <description>Coded validity note </description>
-    </subfield>
-    <subfield code="t" repeatable="true">
-      <description>Text incipit </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Link text </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>System code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="032">
-    <description>The number assigned to a publication for which the specified postal service permits the use of a special mailing class privilege.</description>
-    <subfield code="a" repeatable="false">
-      <description>Postal registration number The six numeric characters are right justified and each unused position contains a zero. The hyphen that may appear between the third and fourth digits on printed sources is not carried in the MARC record; it may be generated.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Source (agency assigning number) </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="033">
-    <description>Formatted date/time and/or coded place of creation, capture, or broadcast associated with an event or the finding of a naturally occurring object. This information in textual form is contained in field 518 (Date/Time and Place of an Event Note).</description>
-    <indicator position="1" value="0">
-      <description>Single date</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Multiple single datesThis value is also used for two consecutive dates.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Range of datesThe creation, capture, or finding dates span more than two consecutive days and the individual dates are unknown or are too numerous to be specified.</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>CaptureThe recording of sound, the filming of visual images, the making or producing of an item, including the creation of an item not involving recording or filming.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>BroadcastThe broadcasting or re-broadcasting of sound or visual images.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>FindingThe finding of a naturally occurring object.</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Formatted date/time Seventeen characters, recorded in the pattern yyyymmddhhmm+-hmm, that indicate the actual or approximate date (yyyymmdd)/time (hhmm) of capture, finding, or broadcast and Time Differential Factor (+-hhmm) information. A hyphen (-) is used for unknown digits in the year/month/day segment. Within each segment, the data is right justified and any unused position contains a zero.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Geographic classification area code A four to six character numeric code for the main geographic area associated with the item. The source of the code is Library of Congress Classification Class G (dropping the letter G) that is maintained by the Library of Congress.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Geographic classification subarea code An alphanumeric Cutter number, derived from Class G or expanded Cutter lists, that represents a subarea of the geographic area coded in subfield $b. Cutter numbers for places in the U.S. are published in Geographic Cutters. Class G, Geographic Cutters, and the expanded Cutter lists are maintained by the Library of Congress.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="034">
-    <description>The coded form of the mathematical data contained in field 255 (Mathematical Data Area) of the bibliographic record.</description>
-    <indicator position="1" value="0">
-      <description>Scale indeterminable/No scale recordedNo representative fraction is given in field 255.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Single scale</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Range of scales</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Outer ring</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Exclusion ring</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Category of scale A one-character code that indicates the type of scale of the item.a - Linear scale</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Constant ratio linear horizontal scale The denominator of the representative fraction for the horizontal scale.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Constant ratio linear vertical scale The denominator of the representative fraction for the vertical scale of relief models and other three-dimensional items.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Coordinates--westernmost longitude </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Coordinates--easternmost longitude </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Coordinates--northernmost latitude </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Coordinates--southernmost latitude Subfields $d, $e, $f, and $g always appear together. The coordinates may be recorded in the pattern hdddmmss, however, other forms are also allowed, such as decimal degrees. The subelements are each right justified and each unused position contains a zero.</description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Angular scale The scale for celestial charts.</description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Declination--northern limit </description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Declination--southern limit Subfields $j and $k are each eight characters in length and consist of the hemisphere, degree, minutes, and seconds of the declination of a celestial chart, recorded in the pattern hdddmmss. The degree, minute, and second subelements are each right justified with and each unused position contains a zero.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Right ascension--eastern limit </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Right ascension--western limit Subfields $m and $n are each six characters in length and consist of the right ascension of a celestial chart, recorded in the pattern hhmmss. Each subelement is right justified and each unused position contains a zero.</description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Equinox The year or year and month of a celestial chart recorded in the pattern yyyy.mm.</description>
-    </subfield>
-    <subfield code="s" repeatable="true">
-      <description>G-ring latitude </description>
-    </subfield>
-    <subfield code="t" repeatable="true">
-      <description>G-ring longitude </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="035">
-    <description>A control number of a system other than the one whose control number is contained in field 001 (Control Number), field 010 (Library of Congress Control Number) or field 016 (National Bibliographic Agency Control Number).</description>
-    <subfield code="a" repeatable="false">
-      <description>System control number The MARC code (enclosed in parentheses) of the organization originating the system control number, followed immediately by the number.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid control number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="036">
-    <description>The original study number assigned by the producer of the computer file. The introductory phrase Original study: may be generated based on the field tag.</description>
-    <subfield code="a" repeatable="false">
-      <description>Original study number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Source (agency assigning number) </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="037">
-    <description>Information needed to order the item or its reproduction.</description>
-    <subfield code="a" repeatable="false">
-      <description>Stock number Numbers such as distributor and publisher numbers are also recorded in this subfield.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Source of stock number/acquisition </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Terms of availability </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Form of issue </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Additional format characteristics </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="038">
-    <description>Contains the MARC code of the organization that licenses the intellectual property rights to the data contained in the record, such as with contractual arrangements.</description>
-    <subfield code="a" repeatable="false">
-      <description>Record content licensor </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="040">
-    <description>The MARC code for or the name of the organization(s) that created the original bibliographic record, assigned MARC content designation and transcribed the record into machine-readable form, or modified (except for the addition of holdings symbols) an existing MARC record. These data and the code in 008/39 (Cataloging source) specify the parties responsible for the bibliographic record.</description>
-    <subfield code="a" repeatable="false">
-      <description>Original cataloging agency </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Language of cataloging A MARC code for the language used in the textual portions of the record.Code from: MARC Code Lists for Languages</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Transcribing agency </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Modifying agency </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Description conventions The MARC code for or the title of the description rules used in creating the record when more information than is provided by the code in Leader/18 (Descriptive cataloging form) is needed.Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="041">
-    <description>Codes for languages associated with an item when the language code in field 008/35-37 of the record is insufficient to convey full information. This includes records for multilingual items, items that involve translation, and items where the medium of communication is a sign language. The sources of the codes are: MARC Code List for Languages or other code lists such as ISO 639-1 (Codes for the representation of names of languages - Part 1 : alpha-2 code).</description>
-    <indicator position="1" value="0">
-      <description>Item not a translation/does not include a translation</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Item is or includes a translation</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Language code of text/sound track or separate title The first language code in subfield $a is also contained in field 008/35-37 (Language), unless character positions 35-37 contain blanks(###).</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Language code of summary or abstract/overprinted title or subtitle The language of the summary or abstract/overprinted title or subtitle that differs from the language of the text.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Language code of sung or spoken text The language of the sung or spoken content of a sound recording. The language code in the first occurrence of subfield $d, if there is no subfield $a, may also be recorded in field 008/35-37.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Language code of librettos The language of the printed text of the vocal/textual content of the work.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Language code of table of contents The language of the table of contents that differs from the language of the text.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Language code of accompanying material other than librettos The language of significant accompanying material other than summaries (subfield $b) or librettos (subfield $e).</description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Language code of original and/or intermediate translations of text Codes for intermediate translations precede those for original languages.</description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="042">
-    <description>One or more codes that indicate an authentication center has reviewed a national database record. The codes are associated with specifically designated authentication agencies.</description>
-  </field>
-  <field repeatable="false" tag="043">
-    <description>Geographic area codes associated with an item. The source of the code in subfield $a is the MARC Code List for Geographic Areas . The source of a local code in subfield $b is indicated in subfield $2. The source of codes in subfield $c is ISO 3166, Codes for the representation of names of countries and their subdivisions - Part 1 : Country codes or Part 2 : Country subdivision codes.</description>
-  </field>
-  <field repeatable="false" tag="044">
-    <description>Codes for the country of producer when the code in field 008/15-17 (Place of publication, production, or execution) of the record is insufficient to convey full information for an item produced in more than one country. The source of the code is subfield $a is MARC Code List for Countries . Subfield $c may be used to include country and subentity codes from ISO 3166, Codes for the representation of names of countries and their subdivisions - Part 1 : Country codes or Part 2 : Country subdivision codes.</description>
-  </field>
-  <field repeatable="false" tag="045">
-    <description>A time period code (subfield $a) and/or a formatted time period (subfield $b and/or $c) associated with an item.</description>
-    <indicator position="1" value="0">
-      <description>Single date/time</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Multiple single dates/timesMultiple $b and/or $c subfields are present; each contains a formatted date/time.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Range of dates/timesTwo $b and/or $c subfields are present and together express a range of dates and/or times.</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Time period code A four-character alphanumeric code derived from the "Time Period Code Table" for B.C. and A.D. time periods. The Table is found in MARC 21 Format for Bibliographic Data under the description of field 045.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Formatted 9999 B.C. through C.E. time period A time period recorded in the pattern yyyymmddhh and preceded by a code for the era ( c for B.C.; d for C.E.).</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Formatted pre-9999 B.C. time period A time period that consists of as many numeric characters as are needed to represent the number of pre-9999 years B.C.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="046">
-    <description>The date of item information that cannot be recorded in 008/06-14 (Type of date/Publication status, Date 1, Date 2) because such information involves one or more Before Common Era (B.C.) dates, incorrect dates, dates when resources have been modified or created, and date spans when resources are valid. When field 046 is used for B.C. dates, 008/06 is set to code b (No date given; B.C. date involved) and field 008/07-10 and 008/11-14 contain blanks (####). When field 046 is used for incorrect dates, field 008/06 is coded for the type of corrected data and field 008/07-10 and 008/11-14 contain correct dates.</description>
-    <subfield code="a" repeatable="false">
-      <description>Type of date code i - Inclusive dates of collection</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Date 1 (B.C. date) </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Date 1 (C.E. date) </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date 2 (B.C. date) The field must also contain a subfield $b.</description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Date 2 (C.E. date) The field must also contain a subfield $c.</description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Date resource modified </description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Beginning or single date created </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Ending date created </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Beginning of date valid </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>End of date valid </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of date Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="047">
-    <description>The specific codes that indicate the form of composition of printed and manuscript music and musical sound recordings when more than one code applies to the work (008/18-19, Form of composition, code mu).</description>
-    <subfield code="a" repeatable="true">
-      <description>Form of musical composition code The two-character, alphabetic codes are listed under field 008 Music, /18-19 (Form of composition).</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="048">
-    <description>A two-character, alphabetic code that indicates the medium of performance for a musical group. Each code may be followed by a two-digit number (01-99) that indicates the number of parts or performers (e.g., va02, a two-part composition for Voices - Soprano). The number of parts may be omitted if not applicable.</description>
-    <subfield code="a" repeatable="true">
-      <description>Performer or ensemble A two-character alphabetic code for a performer or ensemble (from the list below) and, if applicable, a two-digit number specifying the number of parts.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Soloist A two-character alphabetic code for a soloist (from the list below) and, if applicable, a two-digit number specifying the number of parts.</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="050">
-    <description>A classification or call number that is taken from Library of Congress Classification or LC Classification Additions and Changes. The brackets that customarily surround alternate class/call numbers are not carried in the MARC record; they may be generated based on the presence of repeated $a subfields.</description>
-    <indicator position="1" value="0">
-      <description>Item is in LCMay be used by organizations transcribing from LC copy on which the call number is neither enclosed within brackets nor preceded by a Maltese cross.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Item is not in LCMay be used by organizations transcribing from LC copy on which the call number is enclosed within brackets or is preceded by a Maltese cross. The brackets that customarily surround call numbers for items not in LC are not carried in the MARC record; they may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Assigned by LCMay be used by organizations transcribing from LC copy.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Assigned by agency other than LC</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number Organizations that use the Cutter-Sanborn Three-Figure Author Table may conform to LC item number practice by applying Subject Cataloging Manual: Shelflisting procedures.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="051">
-    <description>Information added to a bibliographic record by LC that relates to copies, issues, and/or offprints of the described item that are in its collections.</description>
-    <subfield code="a" repeatable="false">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Copy information </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="052">
-    <description>A code for the main geographic area and any applicable subareas associated with the item.</description>
-    <indicator position="1" value="1">
-      <description>U.S. Dept. of Defense Classification</description>
-    </indicator>
-    <indicator position="1" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Geographic classification area code A four- to six-character numeric code for the main geographic area associated with the item. The code is derived from the LC class G schedule by dropping the letter G.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Geographic classification subarea code An alphanumeric code, assigned from expanded Cutter lists, that represents a subarea of the geographic area coded in subfield $a. Cutter numbers for places in the U.S. are published in Geographic Cutters that is maintained by the Library of Congress.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Populated place name May contain the name of the geographic area</description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Code source </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="055">
-    <description>A classification or call number that is assigned by the Library and Archives Canada or a contributing Canadian library.</description>
-    <indicator position="1" value="0">
-      <description>Work held by LAC</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Work not held by LAC</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>LC-based call number assigned by LAC</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Complete LC class number assigned by LAC</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Incomplete LC class number assigned by LAC</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>LC-based call number assigned by the contributing library</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Complete LC class number assigned by the contributing library</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Incomplete LC class number assigned by the contributing library</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>Other call number assigned by LAC</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Other class number assigned by LAC</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>Other call number assigned by the contributing library</description>
-    </indicator>
-    <indicator position="2" value="9">
-      <description>Other class number assigned by the contributing library</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of call/class number A MARC code that identifies the classification scheme used to assign the call/class number when the second indicator position contains value 6, 7, 8, or 9. Code from: MARC Code Lists for Relators, Sources, Description Conventions .</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="060">
-    <description>A classification or call number that is taken from National Library of Medicine Classification schedules QS-QZ and W or from Library of Congress Classification schedules as used by NLM for peripheral and related topics.</description>
-    <indicator position="1" value="0">
-      <description>Item is in NLM</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Item is not in NLM</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Assigned by NLM</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Assigned by agency other than NLM</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number NLM uses the Cutter-Sanborn Three-Figure Author Table and a special numbering scheme in classes W1 and W3 to create item numbers.</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="061">
-    <description>Information added to a bibliographic record by NLM that relates to second copies or sets of the described item that are in its collections.</description>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Copy information </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="066">
-    <description>Information that indicates that the character set present in a record is other than ISO 10646 (or Unicode). A detailed description of the standard escape sequences used in MARC records is provided in MARC 21 Specifications for Record Structure, Character Sets, and Exchange Media .</description>
-    <subfield code="a" repeatable="false">
-      <description>Primary G0 character set The Intermediate and Final characters of the escape sequence that designates and invokes the default G0 character set.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Primary G1 character set The Intermediate and Final characters of the escape sequence that designates and invokes the default G1 character set.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Alternate G0 or G1 character set The Intermediate and Final characters of each escape sequence that designates an alternate G0 or G1 character set used in a record.</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="070">
-    <description>A classification or call number that is assigned by the National Agricultural Library.</description>
-    <indicator position="1" value="0">
-      <description>Item is in NAL</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Item is not in NAL</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="071">
-    <description>Information added to a bibliographic record by NAL that relates to second copies or sets of the described item that are in its collections.</description>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Copy information </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="072">
-    <description>A code for the subject category that is associated with the described item.</description>
-    <indicator position="2" value="0">
-      <description>NAL subject category code listThe subject category code is taken from AGRIS: Subject Categories that is maintained by NAL.</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Subject category code The code for the broad subject associated with the item.</description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Subject category code subdivision The level of specificity within the broader subject coded in subfield $a.</description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source A MARC code that identifies the thesaurus used to assign the subject category code when the second indicator position contains value 7. Code from: MARC Code Lists for Relators, Sources, Description Conventions .</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="074">
-    <description>A number assigned by the U.S. Government Printing Office to publications to manage their distribution within its Depository Library System.</description>
-    <subfield code="a" repeatable="false">
-      <description>GPO item number The number is assigned from List of Classes of United States Government Publications Available for Selection by Depository Libraries that is maintained by GPO. GPO Item No. : may be generated for display.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid GPO item number </description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="080">
-    <description>A number taken from the Universal Decimal Classification scheme.</description>
-  </field>
-  <field repeatable="true" tag="082">
-    <description>The classification number is taken from Dewey Decimal Classification and Relative Index, the Abridged Dewey Decimal Classification and Relative Index, and electronic updates to either edition. Through 1997, updates where issued in DC&amp;: Dewey Decimal Classification Additions, Notes and Decisions.</description>
-    <indicator position="1" value="0">
-      <description>Full edition</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Abridged edition</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Assigned by LCMay be used by organizations transcribing from LC copy.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Assigned by agency other than LC</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Edition number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="084">
-    <description>A classification number from a scheme not covered by one of the other number fields. The field should not be used for classification numbers assigned from a source for which a subfield $2 source of number code would not be assigned.</description>
-    <subfield code="a" repeatable="true">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Item number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of number Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="086">
-    <description>The classification number assigned to documents by designated agencies in countries that have a government documents classification program.</description>
-    <indicator position="1" value="0">
-      <description>Superintendent of Documents Classification SystemAssigned by the U.S Government Printing Office. Supt. of Docs. no.: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Government of Canada Publications: Outline of Classification</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Classification number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid classification number </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Number source A MARC code that identifies the government document classification scheme used to assign the number when the first indicator position contains value #. The code may be used to generate a display constant to identify the source of the classification number. Code from: MARC Code Lists for Relators, Sources, Description Conventions .</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="088">
-    <description>A report number that is not a Standard Technical Report Number (field 027)</description>
-    <subfield code="a" repeatable="false">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Canceled/invalid report number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="100">
-    <description>A personal name used as a main entry in a bibliographic record.</description>
-    <indicator position="1" value="0">
-      <description>ForenameThe name is a forename or is a name consisting of words, initials, letters, etc., that are formatted in direct order.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>SurnameThe name is a single or multiple surname formatted in inverted order or a single name without forenames that is known to be a surname.</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Family nameThe name represents a family, clan, dynasty, house, or other such group and may be formatted in direct or inverted order.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Personal name A surname and/or forename; letters, initials, abbreviations, phrases, or numbers used in place of a name; or a family name.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Numeration A roman numeral or a roman numeral and a subsequent part of a forename when the first indicator value is 0.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Titles and other words associated with a name </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Dates associated with a name Dates of birth, death, or flourishing, or any other date associated with a name.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term Describes the relationship between a name and a work.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work A date of publication used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information A data element not more appropriately contained in another defined subfield.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Attribution qualifier Attribution information for names when the responsibility is unknown, uncertain, fictitious or pseudonymous.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work The name of a language(s) used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work A number designation for a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work A name designation of a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Fuller form of name A more complete form of the name contained in subfield $a.</description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work A uniform title, a title page title of a work, or a series title used in a name/title field.</description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation An affiliation or address of the name.</description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code A MARC code for the relationship between a name and a work. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="110">
-    <description>A corporate name used as a main entry in a bibliographic record.</description>
-    <indicator position="1" value="0">
-      <description>Inverted nameThe corporate name begins with a personal name in inverted order.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction nameThe entry element is a name of a jurisdiction that is also an ecclesiastical entity or is a jurisdiction name under which a corporate name or a title of a work is entered.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Corporate name or jurisdiction name as entry element A name of a corporate body or the first entity when subordinate units are present; a jurisdiction name under which a corporate body, city section, or a title of a work is entered; or a jurisdiction name that is also an ecclesiastical entity.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Subordinate unit A name of a subordinate corporate unit, a name of a city section, or a name of a meeting entered under a corporate or jurisdiction name.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting A place name or a name of an institution where a meeting was held.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of meeting or treaty signing The date a meeting was held or, in a name/title field, the date a treaty was signed.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term Describes the relationship between a name and a work.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work A date of publication used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information The name of the other party to a treaty in a name/title field; a subelement that is not more appropriately contained in subfield $c, $d, or $n in a meeting entered under a corporate name; or a data element that is not more appropriately contained in another defined subfield in any other type of corporate name field.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work A name designation of a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting A number designation for a meeting entered under a corporate name or for a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work A name designation of a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work A uniform title, a title page title of a work, or a series title used in a name/title field.</description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation An affiliation or address of the name.</description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code A MARC code for the relationship between a name and a work. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="111">
-    <description>A meeting name used as a main entry in a bibliographic record.</description>
-    <indicator position="1" value="0">
-      <description>Inverted nameThe meeting name begins with a personal name in inverted order.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction nameThe entry element is a jurisdiction name under which a meeting name is entered.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Meeting name or jurisdiction name as entry element A name of a meeting, or the first entity when subordinate units are present; or a jurisdiction name under which a meeting name is entered.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting A place name or a name of an institution where a meeting was held.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of meeting </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Subordinate unit The name of a subordinate unit entered under a meeting name.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work A date of publication used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information A data element not more appropriately contained in another defined subfield.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work The name of a language(s) used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting A number of a meeting or a number designation for a part or section of a work.</description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work A name designation of a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Name of meeting following jurisdiction name entry element The name of a meeting that is entered under a jurisdiction name contained in subfield $a.</description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work A uniform title, a title page of a work, or a series title used in a name/title field.</description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation An affiliation or address of the name.</description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code A MARC code for the relationship between a name and a work. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="130">
-    <description>A uniform title used as a main entry in a bibliographic record.</description>
-    <indicator position="1" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work A date of publication used with a title of a work in a name/title field.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work A title-page title of an item.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="210">
-    <description>Contains title as abbreviated for indexing or identification. An abbreviated key title is supplied by ISSN centers, based on the Key Title (Field 222). Other abbreviated titles are supplied by cataloging agencies, including abstracting and indexing services.</description>
-    <indicator position="1" value="0">
-      <description>No added entry</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Added entry</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Other abbreviated title</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Abbreviated title </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Qualifying information Abbreviated form of the parenthetical qualifying information contained in the key title (field 222).</description>
-    </subfield>
-    <subfield code="2" repeatable="true">
-      <description>Source Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="222">
-    <description>A unique title for a continuing resource that is assigned in conjunction with an ISSN recorded in field 022 by national centers under the auspices of the ISSN Network.</description>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Key title </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Qualifying information Parenthetical information that makes a title unique.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="240">
-    <description>The uniform title for an item when the bibliographic description is entered under a main entry field that contains a personal (field 100), corporate (110), or meeting (111) name.</description>
-    <indicator position="1" value="0">
-      <description>Not printed or displayed</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Printed or displayed</description>
-    </indicator>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information A data element not more appropriately contained in another defined subfield.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="242">
-    <description>A translation of the title proper that is made by the cataloger when the translated title does not appear as a parallel title on the item. For a note, the introductory phrase Title translated: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>No added entry</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Added entryA value that indicates whether an added entry for the title is to be generated.</description>
-    </indicator>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Title The title proper, exclusive of the designation of number or name of part and any alternative title.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of title Includes parallel, alternative, and other title information.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Statement of responsibility, etc. The statement of responsibility and/or any remaining title statement data that are not more appropriately contained in one of the other subfields.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>Language code of translated title Code from: MARC Code List for Languages</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="243">
-    <description>A generic title that is constructed by the cataloger to collect works by a prolific author. The brackets that customarily enclose a collective uniform title are not carried in the MARC record. They may be generated based on the field tag.</description>
-    <indicator position="1" value="0">
-      <description>Not printed or displayed</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Printed or displayed</description>
-    </indicator>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="245">
-    <description>The title and statement of responsibility area of the bibliographic description of a work.</description>
-    <indicator position="1" value="0">
-      <description>No added entryNo title added entry is made either because no title added entry is desired or because the title added entry is not traced the same as the title in field 245.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Added entryThe desired title added entry is the same as the title in field 245.</description>
-    </indicator>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of title </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Statement of responsibility, etc. </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Inclusive dates The time period during which the entire content of the described materials was created.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Bulk dates The time period during which the bulk of the content of the described materials was created.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form A term that is descriptive of the form of the described materials, determined by an examination of their physical character, the subject of their intellectual content, or the order of information within them.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version The name, code, or description of a copy of the described materials that was generated at different times or for different audiences.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="246">
-    <description>A form of the title appearing on different parts of an item or a portion of the title proper, or an alternative form of the title when the form differs significantly from the title contained in field 245.</description>
-    <indicator position="1" value="0">
-      <description>Note, no added entry</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Note, added entry</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>No note, no title added entry</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>No note, added entry</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Portion of titleAn added entry may be generated by first indicator value 1. No note is generated.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Parallel titleThe parallel title that is contained in subfield $b of field 245. No note is generated.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Distinctive titleA special title that appears in addition to the regular title on individual issues of an item and by which the issue may be known. Distinctive title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>Other titleA title that appears on the piece that is not more appropriately indicated by one of the other values. Other title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Cover titleA title that is printed on the original cover of a publication or lettered or stamped on the publisher's binding and which is used when the cover is not the chief source of the bibliographic description. Cover title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Added title page titleA title in another language found on a title page that is not used as the chief source of the bibliographic description. Added title page title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>Caption titleA title printed at the head of the first page of text. Caption title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Running titleA title printed at the top or bottom margin of each page of a publication. Running title: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>Spine titleA publisher's title found on the spine of a publication. Spine title: may be generated with the note for display.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Title proper/short title </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of title </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date or sequential designation A date or a volume/issue number that relates the variant title to the bibliographic description when a note is generated from the field.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="247">
-    <description>A former title proper when one cataloging record represents several titles associated with an entity.</description>
-    <indicator position="1" value="0">
-      <description>No added entry</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Added entry</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Display noteTitle varies: may be generated with the note for display.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Do not display noteA textual note is contained in field 547 (Former Title Complexity Note).</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of title </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date or sequential designation Dates or volume/issue numbers of the continuing resource that bore the former title.</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="250">
-    <description>Information relating to the edition of a work as determined by applicable cataloging rules.</description>
-    <subfield code="a" repeatable="false">
-      <description>Edition statement </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of edition statement Usually, a statement of personal or corporate responsibility and/or a parallel edition statement.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="254">
-    <description>A description of the format of an edition of a work of printed or manuscript music that may differ from the format of another edition of the same work.</description>
-    <subfield code="a" repeatable="false">
-      <description>Musical presentation statement </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="255">
-    <description>Mathematical data that is associated with map material, including celestial charts. This data may also be coded in field 034 (Coded Mathematical Data).</description>
-    <subfield code="a" repeatable="false">
-      <description>Statement of scale Includes any equivalency statements, vertical scales or vertical exaggeration statements for relief models and other three-dimensional items.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Statement of projection </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Statement of coordinates </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Statement of zone Used for celestial charts.</description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Statement of equinox </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Outer G-ring coordinate pairs </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Exclusion G-ring coordinate pairs </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="256">
-    <description>Characteristics of a computer file, such as the type of file, the number of records or statements.</description>
-    <subfield code="a" repeatable="false">
-      <description>Computer file characteristics </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="257">
-    <description>The name or abbreviation of the name of the country where the principal offices of the producing entity of a moving image work are located.</description>
-    <subfield code="a" repeatable="false">
-      <description>Country of producing entity May contain the abbreviation [S.l.] when the country is unknown.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="258">
-    <description>Stamps, postal stationery and all other documents created and/or used to signify pre-payment or payment due for postal services; stamps or other labels resembling the material described above, but which have no postal value; cancellations or other marks created and/or used by a postal administration to show evidence of postal usage; material bearing one or more of the items described above.</description>
-    <subfield code="a" repeatable="false">
-      <description>Issuing jurisdiction </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Denomination </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="260">
-    <description>Information relating to the publication, printing, distribution, issue, release, or production of a work.</description>
-    <indicator position="1" value="2">
-      <description>Intervening publisher</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Current/latest publisher</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Place of publication, distribution, etc. May contain the abbreviation [S.l.] when the place is unknown.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Name of publisher, distributor, etc. May contain the abbreviation [s.n.] when the name is unknown.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Date of publication, distribution, etc. May contain multiple dates (e.g., dates of publication and copyright).</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Place of manufacture </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Manufacturer May contain the abbreviation [s.n.] when the name is unknown.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Date of manufacture </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="263">
-    <description>The projected date of publication used in bibliographic records for works that have not yet been published.</description>
-  </field>
-  <field repeatable="true" tag="270">
-    <description>Contains an address (as well as electronic access data such as telephone, fax, TTY, etc. numbers) associated with a bibliographic item. Multiple addresses, such as mailing addresses and addresses corresponding to the physical location of an item or facilities, are recorded in separate occurrences of field 270.</description>
-    <indicator position="1" value="1">
-      <description>Primary</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Secondary</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Mailing</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Type specified in subfield $i</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Address </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>City </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>State or province </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Country </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Postal code </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Terms preceding attention name </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Attention name </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Attention position </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Type of address </description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Specialized telephone number </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Telephone number </description>
-    </subfield>
-    <subfield code="l" repeatable="true">
-      <description>Fax number </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Electronic mail address </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>TDD or TTY number </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Contact person </description>
-    </subfield>
-    <subfield code="q" repeatable="true">
-      <description>Title of contact person </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Hours </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="300">
-    <description>A physical description of the described item, including its extent, dimensions, and such other physical details as a description of any accompanying materials and unit type and size.</description>
-    <subfield code="a" repeatable="true">
-      <description>Extent The number of pages, volumes, cassettes, total playing time, etc., of the described item.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Other physical details Physical characteristics such as illustrative matter, coloration, playing speed, groove characteristics, presence and kind of sound, number of channels, and motion picture presentation format.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Dimensions Expressed in centimeters, millimeters, or inches; may include a parenthetical qualifier giving the format of the item (e.g., (fol.), (8vo)).</description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Accompanying material May include a parenthetical physical description of the accompanying material.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Type of unit Terms such as page, volumes, boxes, cu. ft., linear ft., etc. that identify the configuration of the material and how it is stored.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Size of unit The size of the unit contained in subfield $f. Subfield $g is repeatable when additional forms of extent data are given.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified The part of the described materials to which the field applies.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="306">
-    <description>Six numeric characters, in the pattern hhmmss, that represent the playing time for a sound recording or the stated duration of performance of printed or manuscript music. If the playing time is less than 1 hour, the hour (hh) is recorded as two zeroes; if less than a minute, the minute (mm) is also recorded as two zeroes.</description>
-  </field>
-  <field repeatable="true" tag="307">
-    <description>Chronological information identifying the days and/or times an item is available or accessible. It is used primarily in records for electronic resources.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Hours </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Additional information </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="310">
-    <description>The current stated publication frequency of either an item or an update to an item. Dates are included when the beginning date of the current frequency is not the same as the beginning date of publication. These data are related to coded data in field 008/18 (Frequency) and 008/19 (Regularity).</description>
-    <subfield code="a" repeatable="false">
-      <description>Current publication frequency </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Date of current publication frequency The date is different from the beginning date of the publication and a former frequency is contained in field 321.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="321">
-    <description>The former frequency of either an item or an update to an item when a current frequency is contained in field 310.</description>
-    <subfield code="a" repeatable="false">
-      <description>Former publication frequency </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Dates of former publication frequency </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="340">
-    <description>Physical description information for an item that requires technical equipment for its use or an item that has special conservation or storage needs.</description>
-    <subfield code="a" repeatable="true">
-      <description>Material base and configuration The physical substance (e.g., acetate, clay, vellum, wood) and configuration (e.g., cartridge, chip, videotape) on which the information is recorded.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Dimensions The measurements of the material configuration.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Materials applied to surface The physical substance applied to the material base (e.g., ink, paint, albumen).</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Information recording technique The technique used to record the data in or on the material base (e.g., punched, molded, x-ray).</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Support The physical material on or in which records are mounted, bound, or otherwise supported.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Production rate/ratio The normal rate or ratio at which the material must be used for the information to be meaningful (e.g., revolutions per minute for recordings).</description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Location within medium The location of the described materials within the material base and configuration (e.g., baud, frame number).</description>
-    </subfield>
-    <subfield code="i" repeatable="true">
-      <description>Technical specifications of medium The access requirements of technical equipment.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified The part of the described materials to which the field applies.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="342">
-    <description>A description of the frame of reference for the coordinates in a data set. To work with a data set a user must be able to identify how location accuracy has been affected through the application of a geospatial reference method, thus enabling the user to manipulate the data set to recover location accuracy.</description>
-    <indicator position="1" value="0">
-      <description>Horizontal coordinate system</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Vertical coordinate system</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Geographic</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Map projection</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Grid coordinate system</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>Local planar</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Local</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Geodetic model</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>Altitude</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Method specified in $2</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>Depth</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Name </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Coordinate or distance units </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Latitude resolution </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Longitude resolution </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Standard parallel or oblique line latitude </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Oblique line longitude </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Longitude of central meridian or projection center </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Latitude of projection origin or projection center </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>False easting </description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>False northing </description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Scale factor </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Height of perspective point above surface </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Azimuthal angle </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Azimuth measure point longitude or straight vertical longitude from pole </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Landsat number and path number </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Zone identifier </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Ellipsoid name </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Semi-major axis </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Denominator of flattening ratio </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Vertical resolution </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Vertical encoding method </description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Local planar, local, or other projection or grid description </description>
-    </subfield>
-    <subfield code="w" repeatable="false">
-      <description>Local planar or local georeference information </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Reference method used </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="343">
-    <description>Information about the coordinate system developed on a planar surface. The information is provided to allow the user of a geospatial data set to identify the quantities of distances, or distances and angles. These define the position of a point on a reference plane onto which the surface of the Earth has been projected.</description>
-    <subfield code="a" repeatable="false">
-      <description>Planar coordinate encoding method </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Planar distance units </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Abscissa resolution </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Ordinate resolution </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Distance resolution </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Bearing resolution </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Bearing units </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Bearing reference direction </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Bearing reference meridian </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="351">
-    <description>Describes the organization and arrangement of a collection of items.</description>
-    <subfield code="a" repeatable="true">
-      <description>Organization The manner in which the described materials are subdivided into smaller units, information about the file structure of computer files or the name of the computer software or system.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Arrangement The pattern of arrangement of materials within a unit (e.g., alphabetical, by country).</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Hierarchical level The hierarchical position of the described materials relative to other records from the same source.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified The part of the described materials to which the field applies.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="352">
-    <description>A description of the method of referencing and the mechanism used to represent graphic information in a data set. This information consists of the type of storage technique used, the number of items in the data set, and the format in which the data is stored.</description>
-    <subfield code="a" repeatable="false">
-      <description>Direct reference method </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Object type </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Object count </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Row count </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Column count </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Vertical count </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>VPF topology level </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Indirect reference description </description>
-    </subfield>
-    <subfield code="q" repeatable="true">
-      <description>Format of the digital image </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="355">
-    <description>Specifics pertaining to the security classification associated with the document, title, abstract, contents note, and/or the author. In addition, it can contain handling instructions and external dissemination information pertaining to the dissemination of the document, title, abstract, contents note, and author. The field may also contain downgrading or declassification data, the name of the classification system, and a country of origin code. Code from: MARC Code List for Countries</description>
-    <indicator position="1" value="0">
-      <description>Document</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Title</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Abstract</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Contents note</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Author</description>
-    </indicator>
-    <indicator position="1" value="5">
-      <description>Record</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>Other element</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Security classification A term that specifies a security classification (e.g., Unclassified, Secret, Confidential associated with the document, title, abstract, contents note, or author.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Handling instructions Handling instructions, e.g., who may handle or see the document, title, abstract, contents not, or author's name.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>External dissemination information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Downgrading or declassification event Data about the security classification, often a phrase pertaining to downgrading or declassification, e.g. OADR (which stands for "Original Agency Determination Required"). Dates relating to the downgrading or declassification event are recorded in subfields $g or $h.</description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Classification system The name of a classification system, not necessarily from a controlled list.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Country of origin code A two- or three-character alphabetic MARC code indicating the country of origin of the classification. Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Downgrading date A date pertaining to the downgrading of the document, title, abstract, contents note, or author information. Downgrading involves changes to security classification, from higher level to a lower level of classification.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Declassification date A date pertaining to the declassification of the document, title, abstract, contents note, or author information. Declassification involves the removal of any security classification on and item.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Authorization Information that identifies by whose authority a change in security classification was made. The subfield contains a MARC organization code.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="357">
-    <description>Specifics pertaining to originator (i.e., author, producer) control of dissemination of the material in hand. Subfield $a contains a specific term denoting that the originator has control over the material.</description>
-  </field>
-  <field repeatable="true" tag="362">
-    <description>Contains the beginning/ending date(s) of an item and/or the sequential designations used on each part. Dates to be used in this field are chronological designations that identify individual issues of the continuing resource. The sequential designations are usually numeric but can be alphabetic as well. The information may be formatted or unformatted. If the date information has been obtained from a source other than the first and/or last issue of the item published, the information is given in an unformatted note and the source of the information is usually cited.</description>
-    <indicator position="1" value="0">
-      <description>Formatted style</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Unformatted note</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Dates of publication and/or sequential designation When both a sequential designation and a chronological designation are given, the chronological one is enclosed in parentheses.</description>
-    </subfield>
-    <subfield code="z" repeatable="false">
-      <description>Source of information Citation of the source of information contained in subfield $a; used with unformatted notes.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="365">
-    <description>Contains the current price of an item or records the special export price of an item in any currency.</description>
-    <subfield code="a" repeatable="false">
-      <description>Price type code </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Price amount </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Currency code </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Unit of pricing </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Price note </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Price effective from </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Price effective until </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Tax rate 1 </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Tax rate 2 </description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>ISO country code Code from: ISO 3166-1, Codes for the Representation of Names of Countries.</description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>MARC country code Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Identification of pricing entity </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of price type code Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="366">
-    <description>Contains detailed information relating to the availability of items from publishers.</description>
-    <subfield code="a" repeatable="false">
-      <description>Publishers' compressed title identification </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Detailed date of publication </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Availability status code </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Expected next availability date </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Note </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Publishers' discount category </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Date made out of print </description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>ISO country code Code from: ISO 3166-1, Codes for the Representation of Names of Countries.</description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>MARC country code Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Identification of agency </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of availability status code Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="440">
-    <description>A series statement consisting of a series title alone.</description>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work A number designation of a part/section of a series.</description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work A name designation of a part/section of a series.</description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Volume number/sequential designation </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="490">
-    <description>A series statement for which no series added entry is traced or for which the added entry is traced in one of the 800-830 fields in a form different from the form contained in field 490.</description>
-    <indicator position="1" value="0">
-      <description>Series not traced</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Series traced differently</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Series statement A series title that may also contain a statement of responsibility, other title information, dates, or volume numbers preceding or appearing as part of the title.</description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Library of Congress call number An LC series call number that is used for a continuing resource that has been issued as part of the series.</description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Volume number/sequential designation </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="500">
-    <description>General information for which a specialized 5XX note field has not been defined.</description>
-    <subfield code="a" repeatable="false">
-      <description>General note </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="501">
-    <description>A note that is used when more than one bibliographic work is contained in a physical item at the time of publishing, release, issue, or execution. The works usually have distinctive titles and lack a collective title.</description>
-    <subfield code="a" repeatable="false">
-      <description>With note Includes a relevant introductory phrase (e.g., With:, On reel with:).</description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="502">
-    <description>The designation of an academic dissertation or thesis and the institution to which it was presented. (A note that describes the relationship of a work to a dissertation or thesis is recorded in field 500).</description>
-    <subfield code="a" repeatable="false">
-      <description>Dissertation note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="504">
-    <description>Information on the presence of one or more bibliographies, discographies, filmographies, and/or other bibliographic references in a described item or in accompanying material.</description>
-    <subfield code="a" repeatable="false">
-      <description>Bibliography, etc. note </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Number of references Used to indicate the significance of a bibliography.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="505">
-    <description>The titles of separate works or parts of an item or the table of contents. The field may also contain statements of responsibility and volume numbers or other sequential designations.</description>
-    <indicator position="1" value="0">
-      <description>Contents</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Incomplete contentsAll parts of a multipart item are not listed because they were not available for analysis. Incomplete contents: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Partial contentsAll parts were available for analysis but only selected parts are listed. Partial contents: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Enhanced</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Formatted contents note The format of the note is determined by the relevant cataloging rules.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Statement of responsibility </description>
-    </subfield>
-    <subfield code="t" repeatable="true">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="506">
-    <description>Information on the restrictions that govern access to or the limited distribution of the described materials.</description>
-    <subfield code="a" repeatable="false">
-      <description>Terms governing access Legal, physical, or procedural restrictions imposed on individuals wishing to see the described materials.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Jurisdiction The name of a person, an institution, or a position or function within the institution, by whom or which the terms governing access are imposed and to whom the restriction may be appealed.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Physical access provisions Arrangements required for physical access.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Authorized users A class of users or specific individuals to whom the restrictions in subfield $a do not apply.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Authorization The source of authority for the restriction.</description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="507">
-    <description>For visual materials, this field contains the scale of architectural drawings or three-dimensional artifacts. For maps, the scale of an item is contained in this field only in pre-AACR 2 cataloging records. Scale information is contained in field 255 (Mathematical Data Area) in AACR 2 formulated records.</description>
-    <subfield code="a" repeatable="false">
-      <description>Representative fraction of scale note </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Remainder of scale note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="508">
-    <description>The names of the persons (other than members of the cast) or organizations who participated in the artistic or technical production of the work. The introductory term Credits: that customarily precedes the names is not carried in the MARC record. It may be generated based on the field tag.</description>
-    <subfield code="a" repeatable="false">
-      <description>Creation/production credits note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="510">
-    <description>Citations or references to published bibliographic descriptions, reviews, abstracts, or indexes of the content of the described item.</description>
-    <indicator position="1" value="0">
-      <description>Coverage unknownThe abstracting and indexing coverage is not specified. Indexed by: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Coverage completeThe abstracting and indexing coverage includes references to all articles in a journal and/or all issues within each volume. Indexed in its entirety by: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Coverage is selectiveThe abstracting and indexing coverage is selective. Indexed selectively by: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Location in source not givenReferences: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Location in source givenReferences: may be generated for display.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Name of source </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Coverage of source The dates of the continuing resource with which the abstracting and indexing coverage began and ended.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location within source </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="511">
-    <description>The names of the participants, players, narrators, presenters, or performers.</description>
-    <indicator position="1" value="0">
-      <description>No display constant generated</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>CastCast: may be generated for display.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Participant or performer note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="513">
-    <description>Information on the type of report and the period covered by the report.</description>
-    <subfield code="a" repeatable="false">
-      <description>Type of report </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Period covered </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="514">
-    <description>Provides a general assessment of the quality of the data set constituting the item.</description>
-    <subfield code="a" repeatable="false">
-      <description>Attribute accuracy report </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Attribute accuracy value </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Attribute accuracy explanation </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Logical consistency report </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Completeness report </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Horizontal position accuracy report </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Horizontal position accuracy value </description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Horizontal position accuracy explanation </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Vertical positional accuracy report </description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Vertical positional accuracy value </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Vertical positional accuracy explanation </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Cloud cover </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Display note Introduces the data in the field, when needed.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="515">
-    <description>An unformatted description of irregularities and peculiarities in numbering or publishing patterns, report year coverage, revised editions, and/or issuance in parts.</description>
-    <subfield code="a" repeatable="false">
-      <description>Numbering peculiarities note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="516">
-    <description>A general descriptor that characterizes a file (e.g., text, computer program, numeric). Specific information such as the form or genre of textual material (e.g., biography, indexes) also may be included. The general type of file is coded in field 008/26 (Type of computer file).</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Type of computer file or data note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="518">
-    <description>Textual information on the date/time and/or place of creation, capture, or broadcast associated with an event or the finding of a naturally occurring object. This information in coded form is contained in field 033 (Date/Time and Place of an Event).</description>
-    <subfield code="a" repeatable="false">
-      <description>Date/time and place of an event note </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="520">
-    <description>Unformatted information that describes the scope and general contents of the materials. This could be a summary, abstract, annotation, review, or only a phrase describing the material.</description>
-    <indicator position="1" value="0">
-      <description>Subject</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Review</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Scope and content</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Abstract</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Summary, etc. note </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Expansion of summary note </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="521">
-    <description>Information that identifies the specific audience or intellectual level for which the content of the described item is considered appropriate.</description>
-    <indicator position="1" value="0">
-      <description>Reading grade level</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Interest age level</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Interest grade level</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Special audience characteristics</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Motivation interest level</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Target audience note </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Source The organization that determined the target audience of the item.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="522">
-    <description>Information on the geographic coverage of the described material (usually survey material). This information in coded form may be contained in field 052 (Geographic Classification Code).</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Geographic coverage note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="524">
-    <description>The format of the citation of the described materials that is preferred by the custodian.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Preferred citation of described materials note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of schema used </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="525">
-    <description>Information on the existence of supplements or special issues (usually unnamed) that are neither cataloged as separate records nor recorded in field 770 (Supplement/Special Issue Entry).</description>
-    <subfield code="a" repeatable="false">
-      <description>Supplement note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="526">
-    <description>A note giving the name of a study program which uses the title described in the record. Details about the study program data elements are also contained in the field. Field 526 is generally used for formal curriculum-based study or reading programs.</description>
-    <indicator position="1" value="0">
-      <description>Reading program</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Program name </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Interest level </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Reading level </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Title point value </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Nonpublic note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="530">
-    <description>Availability information concerning a different physical format in which the described item is available.</description>
-    <subfield code="a" repeatable="false">
-      <description>Additional physical form available note For continuing resources, availability source, availability conditions, and order number information are included in subfield $a.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Availability source The organizational unit or vendor from which the additional physical form may be acquired.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Availability conditions The terms under which the additional physical form is available.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Order number </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="533">
-    <description>Descriptive data for a reproduction of an original item when the main portion of the bibliographic record describes the original item and the data differ.</description>
-    <subfield code="a" repeatable="false">
-      <description>Type of reproduction An introductory phrase that identifies the type of reproduction being described.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Place of reproduction </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Agency responsible for reproduction </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of reproduction </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Physical description of reproduction </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Series statement of reproduction </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Dates and/or sequential designation of issues reproduced </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note about reproduction </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Fixed-length data elements of reproduction Fifteen fixed-position character positions (designated as $7/0, $7/1- 4, etc.) that provide coded information about the reproduction. The codes used are counterparts to those defined for field 008 (Fixed-Length Data Elements), character positions /06-17 (All Formats), /18-19 (Continuing resources), and /23 (Books). Subfield $7 is the last subfield in the field. Each character position contains either a defined code or a fill character ( | )./0 - Type of date/Publication statusA one-character code that indicates the type of dates given in subfield $7/1-4 (Date 1) and /5-8 (Date 2/).See field 008/06 (Type of date/publication status) All Formats. Any code except code r (Reprint/reissue date and original date) may be used.</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="534">
-    <description>Descriptive data for an original item when the main portion of the bibliographic record describes a reproduction of that item and the data differ.</description>
-    <subfield code="a" repeatable="false">
-      <description>Main entry of original </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Edition statement of original </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Publication, distribution, etc. of original </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Physical description, etc. of original </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Series statement of original </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Key title of original </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Location of original </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note about original </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Introductory phrase A introductory phrase that introduces the citation of the original version.</description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title statement of original </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="535">
-    <description>The name and address of the repository that has custody of the original or a duplicate copy of the described material when either is housed in a repository different from that of the material being described.</description>
-    <indicator position="1" value="1">
-      <description>Holder of originals</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Holder of duplicates</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Custodian </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Postal address </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Country </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Telecommunications address </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Repository location code A MARC code for the country of the repository. Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="536">
-    <description>Contract, grant, and/or project numbers when the described material is the result of a funded project. Information concerning the sponsor or funding agency also may be included.</description>
-    <subfield code="a" repeatable="false">
-      <description>Text of note Information concerning the sponsor or funding agency.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Contract number </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Grant number </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Undifferentiated number An undifferentiated number associated with the material that identifies a project, task, or work unit number.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Program element number </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Project number </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Task number </description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Work unit number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="538">
-    <description>Technical information about an item, such as the presence or absence of certain kinds of codes; or the physical characteristics of a computer file, such as recording densities, parity, blocking factors, mode of access, software programming language, computer requirements, peripheral requirements, trade name or recording systems, number of lines of resolution, and modulation frequency. For sound and videorecordings, information about the trade name or recording system(s) (e.g., VHS), modulation frequency and number of lines of resolution may be included.</description>
-    <subfield code="a" repeatable="false">
-      <description>System details note </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="540">
-    <description>Terms governing the use of the described materials (e.g., copyrights, film rights, trade rights) after access has been provided.</description>
-    <subfield code="a" repeatable="false">
-      <description>Terms governing use and reproduction Usually, the text of a legal or official statement of restrictions.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Jurisdiction The name of a person, an institution, or a position or function within the institution, by whom or which the terms governing access are imposed and to whom the restriction may be appealed.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Authorization The source of authority for the restriction.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Authorized users A class of users or specific individuals to whom the restrictions in subfield $a do not apply.</description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="541">
-    <description>Information on the immediate source of acquisition of the described materials. The field is used primarily for original or historical items or other archival collections.</description>
-    <indicator position="1" value="0">
-      <description>Private</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Not private</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Source of acquisition The name of the person or organization that is the source of the material.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Address </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Method of acquisition The terms under which a transfer of physical custody occurs, e.g., by gift, loan, purchase.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of acquisition </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Accession number The identification code assigned to materials acquired in a single and separate transfer of custody.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Owner The individual or organization with legal custody over the described materials.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Purchase price </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Extent The number of items acquired.</description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Type of unit The name of the unit of measurement, e.g., cartons.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="544">
-    <description>The name and address of the custodian of materials that, at a previous time, have been part of the same collection or record group as the described materials.</description>
-    <indicator position="1" value="0">
-      <description>Associated materialsIndicates that the other materials identified in the note have the same provenance but reside in a different repository.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Related materialsIndicates that the other materials identified in the note share the sphere of activity, reside in the same repository, but have different provenance.</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Custodian </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Address </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Country </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Title </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Provenance The history of custody of the described materials since their creation, including any changes that successive custodians have made to them.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note The entire text of the note that describes the other materials. It may be used instead of the specific subfields for title of materials, custodian, and provenance.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="545">
-    <description>Biographical information about an individual or historical information about an institution or an event used as the main entry of the bibliographic record for the described materials. When a distinction between levels of detail is required, a brief summary is given in subfield $a and a fuller annotation is given in subfield $b.</description>
-    <indicator position="1" value="0">
-      <description>Biographical sketch</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Administrative history</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Biographical or historical note </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Expansion </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="546">
-    <description>Textual information on the language of the described materials. A description of the alphabet, script, or other symbol system (e.g., arabic alphabet, ASCII, musical notation system, bar code, logarithmic graphing) may also be included. Coded language information is contained in fields 008/35-37 (Language) and/or 041 (Language code).</description>
-    <subfield code="a" repeatable="false">
-      <description>Language note </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Information code or alphabet The name of the alphabet, script, or information code that is used to record the language.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="547">
-    <description>A description of the complex relationship between former titles proper whenever an intelligible note cannot be generated from the data in field 247 (Former Title).</description>
-    <subfield code="a" repeatable="false">
-      <description>Former title complexity note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="550">
-    <description>Information about the current and former issuing bodies of a continuing resource.</description>
-    <subfield code="a" repeatable="false">
-      <description>Issuing body note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="552">
-    <description>A description of the information content of the data set, including the entity types, their attributes, and the domains from which attribute values may be assigned.</description>
-    <subfield code="a" repeatable="false">
-      <description>Entity type label</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Entity type definition and source</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Attribute label</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Attribute definition and source </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Enumerated domain value </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Enumerated domain value definition and source</description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Range domain minimum and maximum</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Codeset name and source</description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Unrepresentable domain</description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Attribute units of measurement and resolution</description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Beginning date and ending date of attribute values</description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Attribute value accuracy</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Attribute value accuracy explanation </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Attribute measurement frequency </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Entity and attribute overview </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Entity and attribute detail citation </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Display noteA note that introduces the data in the field when needed.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="555">
-    <description>Information on the availability of cumulative indexes for continuing resources or finding aids and similar control materials for archival and manuscripts control and visual materials.</description>
-    <indicator position="1" value="0">
-      <description>Finding aidsFinding aids: may be generated for display.</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Cumulative index/finding aids note </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Availability source The organizational unit or vendor from which finding aids or other documentation may be obtained.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Degree of control The extent of administrative, bibliographic, or physical control available over the described materials.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Bibliographic reference A citation to a published or unpublished index or finding aid when it is not cataloged with the described item.</description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="556">
-    <description>Information about the documentation of a file, e.g., codebooks that explain the content and use of the file.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Information about documentation note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="561">
-    <description>A copy-specific field that contains information concerning the ownership and custodial history of the described materials from the time of their creation to the time of their accessioning, including the time at which individual items or group of items were first brought together in their current arrangement or collation.</description>
-    <indicator position="1" value="0">
-      <description>Private</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Not private</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>History </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="562">
-    <description>Information that distinguishes the copy or version of materials held by an archive or manuscript repository when more than one copy or version exists or could exist.</description>
-    <subfield code="a" repeatable="true">
-      <description>Identifying markings Markings on the support or imbedded in the medium that can be used to identify the copy of the described materials.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Copy identification Information that distinguishes one copy of the described materials from other copies.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Version identification Information that identifies a version that differs in content but is related across time to another version, e.g., an edition.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Presentation format The format in which the material was intended to be used, seen, or heard.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Number of copies </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="563">
-    <description>Intended primarily for use with antiquarian materials, rare books and other special collections.</description>
-    <subfield code="a" repeatable="false">
-      <description>Binding note </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example, a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="565">
-    <description>Information on the content, characteristics, and/or the number of cases or variables making up a case file or a database.</description>
-    <indicator position="1" value="0">
-      <description>Case file characteristics</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Number of cases/variables The number of cases or variables in a single case within a repetitive case file series.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Name of variable </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Unit of analysis The subject to which variables in case files or databases refer, e.g., workers in personnel records.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Universe of data The scope of the data collection effort and the specifications of the sample represented in the described materials.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Filing scheme or code Information that places the described materials in the context of a scheme or intellectual arrangement.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="567">
-    <description>Information on significant methodological characteristics of the material, such as the algorithm, sampling procedures, or validation characteristics.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Methodology note </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="580">
-    <description>A description of the complex relationship between the described item and other items when an intelligible note cannot be generated from data in the linking entry fields 760-787.</description>
-    <subfield code="a" repeatable="false">
-      <description>Linking entry complexity note The catalog entry for the related title and a statement describing the relationship.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="581">
-    <description>A citation to or information about a publication that is a study or analysis of the described materials.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Publications about described materials note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="583">
-    <description>Contains information about processing, reference, and preservation actions.</description>
-    <indicator position="1" value="0">
-      <description>Private</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Not private</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Action Standardized terminology descriptive of the action.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Action identification A code or designation that identifies a specific action or identifies it in conjunction with the time of action in subfield $c.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Time/date of action The concrete time or date of a future or past action.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Action interval A time period that cannot be expressed as a concrete time.</description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Contingency for action A time or time period expressed in terms of an unpredictable event, e.g., upon receipt.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Authorization The text of, or citation to, a statute, action order, report, rationale, or rule governing a particular action.</description>
-    </subfield>
-    <subfield code="h" repeatable="true">
-      <description>Jurisdiction The name of a person, an institution, or a position or function within the institution, in whom or which responsibility for an action is vested.</description>
-    </subfield>
-    <subfield code="i" repeatable="true">
-      <description>Method of action The means or technique by which an action is performed.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Site of action Includes the site at which the described materials are consulted by users.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Action agent The person or organization performing the action.</description>
-    </subfield>
-    <subfield code="l" repeatable="true">
-      <description>Status The condition or state of the described materials.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Extent The number of items involved.</description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Type of unit The name of the unit of measurement.</description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The Uniform Resource Identifier (URI), for example, a URL or URN, which provides electronic access data in a standard syntax. This data can be used for automated access to an electronic item using one of the Internet protocols.</description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Nonpublic note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of term A MARC code that identifies the source of the term used to record the action information. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="584">
-    <description>Information on the rates of accumulation (for continuing, open-ended accessions) and/or the rate of reference use of the described materials.</description>
-    <subfield code="a" repeatable="true">
-      <description>Accumulation The rate of accumulation expressed as a ratio of volume to time period.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Frequency of use A measure of reference activity, usually expressed as a ratio of number of retrievals to time period.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="585">
-    <description>A copy-specific field that contains a citation to an exhibition where the described materials have been shown.</description>
-    <subfield code="a" repeatable="false">
-      <description>Exhibitions note </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="586">
-    <description>Information on awards associated with the described item.</description>
-    <indicator position="1" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Awards note </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="600">
-    <description>A subject added entry in which the entry element is a personal name.</description>
-    <indicator position="1" value="0">
-      <description>Forename</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Surname</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Family name</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Personal name </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Numeration </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Titles and other words associated with a name </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Dates associated with a name </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Attribution qualifierAttribution information for names when the responsibility is unknown, uncertain, fictitious, or pseudonymous.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Fuller form of name </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $a, $b, $d, $e, $f, $g, $l, $n, $p, $q, $t, $u, and $4 under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="610">
-    <description>A subject added entry in which the entry element is a corporate name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Corporate name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of meeting or treaty signing </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $e, $f, $l, $p, $t, $u and $4 under field 100 and subfields $a, $b, $c, $d, $g, and $n under field 110 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="611">
-    <description>A subject added entry in which the entry element is a meeting name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Meeting name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of meeting </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Name of meeting following jurisdiction name entry element </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $f, $g, $l, $p, $t, $u, and $4 under field 100 ; subfields $c and $n under field 110 and subfields $a, $e, and $q under field 111 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="630">
-    <description>A subject added entry in which the entry element is a uniform title.</description>
-    <indicator position="1" value="0-9">
-      <description>Number of nonfiling charactersA value that indicates the number of character positions associated with an initial definite or indefinite article at the beginning of a uniform title field that are to be disregarded in sorting and filing processes.</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work The title-page title of an item.</description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $f, $g, $l, $n, and $p under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="648">
-    <description>A subject added entry in which the entry element is a chronological term.</description>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Chronological term </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="650">
-    <description>A subject added entry in which the entry element is a topical term.</description>
-    <indicator position="1" value="0">
-      <description>No level specifiedThe level of the term could be determined but is not specified.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>PrimaryThe term describes the main focus or subject content of the material.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>SecondaryThe subject term describes a less important aspect of the content of the material.</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Topical term or geographic name entry element </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Topical term following geographic name entry element </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of event </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Active dates The time period during which an event occurred.</description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Relator term A term that describes the relationship between the topical heading and the described materials.</description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="651">
-    <description>A subject added entry in which the entry element is a geographic name.</description>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject added entry conforms to the NLM authority files.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Geographic name </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="653">
-    <description>An index term added entry that is not constructed by standard subject heading/thesaurus-building conventions.</description>
-    <indicator position="1" value="0">
-      <description>No level specifiedThe level of the term could be determined but is not specified.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>PrimaryThe term describes the main focus or subject content of the material.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>SecondaryThe subject term describes a less important aspect of the content of the material.</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Uncontrolled term </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="654">
-    <description>A topical subject constructed from a faceted vocabulary.</description>
-    <indicator position="1" value="0">
-      <description>No level specifiedThe level of the term could be determined but is not specified.</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>PrimaryThe term describes the main focus or subject content of the material.</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>SecondaryThe subject term describes a less important aspect of the content of the material.</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Focus term </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Non-focus term A term other than that considered the focus.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Facet/hierarchy designation The designation used by the thesaurus specified by the MARC code contained in subfield $2 to identify the facet/hierarchy for each term contained in subfields $a and $b.</description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of heading or term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="655">
-    <description>Terms indicating the genre, form, and/or physical characteristics of the materials being described. A genre term designates the style or technique of the intellectual content of textual materials or, for graphic materials, aspects such as vantage point, intended purpose, or method of representation. A form term designates historically and functionally specific kinds of materials distinguished by their physical character, the subject of their intellectual content, or the order of information within them. Physical characteristic terms designate historically and functionally specific kinds of materials as distinguished by an examination of their physical character, subject of their intellectual content, or the order of information with them.</description>
-    <indicator position="1" value="0">
-      <description>Faceted</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Library of Congress Subject HeadingsThe subject index term conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH).</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>LC subject headings for children's literatureThe subject index term conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Medical Subject HeadingsThe subject index term conforms to the NLM subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>National Agricultural Library subject authority fileThe subject added entry conforms to the NAL subject authority file.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Source not specifiedThe subject index term conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Canadian Subject HeadingsThe subject index term conforms to and is appropriate for use in the Canadian Subject Headings that is maintained by the National Library of Canada.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;reThe subject index term conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re.</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Genre/form data or focus term </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Non-focus term </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Facet/hierarchy designation </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="656">
-    <description>An index term that is descriptive of the occupation reflected in the contents of the described materials.</description>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Occupation </description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Form </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="657">
-    <description>An index term that is descriptive of the activity or function that generated the described materials.</description>
-    <indicator position="2" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Function </description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Form subdivision </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>General subdivision </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Chronological subdivision </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Geographic subdivision </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of term Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="658">
-    <description>Index terms denoting curriculum or course-of-study objectives applicable to the content of the described materials. The field may also contain correlation factors indicating the degree to which the described materials meet an objective. Codes assigned to specific objectives in published lists are also recorded in this field.</description>
-    <subfield code="a" repeatable="false">
-      <description>Main curriculum objective </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Subordinate curriculum objective </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Curriculum code A coded representation of the curriculum objective recorded in subfield $a.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Correlation factor A statement that identifies the degree to which the described materials correlate to the curriculum objective recorded in the field.</description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of term or code Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="700">
-    <description>An added entry in which the entry element is a personal name.</description>
-    <indicator position="1" value="0">
-      <description>Forename</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Surname</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Family name</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Analytical entryThe item represented by the added entry is contained in the item described by the bibliographic record.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Personal name </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Numeration </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Titles and other words associated with a name </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Dates associated with a name </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Attribution qualifier Attribution information for names when the responsibility is unknown, uncertain, fictitious or pseudonymous.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Fuller form of name </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number The initialism ISSN is not carried in the MARC record; it may be generated for display.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $a, $b, $d, $e, $f, $g, $l, $n, $p, $q, $t, $u, and $4 under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="710">
-    <description>An added entry in which the entry element is a corporate name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Analytical entryThe item represented by the added entry is contained in the item described by the bibliographic record.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Corporate name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of meeting or treaty signing </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number The initialism ISSN is not carried in the MARC record; it may be generated for display.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $e, $f, $l, $p, $t, $u, and $4 under field 100 and subfields $a, $b, $c, $d, $g, and $n under field 110 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="711">
-    <description>An added entry in which the entry element is a meeting name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Analytical entryThe item represented by the added entry is contained in the item described by the bibliographic record.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Meeting name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of meeting </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Name of meeting following jurisdiction name entry element </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number The initialism ISSN is not carried in the MARC record; it may be generated for display.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $g, $l, $p, $t, $u and $4 under field 100 ; subfields $c and $n under field 110 and subfields $a, $e, and $q under field 111 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="720">
-    <description>An added entry in which the name is not controlled in an authority file or list. It is also used for names that have not been formulated according to cataloging rules. Names may be of any type (e.g., personal, corporate, meeting).</description>
-    <indicator position="1" value="1">
-      <description>Personal</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Other</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Name </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term A term that describes the relationship between a name and a work.</description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="730">
-    <description>Contains a related or an analytical title that is controlled by an authority file or list.</description>
-    <indicator position="1" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Analytical entryThe item represented by the added entry is contained in the item described by the bibliographic record.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number The initialism ISSN is not carried in the MARC record; it may be generated for display.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $f, $g, $l, $n, and $p under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="740">
-    <description>Contains related or analytical titles that are not controlled through an authority file or list. (If related or analytical titles are controlled by an authority file, use field 730 (Added entry - uniform title)).</description>
-    <indicator position="1" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Analytical entryThe item represented by the added entry is contained in the item described by the bibliographic record.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uncontrolled related/analytical title </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work A number designation for a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work A name designation of a part or section of a work used with a title in a name/title field.</description>
-    </subfield>
-    <subfield code="5" repeatable="false">
-      <description>Institution to which field applies  See Control Subfields</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="752">
-    <description>An added entry in which the entry element is a hierarchical form of place name that is related to a particular attribute of the described item, e.g., the place of publication for a rare book. For display, a dash (--) may be generated to separate the subelements of the place name, e.g., Canada -- British Columbia -- Vancouver.</description>
-    <subfield code="a" repeatable="false">
-      <description>Country </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>State, province, territory </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>County, region, islands area </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>City </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="753">
-    <description>Information on the technical aspects of a computer file and any accompanying material that may be used to select and arrange the record with other records in a printed index.</description>
-    <subfield code="a" repeatable="false">
-      <description>Make and model of machine </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Programming language </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Operating system </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="754">
-    <description>An added entry in which the entry element is the taxonomic name or category associated with the described item.</description>
-    <subfield code="a" repeatable="true">
-      <description>Taxonomic name </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Taxonomic category </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Common or alternative name </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Non-public note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of taxonomic identification Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="760">
-    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Main entry heading The main entry heading from the 100 (Main Entry Personal Name), 110 (Main Entry Corporate Name), 111 (Main Entry Meeting Name), or 130 (Main Entry Uniform Title) field of the related record.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Edition The name of the edition from field 250 (Edition Statement) of the related record.</description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information The parenthetical qualifying information from subfield $b (Qualifying information) of field 222 (Key Title) or other data needed to distinguish between two titles.</description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication Publication information from subfields $a, $b, and/or $c of field 260 (Publication, Distribution, etc. (Imprint)) of the related record.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information Data that indicates the specific piece or pieces of the related item that are involved in the relationship with the target item, such as dates and volumes. The relationship information includes the location of a component part in a target item.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title The title from field 240 (Uniform Title) or field 243 (Collective Uniform Title) of the related record.</description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title The title from subfields $a, $n, and $p of field 245 (Title Statement) or subfield $a of field 222 (Key Title) of the related record.</description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number The system control number of the related record preceded by the MARC code, enclosed in parentheses, for the agency to which the control number applies.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number The ISSN for a serial title from field 022 (International Standard Serial Number) in the related record. The initialism ISSN may be generated for display.</description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation The CODEN designation from field 030 (CODEN Designation) in the related record. The acronym CODEN may be generated for display.</description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="762">
-    <description>Information concerning a related subseries when the target item is a main series or a parent subseries (vertical relationship). When a note is generated from this field, the introductory phrase Has subseries: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="765">
-    <description>Information concerning the publication in its original language when the target item is a translation (horizontal relationship). When a note is generated from this field, the introductory phrase Translation of: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number The report number from field 088 (Report Number) of the related record.</description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number The STRN from field 027 (Standard Technical Report Number) of the related record. The initialism STRN: may be generated for display.</description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="767">
-    <description>Information concerning the publication in some other language other than the original when the target item is in the original language or is another translation (horizontal relationship). When a note is generated from this field, the introductory phrase Translated as: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number The report number from field 088 (Report Number) of related record.</description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number The STRN from field 027 (Standard Technical Report Number) of the related record. The initialism ISBN may be generated for display.</description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="770">
-    <description>Information concerning the supplement or special issue associated with the target item but cataloged and/or input as a separate record (vertical relationship). When a note is generated from this field, the introductory phrase Has supplement: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="772">
-    <description>Information concerning the related parent record when the target item is a single issue, supplement or special issue (vertical relationship) of the parent item. When a note is generated from this field, the introductory phrase Supplement to: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Parent</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="773">
-    <description>Information concerning the host item for the constituent unit described in the record (vertical relationship). In the case of host items that are serial or multi-volume in nature, information in subfields $g and $q is necessary to point to the exact location of the component part within the bibliographic item.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Abbreviated title The abbreviated title from field 210 (Abbreviated Title) of the related record.</description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Enumeration and first page </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="774">
-    <description>Information concerning a constituent unit associated with a larger bibliographic unit (vertical relationship). When a note is generated from this field, the introductory term Constituent unit: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="775">
-    <description>The entry for another available edition of the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Other editions available: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="e" repeatable="false">
-      <description>Language code The language code from field 008/35-37 (Language) of the related record.</description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Country code The country code from field 008/15-17 (Place of publication, production, or execution) of the related record.</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="776">
-    <description>Information concerning another available physical form of the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Available in other form: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="777">
-    <description>Information concerning the publication that is separately cataloged but that is issued with or included in the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Issued with: may be generated based on the field tag for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="780">
-    <description>Information concerning the immediate predecessor of the target item (chronological relationship). When a note is generated from this field, the introductory term or phrase may be generated based on the value in the second indicator position for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>ContinuesContinues: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Continues in partContinues in part: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>SupersedesSupersedes: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>Supersedes in partSupersedes in part: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Formed by the union of... and ...Formed by the union:... and ... may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>AbsorbedAbsorbed: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>Absorbed in partAbsorbed in part: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Separated fromSeparated from: may be generated for display.</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="785">
-    <description>Information concerning the immediate successor to the target item (chronological relationship). When a note is generated from this field, the introductory phrase may be generated based on the value in the second indicator position for display.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Continued byContinued by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Continued in part byContinued in part by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Superseded bySuperseded by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="3">
-      <description>Superseded in part bySuperseded in part by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="4">
-      <description>Absorbed byAbsorbed by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="5">
-      <description>Absorbed in part byAbsorbed in part by: may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="6">
-      <description>Split into... and...Split into:... and... may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="7">
-      <description>Merged with... to form ...Merged with:... to form... may be generated for display.</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>Changed back toChanged back to: may be generated for display.</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="786">
-    <description>Information pertaining to a data source to which the described item is related. It may contain information about other files, printed sources, or collection procedures.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Period of content The beginning, and if appropriate, the ending date(s) of the related item. The information is recorded according to Representation of Dates and Times (ISO 8601)</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Abbreviated title The abbreviated title from field 210 (Abbreviated Title) of the related record.</description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Source Contribution </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="787">
-    <description>Information concerning the work related to the target item when the relationship does not fit any of those defined in fields 760-785.</description>
-    <indicator position="1" value="0">
-      <description>Display note</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Do not display noteA textual note is contained in field 580 (Linking Entry Complexity Note).</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="b" repeatable="false">
-      <description>Edition </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Qualifying information </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Place, publisher, and date of publication </description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Relationship information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Physical description </description>
-    </subfield>
-    <subfield code="i" repeatable="false">
-      <description>Display text </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Series data for related item The series entry from the 4XX (Series Statement) or 8XX (Series Added Entry) of the related record.</description>
-    </subfield>
-    <subfield code="m" repeatable="false">
-      <description>Material-specific details </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Note </description>
-    </subfield>
-    <subfield code="o" repeatable="true">
-      <description>Other item identifier </description>
-    </subfield>
-    <subfield code="r" repeatable="true">
-      <description>Report number </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Standard Technical Report Number </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="false">
-      <description>International Standard Serial Number </description>
-    </subfield>
-    <subfield code="y" repeatable="false">
-      <description>CODEN designation </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>International Standard Book Number </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="7" repeatable="false">
-      <description>Control subfield See the description of subfield $7 under field 760./0 - Type of main entry heading</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="800">
-    <description>An author/title series added entry in which the author portion is a personal name.</description>
-    <indicator position="1" value="0">
-      <description>Forename</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Surname</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Family name</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Personal name </description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Numeration </description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Titles and other words associated with a name </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Dates associated with a name </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="j" repeatable="true">
-      <description>Attribution qualifier Attribution information for names when the responsibility is unknown, uncertain, fictitious, or pseudonymous.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Fuller form of name </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Volume/sequential designation </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $a, $b, $d, $e, $f, $g, $l, $n, $p, $t, $u, and $4 under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="810">
-    <description>An author/title series added entry in which the author portion is a corporate name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Corporate name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of meeting or treaty signing </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Relator term </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Volume/sequential designation </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $e, $f, $l, $p, $t, $u, and $4 under field 100 and subfields $a, $b, $c, $d, $g, and $n under field 110 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="811">
-    <description>An author/title series added entry in which the author portion is a meeting name.</description>
-    <indicator position="1" value="0">
-      <description>Inverted name</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Jurisdiction name</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Name in direct order</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Meeting name or jurisdiction name as entry element </description>
-    </subfield>
-    <subfield code="c" repeatable="false">
-      <description>Location of meeting </description>
-    </subfield>
-    <subfield code="d" repeatable="false">
-      <description>Date of meeting </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Subordinate unit </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section/meeting </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Name of meeting following jurisdiction name entry element </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work </description>
-    </subfield>
-    <subfield code="u" repeatable="false">
-      <description>Affiliation </description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Volume/sequential designation </description>
-    </subfield>
-    <subfield code="4" repeatable="true">
-      <description>Relator code </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $f, $g, $l, $p, $t, $u, and $4 under field 100 ; subfields $c and $n under field 110 and subfields $a, $e, and $q under field 111 .</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="830">
-    <description>A series added entry consisting of a series title alone.</description>
-    <indicator position="2" value="0-9">
-      <description>Number of nonfiling characters</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Uniform title </description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Date of treaty signing </description>
-    </subfield>
-    <subfield code="f" repeatable="false">
-      <description>Date of a work </description>
-    </subfield>
-    <subfield code="g" repeatable="false">
-      <description>Miscellaneous information </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Medium A media qualifier.</description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Form subheading </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Language of a work </description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Medium of performance for music </description>
-    </subfield>
-    <subfield code="n" repeatable="true">
-      <description>Number of part/section of a work </description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Arranged statement for music </description>
-    </subfield>
-    <subfield code="p" repeatable="true">
-      <description>Name of part/section of a work </description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Key for music </description>
-    </subfield>
-    <subfield code="s" repeatable="false">
-      <description>Version </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Title of a work A title-page title of a work.</description>
-    </subfield>
-    <subfield code="v" repeatable="false">
-      <description>Volume/sequential designation </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control SubfieldsSee the descriptions of subfields $f, $g, $l, $n, and $p under field 100 .</description>
-    </subfield>
-  </field>
-  <field repeatable="false" tag="841">
-    <description>[Described in full under field 841 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="false" tag="842">
-    <description>[Described in full under field 842 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="843">
-    <description>[Described in full under field 843 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="false" tag="844">
-    <description>[Described in full under field 844 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="845">
-    <description>[Described in full under field 845 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="850">
-    <description>Information concerning holdings of the described item by the specified institution.</description>
-    <subfield code="a" repeatable="true">
-      <description>Holding institution The MARC code of the organization that holds a copy of the item.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="852">
-    <description>Identifies the organization holding the item or from which it is available. May also contain detailed information about how to locate the item in a collection.</description>
-    <indicator position="1" value="0">
-      <description>Library of Congress classification</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Dewey Decimal classification</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>National Library of Medicine classification</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Superintendent of Documents classification</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>Shelving control number</description>
-    </indicator>
-    <indicator position="1" value="5">
-      <description>TitleIndicates that the item is shelved by a title. If necessary, this title is contained in subfield $l (Shelving form of title).</description>
-    </indicator>
-    <indicator position="1" value="6">
-      <description>Shelved separately</description>
-    </indicator>
-    <indicator position="1" value="7">
-      <description>Source specified in subfield $2</description>
-    </indicator>
-    <indicator position="1" value="8">
-      <description>Other scheme</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>Not enumeration</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Primary enumerationThis value is also used when only one numbering scheme is applicable.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Alternative enumerationItem carries two numbering schemes and is shelved by the secondary scheme.</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Location The institution or person holding the item or from which access is given. Contains a MARC code for the organization or the name of the institution or person holding the item.See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Sublocation or collection The specific department, library, collection, etc., within the holding organization in which the item is located or from which it is available.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Shelving location </description>
-    </subfield>
-    <subfield code="e" repeatable="true">
-      <description>Address Street address, city, state, zip code, and country information for the current physical location of the item.</description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Coded location qualifier A two- or three-character code that identifies the specific issues of the item that are located apart from the main holdings of the same item. Subfield $f immediately follows the subfield $a, $b, or $c being qualified.Qualifier type</description>
-    </subfield>
-    <subfield code="g" repeatable="true">
-      <description>Non-coded location qualifier Free text that is used when the codes in subfield $f are inadequate for describing the unit that is located apart from the main holdings of the same item. Subfield $g immediately follows the subfield $a, $b, or $c being qualified.</description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Classification part </description>
-    </subfield>
-    <subfield code="i" repeatable="true">
-      <description>Item part </description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Shelving control number </description>
-    </subfield>
-    <subfield code="k" repeatable="true">
-      <description>Call number prefix </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Shelving form of title The shelving title of an unclassified item that is shelved by title.</description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Call number suffix </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Country code A two- or three-character MARC code for the principal location contained in subfield $a. Code from: MARC Code List for Countries</description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Piece designation An identification of a single piece when the holdings information does not contain a field 863-865 (Enumeration and Chronology) or 876-878 (Item Information) that contains a subfield $p (Piece designation).</description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Piece physical condition A description of any unusual characteristic of the physical condition of the piece when the information does not contain a field 863-865 (Enumeration and Chronology) or 876-878 (Item Information) that contains a subfield $q (Piece physical condition).</description>
-    </subfield>
-    <subfield code="s" repeatable="true">
-      <description>Copyright article-fee code </description>
-    </subfield>
-    <subfield code="t" repeatable="false">
-      <description>Copy number A copy number or a range of numbers for copies that have the same location and call number when the holdings information does not contain an 863-865 Enumeration and Chronology field that contains subfield $t (Copy number).</description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Nonpublic note </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of classification or shelving scheme Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="false">
-      <description>Sequence number To sequence related holdings records, see field 852, subfield $8 in the MARC 21 Format for Holdings Data</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="853">
-    <description>[Described in full under field 853 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="854">
-    <description>[Described in full under field 854 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="855">
-    <description>[Described in full under field 855 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="856">
-    <description>The information needed to locate and access an electronic resource. The field may be used in a bibliographic record for a resource when that resource or a subset of it is available electronically. In addition, it may be used to locate and access an electronic version of a non-electronic resource described in the bibliographic record or a related electronic resource.</description>
-    <indicator position="1" value="0">
-      <description>EmailIndicates that access is through the Mail Transfer Protocol (MAILTP).</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>FTP</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Remote login (Telnet)</description>
-    </indicator>
-    <indicator position="1" value="3">
-      <description>Dial-upIndicates that access to the electronic resource is through a conventional telephone line.</description>
-    </indicator>
-    <indicator position="1" value="4">
-      <description>HTTPIndicates that access to the electronic resource is through the Hypertext Transfer Protocol.</description>
-    </indicator>
-    <indicator position="1" value="7">
-      <description>Method specified in subfield $2</description>
-    </indicator>
-    <indicator position="2" value="0">
-      <description>ResourceIndicates that the electronic location in field 856 is for the same resource described by the record as a whole. In this case, the item represented by the bibliographic record is an electronic resource. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
-    </indicator>
-    <indicator position="2" value="1">
-      <description>Version of resourceIndicates that the location in field 856 is for an electronic version of the resource described by the record. In this case, the item represented by the bibliographic record is not electronic but an electronic version is available. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
-    </indicator>
-    <indicator position="2" value="2">
-      <description>Related resourceIndicates that the location in field 856 is for an electronic resource that is related to the item described by the record. In this case, the item represented by the bibliographic record is not the electronic resource itself. Subfield $3 can be used to further characterize the relationship between the electronic item identified in field 856 and the item represented by the bibliographic record as a whole.</description>
-    </indicator>
-    <indicator position="2" value="8">
-      <description>No display constant generated</description>
-    </indicator>
-    <subfield code="a" repeatable="true">
-      <description>Host name The fully qualified domain (host name) of the electronic location. It contains a network address which is repeated if there is more than one address for the same host.</description>
-    </subfield>
-    <subfield code="b" repeatable="true">
-      <description>Access number The access number associated with a host. It can contain the Internet Protocol (IP) numeric address if the item is an Internet resource, or a telephone number if dial-up access is provided through a telephone line. This data may change frequently and may be generated by the system, rather than statically stored.</description>
-    </subfield>
-    <subfield code="c" repeatable="true">
-      <description>Compression information Information about the compression of a file, in particular, whether a specific program is required to decompress the file.</description>
-    </subfield>
-    <subfield code="d" repeatable="true">
-      <description>Path </description>
-    </subfield>
-    <subfield code="f" repeatable="true">
-      <description>Electronic name </description>
-    </subfield>
-    <subfield code="h" repeatable="false">
-      <description>Processor of request The username, or processor of the request; generally the data which precedes the "@" in the host address.</description>
-    </subfield>
-    <subfield code="i" repeatable="true">
-      <description>Instruction An instruction needed for the remote host to process a request.</description>
-    </subfield>
-    <subfield code="j" repeatable="false">
-      <description>Bits per second </description>
-    </subfield>
-    <subfield code="k" repeatable="false">
-      <description>Password </description>
-    </subfield>
-    <subfield code="l" repeatable="false">
-      <description>Logon Characters needed to connect (i.e., logon, login, etc.) to an electronic resource or FTP site. This subfield is used to record general-use logon strings which do not require special security.</description>
-    </subfield>
-    <subfield code="m" repeatable="true">
-      <description>Contact for access assistance </description>
-    </subfield>
-    <subfield code="n" repeatable="false">
-      <description>Name of location of host The full name of the location of the host in subfield $a, including its geographical location.</description>
-    </subfield>
-    <subfield code="o" repeatable="false">
-      <description>Operating system </description>
-    </subfield>
-    <subfield code="p" repeatable="false">
-      <description>Port The portion of the address that identifies the process or service in the host.</description>
-    </subfield>
-    <subfield code="q" repeatable="false">
-      <description>Electronic format type An identification of the electronic format type, which is the data representation of the resource, such as text/HTML, ASCII, Postscript file, executable application, or JPEG image. Electronic format type may be taken from enumerated lists such as registered Internet Media Types (MIME types).</description>
-    </subfield>
-    <subfield code="r" repeatable="false">
-      <description>Settings </description>
-    </subfield>
-    <subfield code="s" repeatable="true">
-      <description>File size </description>
-    </subfield>
-    <subfield code="t" repeatable="true">
-      <description>Terminal emulation </description>
-    </subfield>
-    <subfield code="u" repeatable="true">
-      <description>Uniform Resource Identifier The URI, which provides standard syntax for locating an object using existing Internet protocols. Field 856 is structured to allow for the creation of a URL from the concatenation of other separate 856 subfields. Subfield $u may be used instead of those separate subfields or in addition to them.Subfield $u may be repeated only if both a URN or a URL or more than one URN are recorded.</description>
-    </subfield>
-    <subfield code="v" repeatable="true">
-      <description>Hours access method available </description>
-    </subfield>
-    <subfield code="w" repeatable="true">
-      <description>Record control number </description>
-    </subfield>
-    <subfield code="x" repeatable="true">
-      <description>Nonpublic note </description>
-    </subfield>
-    <subfield code="y" repeatable="true">
-      <description>Link text </description>
-    </subfield>
-    <subfield code="z" repeatable="true">
-      <description>Public note </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Access method The access method when the first indicator position contains value 7.</description>
-    </subfield>
-    <subfield code="3" repeatable="false">
-      <description>Materials specified </description>
-    </subfield>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-    <subfield code="8" repeatable="true">
-      <description>Field link and sequence number  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="863">
-    <description>[Described in full under field 863 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="864">
-    <description>[Described in full under field 864 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="865">
-    <description>[Described in full under field 865 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="866">
-    <description>[Described in full under field 866 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="867">
-    <description>[Described in full under field 867 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="868">
-    <description>[Described in full under field 868 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="876">
-    <description>[Described in full under field 876 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="877">
-    <description>[Described in full under field 877 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="878">
-    <description>[Described in full under field 878 in the MARC 21 Concise Format for Holdings Data.]</description>
-  </field>
-  <field repeatable="true" tag="880">
-    <description>The fully content-designated representation, in a different script, of another field in the same record. Field 880 is linked to the associated regular field by subfield $6 (Linkage). The first and second indicator positions in field 880 have the same definition and values as the indicators in the associated field. The subfield codes in field 880 are the same as those defined in the associated field except for subfield $6. The data in field 880 may be in more than one script.</description>
-    <subfield code="6" repeatable="false">
-      <description>Linkage  See Control Subfields</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="886">
-    <description>Used when converting foreign MARC records into the MARC format. Contains data from a foreign MARC record for which there is no corresponding MARC field.</description>
-    <indicator position="1" value="0">
-      <description>Leader</description>
-    </indicator>
-    <indicator position="1" value="1">
-      <description>Variable control fields (002-009)</description>
-    </indicator>
-    <indicator position="1" value="2">
-      <description>Variable data fields (010-999)</description>
-    </indicator>
-    <subfield code="a" repeatable="false">
-      <description>Tag of the foreign MARC field Subfield $a is not present when the first indicator value is 0 (Leader). When it is present, subfield $a is the second subfield in the field.</description>
-    </subfield>
-    <subfield code="b" repeatable="false">
-      <description>Content of the foreign MARC field </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of data Contains the MARC code for the foreign MARC format from which the record is converted. Must be first subfield in the field. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-  </field>
-  <field repeatable="true" tag="887">
-    <description>Contains data from non-MARC records for which there are no corresponding MARC 21 fields. Used when converting non-MARC records into the MARC 21 format.</description>
-    <subfield code="a" repeatable="false">
-      <description>Content of non-MARC field </description>
-    </subfield>
-    <subfield code="2" repeatable="false">
-      <description>Source of data Contains the source of the data, either a schema or DTD reference. Code from: MARC Code Lists for Relators, Sources, Description Conventions</description>
-    </subfield>
-  </field>
-</fields>
index 4cc5ac0..6bd9c2d 100644 (file)
@@ -94,3 +94,4 @@ grid#leaderGrid[type="COM"] *[set~="COM"], grid#leaderGrid[type="COM"] *[set~="C
        visibility: visible;
 }
 
+grid[name="-none-"] * label { color: black; }
index 49d87c9..b391763 100644 (file)
@@ -1,3 +1,4 @@
+// vim: noet:sw=4:ts=4:
 var xmlDeclaration = /^<\?xml version[^>]+?>/;
 
 var serializer = new XMLSerializer();
@@ -13,6 +14,12 @@ var bib_data;
 
 var xml_record;
 
+var context_menus;
+var tag_menu;
+var p;
+
+function $(id) { return document.getElementById(id); }
+
 function mangle_005() {
        var now = new Date();
        var y = now.getUTCFullYear();
@@ -80,7 +87,7 @@ function my_init() {
                        window.xulG.record = {};
                        window.xulG.save = {};
 
-                       window.xulG.save.label = 'Save Record';
+                       window.xulG.save.label = $('catStrings').getString('staff.cat.marcedit.save.label');
                        window.xulG.save.func = function (r) { alert(r); }
 
                        var cgi = new CGI();
@@ -111,7 +118,94 @@ function my_init() {
 
                // Get the tooltip xml all async like
                req =  new XMLHttpRequest();
-               req.open('GET','marcedit-tooltips.xml',true);
+
+               // Set a default locale in case preferences fail us
+               var locale = "en-US";
+
+               // Try to get the locale from our preferences
+               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+        try {
+            const Cc = Components.classes;
+            const Ci = Components.interfaces;
+            locale = Cc["@mozilla.org/preferences-service;1"].
+                               getService(Ci.nsIPrefBranch).
+                               getCharPref("general.useragent.locale");
+        }
+               catch (e) { }
+
+               // Get the locale-specific tooltips
+               // TODO: We should send a HEAD request to check for the existence of the desired file
+               // then fall back to the default locale if preferred locale is not necessary
+               req.open('GET','/xul/server/locale/' + locale + '/marcedit-tooltips.xml',true);
+
+               context_menus = createComplexXULElement('popupset');
+               document.documentElement.appendChild( context_menus );
+
+               tag_menu = createPopup({position : 'after_start', id : 'tags_popup'});
+               context_menus.appendChild( tag_menu );
+
+               tag_menu.appendChild(
+                       createMenuitem(
+                               { label : $('catStrings').getString('staff.cat.marcedit.add_row.label'),
+                                 oncommand : 
+                                       'var e = document.createEvent("KeyEvents");' +
+                                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,13,0);' +
+                                       'current_focus.inputField.dispatchEvent(e);'
+                                }
+                       )
+               );
+
+               tag_menu.appendChild(
+                       createMenuitem(
+                               { label : $('catStrings').getString('staff.cat.marcedit.remove_row.label'),
+                                 oncommand : 
+                                       'var e = document.createEvent("KeyEvents");' +
+                                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,46,0);' +
+                                       'current_focus.inputField.dispatchEvent(e);'
+                               }
+                       )
+               );
+
+               tag_menu.appendChild( createComplexXULElement( 'separator' ) );
+
+               tag_menu.appendChild(
+                       createMenuitem(
+                               { label : $('catStrings').getString('staff.cat.marcedit.replace_006.label'),
+                                 oncommand : 
+                                       'var e = document.createEvent("KeyEvents");' +
+                                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,64,0);' +
+                                       'current_focus.inputField.dispatchEvent(e);'
+                                }
+                       )
+               );
+
+               tag_menu.appendChild(
+                       createMenuitem(
+                               { label : $('catStrings').getString('staff.cat.marcedit.replace_007.label'),
+                                 oncommand : 
+                                       'var e = document.createEvent("KeyEvents");' +
+                                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,65,0);' +
+                                       'current_focus.inputField.dispatchEvent(e);'
+                               }
+                       )
+               );
+
+               tag_menu.appendChild(
+                       createMenuitem(
+                               { label : $('catStrings').getString('staff.cat.marcedit.replace_008.label'),
+                                 oncommand : 
+                                       'var e = document.createEvent("KeyEvents");' +
+                                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,66,0);' +
+                                       'current_focus.inputField.dispatchEvent(e);'
+                               }
+                       )
+               );
+
+               tag_menu.appendChild( createComplexXULElement( 'separator' ) );
+
+               p = createComplexXULElement('popupset');
+               document.documentElement.appendChild( p );
+
                req.onreadystatechange = function () {
                        if (req.readyState == 4) {
                                bib_data = new XML( req.responseText.replace(xmlDeclaration, '') );
@@ -121,6 +215,8 @@ function my_init() {
                req.send(null);
 
                loadRecord(xml_record);
+
+
        } catch(E) {
                alert('FIXME, MARC Editor, my_init: ' + E);
        }
@@ -433,44 +529,44 @@ var ff_pos = {
        TrAr : {
                _8 : {
                        SCO : {start : 33, len : 1, def : ' ' },
-                       REC : {start : 33, len : 1, def : 'n' },
+                       REC : {start : 33, len : 1, def : 'n' }
                },
                _6 : {
                        SCO : {start : 16, len : 1, def : ' ' },
-                       REC : {start : 16, len : 1, def : 'n' },
-               },
+                       REC : {start : 16, len : 1, def : 'n' }
+               }
        },
        TMat : {
                _8 : {
-                       VIS : {start : 33, len : 1, def : ' ' },
+                       VIS : {start : 33, len : 1, def : ' ' }
                },
                _6 : {
-                       VIS : {start : 16, len : 1, def : ' ' },
+                       VIS : {start : 16, len : 1, def : ' ' }
                },
        },
        Time : {
                _8 : {
-                       VIS : {start : 18, len : 3, def : ' ' },
+                       VIS : {start : 18, len : 3, def : ' ' }
                },
                _6 : {
-                       VIS : {start : 1, len : 3, def : ' ' },
-               },
+                       VIS : {start : 1, len : 3, def : ' ' }
+               }
        },
        Tech : {
                _8 : {
-                       VIS : {start : 34, len : 1, def : 'n' },
+                       VIS : {start : 34, len : 1, def : 'n' }
                },
                _6 : {
-                       VIS : {start : 17, len : 1, def : 'n' },
-               },
+                       VIS : {start : 17, len : 1, def : 'n' }
+               }
        },
        SrTp : {
                _8 : {
-                       SER : {start : 21, len : 1, def : ' ' },
+                       SER : {start : 21, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 4, len : 1, def : ' ' },
-               },
+                       SER : {start : 4, len : 1, def : ' ' }
+               }
        },
        Srce : {
                _8 : {
@@ -481,130 +577,130 @@ var ff_pos = {
                        MAP : {start : 39, len : 1, def : 'd' },
                        SCO : {start : 39, len : 1, def : 'd' },
                        REC : {start : 39, len : 1, def : 'd' },
-                       COM : {start : 39, len : 1, def : 'd' },
+                       COM : {start : 39, len : 1, def : 'd' }
                }
        },
        SpFm : {
                _8 : {
-                       MAP : {start : 33, len : 2, def : ' ' },
+                       MAP : {start : 33, len : 2, def : ' ' }
                },
                _6 : {
-                       MAP : {start : 16, len : 2, def : ' ' },
+                       MAP : {start : 16, len : 2, def : ' ' }
                },
        },
        Relf : {
                _8 : {
-                       MAP : {start : 18, len : 4, def : ' ' },
+                       MAP : {start : 18, len : 4, def : ' ' }
                },
                _6 : {
-                       MAP : {start : 1, len : 4, def : ' ' },
-               },
+                       MAP : {start : 1, len : 4, def : ' ' }
+               }
        },
        Regl : {
                _8 : {
-                       SER : {start : 19, len : 1, def : ' ' },
+                       SER : {start : 19, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 2, len : 1, def : ' ' },
-               },
+                       SER : {start : 2, len : 1, def : ' ' }
+               }
        },
        Proj : {
                _8 : {
-                       MAP : {start : 22, len : 2, def : ' ' },
+                       MAP : {start : 22, len : 2, def : ' ' }
                },
                _6 : {
-                       MAP : {start : 5, len : 2, def : ' ' },
-               },
+                       MAP : {start : 5, len : 2, def : ' ' }
+               }
        },
        Part : {
                _8 : {
                        SCO : {start : 21, len : 1, def : ' ' },
-                       REC : {start : 21, len : 1, def : 'n' },
+                       REC : {start : 21, len : 1, def : 'n' }
                },
                _6 : {
                        SCO : {start : 4, len : 1, def : ' ' },
-                       REC : {start : 4, len : 1, def : 'n' },
-               },
+                       REC : {start : 4, len : 1, def : 'n' }
+               }
        },
        Orig : {
                _8 : {
-                       SER : {start : 22, len : 1, def : ' ' },
+                       SER : {start : 22, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 5, len : 1, def : ' ' },
-               },
+                       SER : {start : 5, len : 1, def : ' ' }
+               }
        },
        LTxt : {
                _8 : {
                        SCO : {start : 30, len : 2, def : ' ' },
-                       REC : {start : 30, len : 2, def : ' ' },
+                       REC : {start : 30, len : 2, def : ' ' }
                },
                _6 : {
                        SCO : {start : 13, len : 2, def : ' ' },
-                       REC : {start : 13, len : 2, def : ' ' },
-               },
+                       REC : {start : 13, len : 2, def : ' ' }
+               }
        },
        Freq : {
                _8 : {
-                       SER : {start : 18, len : 1, def : ' ' },
+                       SER : {start : 18, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 1, len : 1, def : ' ' },
-               },
+                       SER : {start : 1, len : 1, def : ' ' }
+               }
        },
        FMus : {
                _8 : {
                        SCO : {start : 20, len : 1, def : ' ' },
-                       REC : {start : 20, len : 1, def : 'n' },
+                       REC : {start : 20, len : 1, def : 'n' }
                },
                _6 : {
                        SCO : {start : 3, len : 1, def : ' ' },
-                       REC : {start : 3, len : 1, def : 'n' },
-               },
+                       REC : {start : 3, len : 1, def : 'n' }
+               }
        },
        File : {
                _8 : {
-                       COM : {start : 26, len : 1, def : 'u' },
+                       COM : {start : 26, len : 1, def : 'u' }
                },
                _6 : {
-                       COM : {start : 9, len : 1, def : 'u' },
-               },
+                       COM : {start : 9, len : 1, def : 'u' }
+               }
        },
        EntW : {
                _8 : {
-                       SER : {start : 24, len : 1, def : ' ' },
+                       SER : {start : 24, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 7, len : 1, def : ' ' },
-               },
+                       SER : {start : 7, len : 1, def : ' ' }
+               }
        },
        AccM : {
                _8 : {
                        SCO : {start : 24, len : 6, def : ' ' },
-                       REC : {start : 24, len : 6, def : ' ' },
+                       REC : {start : 24, len : 6, def : ' ' }
                },
                _6 : {
                        SCO : {start : 7, len : 6, def : ' ' },
-                       REC : {start : 7, len : 6, def : ' ' },
-               },
+                       REC : {start : 7, len : 6, def : ' ' }
+               }
        },
        Comp : {
                _8 : {
                        SCO : {start : 18, len : 2, def : ' ' },
-                       REC : {start : 18, len : 2, def : ' ' },
+                       REC : {start : 18, len : 2, def : ' ' }
                },
                _6 : {
                        SCO : {start : 1, len : 2, def : ' ' },
-                       REC : {start : 1, len : 2, def : ' ' },
-               },
+                       REC : {start : 1, len : 2, def : ' ' }
+               }
        },
        CrTp : {
                _8 : {
-                       MAP : {start : 25, len : 1, def : ' ' },
+                       MAP : {start : 25, len : 1, def : ' ' }
                },
                _6 : {
-                       MAP : {start : 8, len : 1, def : ' ' },
-               },
+                       MAP : {start : 8, len : 1, def : ' ' }
+               }
        },
        Ctry : {
                _8 : {
@@ -615,7 +711,7 @@ var ff_pos = {
                        MAP : {start : 15, len : 3, def : ' ' },
                        SCO : {start : 15, len : 3, def : ' ' },
                        REC : {start : 15, len : 3, def : ' ' },
-                       COM : {start : 15, len : 3, def : ' ' },
+                       COM : {start : 15, len : 3, def : ' ' }
                }
        },
        Lang : {
@@ -627,7 +723,7 @@ var ff_pos = {
                        MAP : {start : 35, len : 3, def : ' ' },
                        SCO : {start : 35, len : 3, def : ' ' },
                        REC : {start : 35, len : 3, def : ' ' },
-                       COM : {start : 35, len : 3, def : ' ' },
+                       COM : {start : 35, len : 3, def : ' ' }
                }
        },
        MRec : {
@@ -639,7 +735,7 @@ var ff_pos = {
                        MAP : {start : 38, len : 1, def : ' ' },
                        SCO : {start : 38, len : 1, def : ' ' },
                        REC : {start : 38, len : 1, def : ' ' },
-                       COM : {start : 38, len : 1, def : ' ' },
+                       COM : {start : 38, len : 1, def : ' ' }
                }
        },
        DtSt : {
@@ -651,7 +747,7 @@ var ff_pos = {
                        MAP : {start : 6, len : 1, def : ' ' },
                        SCO : {start : 6, len : 1, def : ' ' },
                        REC : {start : 6, len : 1, def : ' ' },
-                       COM : {start : 6, len : 1, def : ' ' },
+                       COM : {start : 6, len : 1, def : ' ' }
                }
        },
        Type : {
@@ -663,7 +759,7 @@ var ff_pos = {
                        MAP : {start : 6, len : 1, def : 'e' },
                        SCO : {start : 6, len : 1, def : 'c' },
                        REC : {start : 6, len : 1, def : 'i' },
-                       COM : {start : 6, len : 1, def : 'm' },
+                       COM : {start : 6, len : 1, def : 'm' }
                }
        },
        Ctrl : {
@@ -675,7 +771,7 @@ var ff_pos = {
                        MAP : {start : 8, len : 1, def : ' ' },
                        SCO : {start : 8, len : 1, def : ' ' },
                        REC : {start : 8, len : 1, def : ' ' },
-                       COM : {start : 8, len : 1, def : ' ' },
+                       COM : {start : 8, len : 1, def : ' ' }
                }
        },
        BLvl : {
@@ -687,7 +783,7 @@ var ff_pos = {
                        MAP : {start : 7, len : 1, def : 'm' },
                        SCO : {start : 7, len : 1, def : 'm' },
                        REC : {start : 7, len : 1, def : 'm' },
-                       COM : {start : 7, len : 1, def : 'm' },
+                       COM : {start : 7, len : 1, def : 'm' }
                }
        },
        Desc : {
@@ -699,7 +795,7 @@ var ff_pos = {
                        MAP : {start : 18, len : 1, def : ' ' },
                        SCO : {start : 18, len : 1, def : ' ' },
                        REC : {start : 18, len : 1, def : ' ' },
-                       COM : {start : 18, len : 1, def : ' ' },
+                       COM : {start : 18, len : 1, def : ' ' }
                }
        },
        ELvl : {
@@ -711,17 +807,17 @@ var ff_pos = {
                        MAP : {start : 17, len : 1, def : ' ' },
                        SCO : {start : 17, len : 1, def : ' ' },
                        REC : {start : 17, len : 1, def : ' ' },
-                       COM : {start : 17, len : 1, def : ' ' },
+                       COM : {start : 17, len : 1, def : ' ' }
                }
        },
        Indx : {
                _8 : {
                        BKS : {start : 31, len : 1, def : '0' },
-                       MAP : {start : 31, len : 1, def : '0' },
+                       MAP : {start : 31, len : 1, def : '0' }
                },
                _6 : {
                        BKS : {start : 14, len : 1, def : '0' },
-                       MAP : {start : 14, len : 1, def : '0' },
+                       MAP : {start : 14, len : 1, def : '0' }
                }
        },
        Date1 : {
@@ -733,8 +829,8 @@ var ff_pos = {
                        MAP : {start : 7, len : 4, def : ' ' },
                        SCO : {start : 7, len : 4, def : ' ' },
                        REC : {start : 7, len : 4, def : ' ' },
-                       COM : {start : 7, len : 4, def : ' ' },
-               },
+                       COM : {start : 7, len : 4, def : ' ' }
+               }
        },
        Date2 : {
                _8 : {
@@ -745,59 +841,59 @@ var ff_pos = {
                        MAP : {start : 11, len : 4, def : ' ' },
                        SCO : {start : 11, len : 4, def : ' ' },
                        REC : {start : 11, len : 4, def : ' ' },
-                       COM : {start : 11, len : 4, def : ' ' },
-               },
+                       COM : {start : 11, len : 4, def : ' ' }
+               }
        },
        LitF : {
                _8 : {
-                       BKS : {start : 33, len : 1, def : '0' },
+                       BKS : {start : 33, len : 1, def : '0' }
                },
                _6 : {
-                       BKS : {start : 16, len : 1, def : '0' },
+                       BKS : {start : 16, len : 1, def : '0' }
                }
        },
        Biog : {
                _8 : {
-                       BKS : {start : 34, len : 1, def : ' ' },
+                       BKS : {start : 34, len : 1, def : ' ' }
                },
                _6 : {
-                       BKS : {start : 17, len : 1, def : ' ' },
+                       BKS : {start : 17, len : 1, def : ' ' }
                }
        },
        Ills : {
                _8 : {
-                       BKS : {start : 18, len : 4, def : ' ' },
+                       BKS : {start : 18, len : 4, def : ' ' }
                },
                _6 : {
-                       BKS : {start : 1, len : 4, def : ' ' },
+                       BKS : {start : 1, len : 4, def : ' ' }
                }
        },
        Fest : {
                _8 : {
-                       BKS : {start : 30, len : 1, def : '0' },
+                       BKS : {start : 30, len : 1, def : '0' }
                },
                _6 : {
-                       BKS : {start : 13, len : 1, def : '0' },
+                       BKS : {start : 13, len : 1, def : '0' }
                }
        },
        Conf : {
                _8 : {
                        BKS : {start : 29, len : 1, def : '0' },
-                       SER : {start : 29, len : 1, def : '0' },
+                       SER : {start : 29, len : 1, def : '0' }
                },
                _6 : {
                        BKS : {start : 12, len : 1, def : '0' },
-                       SER : {start : 12, len : 1, def : '0' },
+                       SER : {start : 12, len : 1, def : '0' }
                }
        },
        Cont : {
                _8 : {
                        BKS : {start : 24, len : 4, def : ' ' },
-                       SER : {start : 25, len : 3, def : ' ' },
+                       SER : {start : 25, len : 3, def : ' ' }
                },
                _6 : {
                        BKS : {start : 7, len : 4, def : ' ' },
-                       SER : {start : 8, len : 3, def : ' ' },
+                       SER : {start : 8, len : 3, def : ' ' }
                }
        },
        GPub : {
@@ -806,14 +902,14 @@ var ff_pos = {
                        SER : {start : 28, len : 1, def : ' ' },
                        VIS : {start : 28, len : 1, def : ' ' },
                        MAP : {start : 28, len : 1, def : ' ' },
-                       COM : {start : 28, len : 1, def : ' ' },
+                       COM : {start : 28, len : 1, def : ' ' }
                },
                _6 : {
                        BKS : {start : 11, len : 1, def : ' ' },
                        SER : {start : 11, len : 1, def : ' ' },
                        VIS : {start : 11, len : 1, def : ' ' },
                        MAP : {start : 11, len : 1, def : ' ' },
-                       COM : {start : 11, len : 1, def : ' ' },
+                       COM : {start : 11, len : 1, def : ' ' }
                }
        },
        Audn : {
@@ -823,7 +919,7 @@ var ff_pos = {
                        VIS : {start : 22, len : 1, def : ' ' },
                        SCO : {start : 22, len : 1, def : ' ' },
                        REC : {start : 22, len : 1, def : ' ' },
-                       COM : {start : 22, len : 1, def : ' ' },
+                       COM : {start : 22, len : 1, def : ' ' }
                },
                _6 : {
                        BKS : {start : 5, len : 1, def : ' ' },
@@ -831,7 +927,7 @@ var ff_pos = {
                        VIS : {start : 5, len : 1, def : ' ' },
                        SCO : {start : 5, len : 1, def : ' ' },
                        REC : {start : 5, len : 1, def : ' ' },
-                       COM : {start : 5, len : 1, def : ' ' },
+                       COM : {start : 5, len : 1, def : ' ' }
                }
        },
        Form : {
@@ -842,7 +938,7 @@ var ff_pos = {
                        MIX : {start : 23, len : 1, def : ' ' },
                        MAP : {start : 29, len : 1, def : ' ' },
                        SCO : {start : 23, len : 1, def : ' ' },
-                       REC : {start : 23, len : 1, def : ' ' },
+                       REC : {start : 23, len : 1, def : ' ' }
                },
                _6 : {
                        BKS : {start : 6, len : 1, def : ' ' },
@@ -851,25 +947,25 @@ var ff_pos = {
                        MIX : {start : 6, len : 1, def : ' ' },
                        MAP : {start : 12, len : 1, def : ' ' },
                        SCO : {start : 6, len : 1, def : ' ' },
-                       REC : {start : 6, len : 1, def : ' ' },
+                       REC : {start : 6, len : 1, def : ' ' }
                }
        },
        'S/L' : {
                _8 : {
-                       SER : {start : 34, len : 1, def : '0' },
+                       SER : {start : 34, len : 1, def : '0' }
                },
                _6 : {
-                       SER : {start : 17, len : 1, def : '0' },
+                       SER : {start : 17, len : 1, def : '0' }
                }
        },
        'Alph' : {
                _8 : {
-                       SER : {start : 33, len : 1, def : ' ' },
+                       SER : {start : 33, len : 1, def : ' ' }
                },
                _6 : {
-                       SER : {start : 16, len : 1, def : ' ' },
+                       SER : {start : 16, len : 1, def : ' ' }
                }
-       },
+       }
 };
 
 function recordType (rec) {
@@ -1024,7 +1120,7 @@ function marcLeader (leader) {
                createLabel(
                        { value : 'LDR',
                          class : 'marcTag',
-                         tooltiptext : "MARC Leader" } ),
+                         tooltiptext : $('catStrings').getString('staff.cat.marcedit.marcTag.LDR.label') } ),
                createLabel(
                        { value : '',
                          class : 'marcInd1' } ),
@@ -1239,72 +1335,6 @@ function loadRecord(rec) {
        }
 }
 
-var context_menus = createComplexXULElement('popupset');
-document.documentElement.appendChild( context_menus );
-
-var tag_menu = createPopup({position : 'after_start', id : 'tags_popup'});
-context_menus.appendChild( tag_menu );
-
-tag_menu.appendChild(
-       createMenuitem(
-               { label : 'Add Row',
-                 oncommand : 
-                       'var e = document.createEvent("KeyEvents");' +
-                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,13,0);' +
-                       'current_focus.inputField.dispatchEvent(e);',
-                }
-       )
-);
-
-tag_menu.appendChild(
-       createMenuitem(
-               { label : 'Remove Row',
-                 oncommand : 
-                       'var e = document.createEvent("KeyEvents");' +
-                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,46,0);' +
-                       'current_focus.inputField.dispatchEvent(e);',
-               }
-       )
-);
-
-tag_menu.appendChild( createComplexXULElement( 'separator' ) );
-
-tag_menu.appendChild(
-       createMenuitem(
-               { label : 'Add/Replace 006',
-                 oncommand : 
-                       'var e = document.createEvent("KeyEvents");' +
-                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,64,0);' +
-                       'current_focus.inputField.dispatchEvent(e);',
-                }
-       )
-);
-
-tag_menu.appendChild(
-       createMenuitem(
-               { label : 'Add/Replace 007',
-                 oncommand : 
-                       'var e = document.createEvent("KeyEvents");' +
-                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,65,0);' +
-                       'current_focus.inputField.dispatchEvent(e);',
-               }
-       )
-);
-
-tag_menu.appendChild(
-       createMenuitem(
-               { label : 'Add/Replace 008',
-                 oncommand : 
-                       'var e = document.createEvent("KeyEvents");' +
-                       'e.initKeyEvent("keypress",1,1,null,1,0,0,0,66,0);' +
-                       'current_focus.inputField.dispatchEvent(e);',
-               }
-       )
-);
-
-tag_menu.appendChild( createComplexXULElement( 'separator' ) );
-
-
 
 function genToolTips () {
        for (var i in bib_data.field) {
@@ -1386,9 +1416,6 @@ function genToolTips () {
        }
 }
 
-var p = createComplexXULElement('popupset');
-document.documentElement.appendChild( p );
-
 function getTooltip (target, type) {
 
        var tt = '';
@@ -1458,7 +1485,7 @@ var authority_tag_map = {
        600 : ['[100,400,480,481,482,485,500,580,581,582,585,700,780,781,782,785]',100],
        650 : ['[150,450,480,481,482,485,550,580,581,582,585,750,780,781,782,785]',150],
        651 : ['[151,451,480,481,482,485,551,580,581,582,585,751,780,781,782,785]',151],
-       655 : ['[155,455,480,481,482,485,555,580,581,582,585,755,780,781,782,785]',155],
+       655 : ['[155,455,480,481,482,485,555,580,581,582,585,755,780,781,782,785]',155]
 };
 
 function getAuthorityContextMenu (target, sf) {
@@ -1471,7 +1498,7 @@ function getAuthorityContextMenu (target, sf) {
        context_menus.appendChild( sf_popup );
 
        if (!authority_tag_map[sf.parent().@tag]) {
-               sf_popup.appendChild(createLabel( { value : "Not a controlled subfield" } ) );
+               sf_popup.appendChild(createLabel( { value : $('catStrings').getString('staff.cat.marcedit.not_authority_field.label') } ) );
                target.setAttribute('context', menu_id);
                return false;
        }
@@ -1551,7 +1578,7 @@ function getAuthorityContextMenu (target, sf) {
 
                popup.appendChild(
                        createMenuitem(
-                               { label : 'Apply Selected',
+                               { label : $('catStrings').getString('staff.cat.marcedit.apply_selected.label'),
                                  command : function (event) {
                                                applyAuthority(event.target.previousSibling, target, sf);
                                                return true;
@@ -1564,7 +1591,7 @@ function getAuthorityContextMenu (target, sf) {
        }
 
        if (sf_popup.childNodes.length == 0)
-               sf_popup.appendChild(createLabel( { value : "No matching authority records found" } ) );
+               sf_popup.appendChild(createLabel( { value : $('catStrings').getString('staff.cat.marcedit.no_authority_match.label') } ) );
 
        target.setAttribute('context', menu_id);
        return true;
@@ -1613,72 +1640,72 @@ function applyAuthority ( target, ui_sf, e4x_sf ) {
 var control_map = {
        100 : {
                'a' : { 100 : 'a' },
-               'd' : { 100 : 'd' },
+               'd' : { 100 : 'd' }
        },
        110 : {
                'a' : { 110 : 'a' },
-               'd' : { 110 : 'd' },
+               'd' : { 110 : 'd' }
        },
        111 : {
                'a' : { 111 : 'a' },
-               'd' : { 111 : 'd' },
+               'd' : { 111 : 'd' }
        },
        130 : {
                'a' : { 130 : 'a' },
-               'd' : { 130 : 'd' },
+               'd' : { 130 : 'd' }
        },
        240 : {
                'a' : { 130 : 'a' },
-               'd' : { 130 : 'd' },
+               'd' : { 130 : 'd' }
        },
        400 : {
                'a' : { 100 : 'a' },
-               'd' : { 100 : 'd' },
+               'd' : { 100 : 'd' }
        },
        410 : {
                'a' : { 110 : 'a' },
-               'd' : { 110 : 'd' },
+               'd' : { 110 : 'd' }
        },
        411 : {
                'a' : { 111 : 'a' },
-               'd' : { 111 : 'd' },
+               'd' : { 111 : 'd' }
        },
        440 : {
                'a' : { 130 : 'a' },
                'n' : { 130 : 'n' },
-               'p' : { 130 : 'p' },
+               'p' : { 130 : 'p' }
        },
        700 : {
                'a' : { 100 : 'a' },
-               'd' : { 100 : 'd' },
+               'd' : { 100 : 'd' }
        },
        710 : {
                'a' : { 110 : 'a' },
-               'd' : { 110 : 'd' },
+               'd' : { 110 : 'd' }
        },
        711 : {
                'a' : { 111 : 'a' },
-               'd' : { 111 : 'd' },
+               'd' : { 111 : 'd' }
        },
        730 : {
                'a' : { 130 : 'a' },
-               'd' : { 130 : 'd' },
+               'd' : { 130 : 'd' }
        },
        800 : {
                'a' : { 100 : 'a' },
-               'd' : { 100 : 'd' },
+               'd' : { 100 : 'd' }
        },
        810 : {
                'a' : { 110 : 'a' },
-               'd' : { 110 : 'd' },
+               'd' : { 110 : 'd' }
        },
        811 : {
                'a' : { 111 : 'a' },
-               'd' : { 111 : 'd' },
+               'd' : { 111 : 'd' }
        },
        830 : {
                'a' : { 130 : 'a' },
-               'd' : { 130 : 'd' },
+               'd' : { 130 : 'd' }
        },
        600 : {
                'a' : { 100 : 'a' },
@@ -1688,26 +1715,88 @@ var control_map = {
                        100 : 'v',
                        181 : 'v',
                        182 : 'v',
-                       185 : 'v',
+                       185 : 'v'
                },
                'x' : { 180 : 'x',
                        100 : 'x',
                        181 : 'x',
                        182 : 'x',
-                       185 : 'x',
+                       185 : 'x'
                },
                'y' : { 180 : 'y',
                        100 : 'y',
                        181 : 'y',
                        182 : 'y',
-                       185 : 'y',
+                       185 : 'y'
                },
                'z' : { 180 : 'z',
                        100 : 'z',
                        181 : 'z',
                        182 : 'z',
-                       185 : 'z',
+                       185 : 'z'
+               }
+       },
+       610 : {
+               'a' : { 110 : 'a' },
+               'd' : { 110 : 'd' },
+               't' : { 110 : 't' },
+               'v' : { 180 : 'v',
+                       110 : 'v',
+                       181 : 'v',
+                       182 : 'v',
+                       185 : 'v'
                },
+               'x' : { 180 : 'x',
+                       110 : 'x',
+                       181 : 'x',
+                       182 : 'x',
+                       185 : 'x'
+               },
+               'y' : { 180 : 'y',
+                       110 : 'y',
+                       181 : 'y',
+                       182 : 'y',
+                       185 : 'y'
+               },
+               'z' : { 180 : 'z',
+                       110 : 'z',
+                       181 : 'z',
+                       182 : 'z',
+                       185 : 'z'
+               }
+       },
+       611 : {
+               'a' : { 111 : 'a' },
+               'd' : { 111 : 'd' },
+               't' : { 111 : 't' },
+               'v' : { 180 : 'v',
+                       111 : 'v',
+                       181 : 'v',
+                       182 : 'v',
+                       185 : 'v'
+               },
+               'x' : { 180 : 'x',
+                       111 : 'x',
+                       181 : 'x',
+                       182 : 'x',
+                       185 : 'x'
+               },
+               'y' : { 180 : 'y',
+                       111 : 'y',
+                       181 : 'y',
+                       182 : 'y',
+                       185 : 'y'
+               },
+               'z' : { 180 : 'z',
+                       111 : 'z',
+                       181 : 'z',
+                       182 : 'z',
+                       185 : 'z'
+               },
+       },
+       630 : {
+               'a' : { 130 : 'a' },
+               'd' : { 130 : 'd' }
        },
        650 : {
                'a' : { 150 : 'a' },
@@ -1716,26 +1805,26 @@ var control_map = {
                        150 : 'v',
                        181 : 'v',
                        182 : 'v',
-                       185 : 'v',
+                       185 : 'v'
                },
                'x' : { 180 : 'x',
                        150 : 'x',
                        181 : 'x',
                        182 : 'x',
-                       185 : 'x',
+                       185 : 'x'
                },
                'y' : { 180 : 'y',
                        150 : 'y',
                        181 : 'y',
                        182 : 'y',
-                       185 : 'y',
+                       185 : 'y'
                },
                'z' : { 180 : 'z',
                        150 : 'z',
                        181 : 'z',
                        182 : 'z',
-                       185 : 'z',
-               },
+                       185 : 'z'
+               }
        },
        651 : {
                'a' : { 151 : 'a' },
@@ -1743,26 +1832,26 @@ var control_map = {
                        151 : 'v',
                        181 : 'v',
                        182 : 'v',
-                       185 : 'v',
+                       185 : 'v'
                },
                'x' : { 180 : 'x',
                        151 : 'x',
                        181 : 'x',
                        182 : 'x',
-                       185 : 'x',
+                       185 : 'x'
                },
                'y' : { 180 : 'y',
                        151 : 'y',
                        181 : 'y',
                        182 : 'y',
-                       185 : 'y',
+                       185 : 'y'
                },
                'z' : { 180 : 'z',
                        151 : 'z',
                        181 : 'z',
                        182 : 'z',
-                       185 : 'z',
-               },
+                       185 : 'z'
+               }
        },
        655 : {
                'a' : { 155 : 'a' },
@@ -1770,27 +1859,27 @@ var control_map = {
                        155 : 'v',
                        181 : 'v',
                        182 : 'v',
-                       185 : 'v',
+                       185 : 'v'
                },
                'x' : { 180 : 'x',
                        155 : 'x',
                        181 : 'x',
                        182 : 'x',
-                       185 : 'x',
+                       185 : 'x'
                },
                'y' : { 180 : 'y',
                        155 : 'y',
                        181 : 'y',
                        182 : 'y',
-                       185 : 'y',
+                       185 : 'y'
                },
                'z' : { 180 : 'z',
                        155 : 'z',
                        181 : 'z',
                        182 : 'z',
-                       185 : 'z',
-               },
-       },
+                       185 : 'z'
+               }
+       }
 };
 
 function validateAuthority (button) {
index 37f0c8e..d42c4c2 100644 (file)
@@ -1,29 +1,51 @@
 <?xml version="1.0"?>
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
 <?xml-stylesheet href="marcedit.css" type="text/css"?>
 
+<!-- LOCALIZATION -->
+<!DOCTYPE window PUBLIC "" ""[
+<!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:xhtml="http://www.w3.org/1999/xhtml" onload="my_init()">
 
 <script src="marcedit.js" type="application/x-javascript; e4x=1"/>
 <script src="/opac/common/js/CGI.js" type="application/x-javascript; e4x=1"/>
 
+<messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
+<messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+<messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
 <groupbox flex="0">
-       <caption label="Options"/>
+       <caption label="&staff.cat.marcedit.options.label;"/>
        <hbox flex="1">
-               <checkbox persist="checked" accesskey='s' label="Stack subfields" onclick="stackSubfields(this);" checked="false" id="stackSubfields"/>
-               <button label="Validate"  accesskey="V" oncommand="validateAuthority(this);"/>
-               <button id="save-button" accesskey="d"/>
-               <button label="Help" accesskey="H" oncommand="alert('Add Row: CTRL+Enter\nInsert Row: CTRL+Shift+Enter\nAdd Subfield: CTRL+D\nRemove Row: CTRL+Del\nRemove Subfield: SHIFT+Del\nCreate/Replace 006: CTRL+F6\nCreate/Replace 007: CTRL+F7\nCreate/Replace 008: CTRL+F8\n');"/>
+               <checkbox persist="checked" accesskey='&staff.cat.marcedit.stackSubfields.accesskey;' label="&staff.cat.marcedit.stackSubfields.label;" onclick="stackSubfields(this);" checked="false" id="stackSubfields"/>
+               <button label="&staff.cat.marcedit.validate.label;" accesskey="&staff.cat.marcedit.validate.accesskey;" oncommand="validateAuthority(this);"/>
+               <button id="save-button" accesskey="&staff.cat.marcedit.save-button.accesskey;"/>
+               <button label="&staff.cat.marcedit.help.label;" accesskey="&staff.cat.marcedit.help.accesskey;"
+                       oncommand="alert(
+                               $('catStrings').getString('staff.cat.marcedit.help.add_row') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.insert_row') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.add_subfield') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.remove_row') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.remove_subfield') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.replace_006') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.replace_007') + '\n' +
+                               $('catStrings').getString('staff.cat.marcedit.help.replace_008')
+                       );"
+               />
        </hbox>
 </groupbox>
 
 <groupbox flex="1">
-       <caption label="MARC Record"/>
+       <caption label="&staff.cat.marcedit.caption.label;"/>
        <vbox flex="1" style="overflow: auto;">
                <hbox>
                <groupbox flex="0">
                        <caption>
-                               <label value="Fixed Fields -- Record type: " ondblclick="toggleFFE();"/>
+                               <label value="&staff.cat.marcedit.toggleFFE.label;" ondblclick="toggleFFE();"/>
                                <label id="recordTypeLabel" context="recordTypeMenu"/>
                        </caption>
                        <vbox flex="0">
index c8698c4..1bf13c6 100644 (file)
@@ -8,6 +8,8 @@ cat.record_buckets = function (params) {
        JSAN.use('util.date');
        JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
        this.first_pause = true;
+    var x = document.getElementById("record_buckets_tabbox");
+    if (x) x.selectedIndex = 2;
 };
 
 cat.record_buckets.pick_file = function (defaultFileName) {
@@ -68,6 +70,7 @@ cat.record_buckets.export_records = function(obj, output_type) {
 
 
 cat.record_buckets.prototype = {
+       'selection_list0' : [],
        'selection_list1' : [],
        'selection_list2' : [],
        'bucket_id_name_map' : {},
@@ -81,7 +84,7 @@ cat.record_buckets.prototype = {
                var obj = this;
                obj.list1.clear();
                for (var i = 0; i < obj.record_ids.length; i++) {
-                       var item = obj.flesh_item_for_list( obj.record_ids[i] );
+                       var item = obj.prep_record_for_list( obj.record_ids[i] );
                        if (item) obj.list1.append( item );
                }
        },
@@ -107,25 +110,77 @@ cat.record_buckets.prototype = {
 
                JSAN.use('util.list'); 
 
+        function retrieve_row(params) {
+            var row = params.row;
+            try {
+                           obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE.authoritative', [ row.my.docid ],
+                    function(req) {
+                        try {
+                            var record = req.getResultObject();
+                            if (typeof req.ilsevent != 'undefined') throw(req);
+                            row.my.mvr = record;
+                            if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
+
+                        } catch(E) {
+                            obj.error.standard_unexpected_error_alert('Error retrieving mvr for record with id =' + row.my.docid, E);
+                        }
+                    }
+                );
+            } catch(E) {
+                obj.error.sdump('D_ERROR','retrieve_row: ' + E );
+            }
+            return row;
+        }
+
+               obj.list0 = new util.list('record_query_list');
+               obj.list0.init(
+                       {
+                               'columns' : columns,
+                               'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                'retrieve_row' : retrieve_row,
+                               'on_select' : function(ev) {
+                                       try {
+                                               JSAN.use('util.functional');
+                                               var sel = obj.list0.retrieve_selection();
+                                               obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
+                                               obj.selection_list0 = util.functional.map_list(
+                                                       sel,
+                                                       function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
+                                               );
+                                               obj.error.sdump('D_TRACE','circ/record_buckets: selection list 0 = ' + js2JSON(obj.selection_list1) );
+                                               if (obj.selection_list0.length == 0) {
+                                                       obj.controller.view.cmd_add_sel_query_to_pending.setAttribute('disabled','true');
+                                               } else {
+                                                       obj.controller.view.cmd_add_sel_query_to_pending.setAttribute('disabled','false');
+                                               }
+                                       } catch(E) {
+                                               alert('FIXME: ' + E);
+                                       }
+                               },
+
+                       }
+               );
+
                obj.list1 = new util.list('pending_records_list');
                obj.list1.init(
                        {
                                'columns' : columns,
                                'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                'retrieve_row' : retrieve_row,
                                'on_select' : function(ev) {
                                        try {
                                                JSAN.use('util.functional');
                                                var sel = obj.list1.retrieve_selection();
-                                               document.getElementById('clip_button1').disabled = sel.length < 1;
+                                               obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
                                                obj.selection_list1 = util.functional.map_list(
                                                        sel,
                                                        function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
                                                );
                                                obj.error.sdump('D_TRACE','circ/record_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
                                                if (obj.selection_list1.length == 0) {
-                                                       obj.controller.view.record_buckets_sel_add.disabled = true;
+                                                       obj.controller.view.cmd_add_sel_pending_to_record_bucket.setAttribute('disabled','true');
                                                } else {
-                                                       obj.controller.view.record_buckets_sel_add.disabled = false;
+                                                       obj.controller.view.cmd_add_sel_pending_to_record_bucket.setAttribute('disabled','false');
                                                }
                                        } catch(E) {
                                                alert('FIXME: ' + E);
@@ -142,26 +197,23 @@ cat.record_buckets.prototype = {
                        {
                                'columns' : columns,
                                'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                'retrieve_row' : retrieve_row,
                                'on_select' : function(ev) {
                                        try {
                                                JSAN.use('util.functional');
                                                var sel = obj.list2.retrieve_selection();
-                                               document.getElementById('clip_button2').disabled = sel.length < 1;
+                                               obj.controller.view.sel_clip2.setAttribute('disabled', sel.length < 1 ? "true" : "false");
                                                obj.selection_list2 = util.functional.map_list(
                                                        sel,
                                                        function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
                                                );
                                                obj.error.sdump('D_TRACE','circ/record_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
                                                if (obj.selection_list2.length == 0) {
-                                                       obj.controller.view.record_buckets_delete_item.disabled = true;
-                                                       obj.controller.view.record_buckets_delete_item.setAttribute('disabled','true');
-                                                       obj.controller.view.record_buckets_export.disabled = true;
-                                                       obj.controller.view.record_buckets_export.setAttribute('disabled','true');
+                                                       obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','true');
+                                                       obj.controller.view.cmd_record_buckets_to_pending_buckets.setAttribute('disabled','true');
                                                } else {
-                                                       obj.controller.view.record_buckets_delete_item.disabled = false;
-                                                       obj.controller.view.record_buckets_delete_item.setAttribute('disabled','false');
-                                                       obj.controller.view.record_buckets_export.disabled = false;
-                                                       obj.controller.view.record_buckets_export.setAttribute('disabled','false');
+                                                       obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','false');
+                                                       obj.controller.view.cmd_record_buckets_to_pending_buckets.setAttribute('disabled','false');
                                                }
                                        } catch(E) {
                                                alert('FIXME: ' + E);
@@ -182,6 +234,10 @@ cat.record_buckets.prototype = {
                                                ['command'],
                                                function() { obj.list1.save_columns(); }
                                        ],
+                                       'save_columns0' : [
+                                               ['command'],
+                                               function() { obj.list0.save_columns(); }
+                                       ],
                                        'sel_clip2' : [
                                                ['command'],
                                                function() { obj.list2.clipboard(); }
@@ -190,6 +246,23 @@ cat.record_buckets.prototype = {
                                                ['command'],
                                                function() { obj.list1.clipboard(); }
                                        ],
+                                       'sel_clip0' : [
+                                               ['command'],
+                                               function() { obj.list0.clipboard(); }
+                                       ],
+                    'record_query_input' : [
+                        ['render'],
+                        function(ev) {
+                            ev.addEventListener('keypress',function(ev){
+                                if (ev.target.tagName != 'textbox') return;
+                                if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.submit(); }, 0);
+                            },false);
+                        }
+                    ],
+                    'cmd_submit_query' : [
+                        ['command'],
+                        function() { obj.submit(); }
+                    ],
                                        'record_buckets_menulist_placeholder' : [
                                                ['render'],
                                                function(e) {
@@ -240,6 +313,17 @@ cat.record_buckets.prototype = {
                                                                                ev.target.setAttribute('value',bucket_id);
                                                                        }
                                                                        if (!bucket_id) return;
+                                                                       var x = document.getElementById('info_box');
+                                                                       if (x) x.setAttribute('hidden','true');
+                                    x = document.getElementById('bucket_item_count');
+                                    if (x) x.setAttribute('label','');
+                                    obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
+                                    obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
+                                    obj.controller.view.record_buckets_export_records.disabled = true;
+                                    obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
+                                    obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
+                                    obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
+                                    obj.controller.view.record_buckets_list_actions.disabled = true;
                                                                        var bucket = obj.network.simple_request(
                                                                                'BUCKET_FLESH',
                                                                                [ ses(), 'biblio', bucket_id ]
@@ -253,6 +337,14 @@ cat.record_buckets.prototype = {
                                                                                return;
                                                                        }
                                                                        try {
+                                        obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
+                                        obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
+                                        obj.controller.view.record_buckets_export_records.disabled = false;
+                                        obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
+                                        obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
+                                        obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
+                                        obj.controller.view.record_buckets_list_actions.disabled = false;
+
                                                                                var x = document.getElementById('info_box');
                                                                                x.setAttribute('hidden','false');
                                                                                x = document.getElementById('bucket_number');
@@ -262,14 +354,16 @@ cat.record_buckets.prototype = {
                                                                                x = document.getElementById('bucket_owner');
                                                                                var s = bucket.owner(); JSAN.use('patron.util');
                                                                                if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); 
-                                                                               x.setAttribute('value',s.card().barcode() + " @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
+                                                                               x.setAttribute('value',s.family_name() + ' (' + s.card().barcode() + ") @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
                                                                        } catch(E) {
                                                                                alert(E);
                                                                        }
                                                                        var items = bucket.items() || [];
                                                                        obj.list2.clear();
+                                    var x = document.getElementById('bucket_item_count');
+                                    if (x && catStrings) x.setAttribute('value',catStrings.getFormattedString('cat.total_bucket_items_in_bucket',[items.length]));
                                                                        for (var i = 0; i < items.length; i++) {
-                                                                               var item = obj.flesh_item_for_list( 
+                                                                               var item = obj.prep_record_for_list( 
                                                                                        items[i].target_biblio_record_entry(),
                                                                                        items[i].id()
                                                                                );
@@ -283,14 +377,54 @@ cat.record_buckets.prototype = {
                                                                }, false);
                                                                obj.controller.view.bucket_menulist = ml;
                                                                JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
-                                                               document.getElementById('refresh').addEventListener( 'command', function() {
-                                                                       JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
-                                                               }, false);
                                                        };
                                                },
                                        ],
 
-                                       'record_buckets_add' : [
+                    'cmd_record_buckets_refresh' : [
+                        ['command'],
+                        function() {
+                            JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
+                        }
+                    ],
+
+                                       'cmd_add_all_query_to_pending' : [
+                                               ['command'],
+                                               function() {
+                                               obj.list0.select_all();
+                                                       for (var i = 0; i < obj.selection_list0.length; i++) {
+                                                               var docid = obj.selection_list0[i].docid;
+                                                               try {
+                                                                       var item = obj.prep_record_for_list( docid );
+                                                                       if (!item) continue;
+                                                                       obj.list1.append( item );
+                                    obj.record_ids.push( docid );
+                                                               } catch(E) {
+                                                                       alert( js2JSON(E) );
+                                                               }
+                                                       }
+                                               }
+                                       ],
+
+                                       'cmd_add_sel_query_to_pending' : [
+                                               ['command'],
+                                               function() {
+                                                       for (var i = 0; i < obj.selection_list0.length; i++) {
+                                                               var docid = obj.selection_list0[i].docid;
+                                                               try {
+                                                                       var item = obj.prep_record_for_list( docid );
+                                                                       if (!item) continue;
+                                                                       obj.list1.append( item );
+                                    obj.record_ids.push( docid );
+                                                               } catch(E) {
+                                                                       alert( js2JSON(E) );
+                                                               }
+                                                       }
+                                               }
+                                       ],
+
+
+                                       'cmd_add_all_pending_to_record_bucket' : [
                                                ['command'],
                                                function() {
                                                        var bucket_id = obj.controller.view.bucket_menulist.value;
@@ -306,7 +440,7 @@ cat.record_buckets.prototype = {
 
                                                                        if (typeof robj == 'object') throw robj;
 
-                                                                       var item = obj.flesh_item_for_list( obj.record_ids[i], robj );
+                                                                       var item = obj.prep_record_for_list( obj.record_ids[i], robj );
                                                                        if (!item) continue;
 
                                                                        obj.list2.append( item );
@@ -316,7 +450,7 @@ cat.record_buckets.prototype = {
                                                        }
                                                }
                                        ],
-                                       'record_buckets_sel_add' : [
+                                       'cmd_add_sel_pending_to_record_bucket' : [
                                                ['command'],
                                                function() {                                                        
                                                        var bucket_id = obj.controller.view.bucket_menulist.value;
@@ -333,7 +467,7 @@ cat.record_buckets.prototype = {
 
                                                                        if (typeof robj == 'object') throw robj;
 
-                                                                       var item = obj.flesh_item_for_list( docid, robj );
+                                                                       var item = obj.prep_record_for_list( docid, robj );
                                                                        if (!item) continue;
 
                                                                        obj.list2.append( item );
@@ -344,12 +478,12 @@ cat.record_buckets.prototype = {
 
                                                }
                                        ],
-                                       'record_buckets_export' : [
+                                       'cmd_record_buckets_to_pending_buckets' : [
                                                ['command'],
                                                function() {                                                        
                                                        for (var i = 0; i < obj.selection_list2.length; i++) {
                                                                var docid = obj.selection_list2[i].docid;
-                                                               var item = obj.flesh_item_for_list( docid );
+                                                               var item = obj.prep_record_for_list( docid );
                                                                if (item) {
                                                                        obj.list1.append( item );
                                                                        obj.record_ids.push( docid );
@@ -358,7 +492,7 @@ cat.record_buckets.prototype = {
                                                }
                                        ],
 
-                                       'record_buckets_delete_item' : [
+                                       'cmd_record_buckets_delete_item' : [
                                                ['command'],
                                                function() {
                                                        for (var i = 0; i < obj.selection_list2.length; i++) {
@@ -380,7 +514,7 @@ cat.record_buckets.prototype = {
                                                        );
                                                }
                                        ],
-                                       'record_buckets_delete_bucket' : [
+                                       'cmd_record_buckets_delete_bucket' : [
                                                ['command'],
                                                function() {
                                                        try {
@@ -392,6 +526,15 @@ cat.record_buckets.prototype = {
                                                                var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
                                                                if (typeof robj == 'object') throw robj;
                                                                alert("Action completed.");
+                                                               var x = document.getElementById('info_box');
+                                x.setAttribute('hidden','true');
+                                obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
+                                obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
+                                obj.controller.view.record_buckets_export_records.disabled = true;
+                                obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
+                                obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
+                                obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
+                                obj.controller.view.record_buckets_list_actions.disabled = true;
                                                                obj.controller.render('record_buckets_menulist_placeholder');
                                                                setTimeout(
                                                                        function() {
@@ -405,7 +548,7 @@ cat.record_buckets.prototype = {
                                                        }
                                                }
                                        ],
-                                       'record_buckets_new_bucket' : [
+                                       'cmd_record_buckets_new_bucket' : [
                                                ['command'],
                                                function() {
                                                        try {
@@ -445,66 +588,15 @@ cat.record_buckets.prototype = {
                                                }
                                        ],
                                        
-                                       'cmd_record_buckets_export' : [
-                                               ['command'],
-                                               function() {
-                                                       obj.list2.dump_csv_to_clipboard();
-                                               }
-                                       ],
-
-                                       'cmd_export1' : [
-                                               ['command'],
-                                               function() {
-                                                       obj.list1.dump_csv_to_clipboard();
-                                               }
-                                       ],
-
-                    'cmd_print_export1' : [
-                        ['command'],
-                        function() {
-                            try {
-                                obj.list1.on_all_fleshed =
-                                    function() {
-                                        try {
-                                            dump( obj.list1.dump_csv() + '\n' );
-                                            //copy_to_clipboard(obj.list.dump_csv());
-                                            JSAN.use('util.print'); var print = new util.print();
-                                            print.simple(obj.list1.dump_csv(),{'content_type':'text/plain'});
-                                            setTimeout(function(){ obj.list1.on_all_fleshed = null; },0);
-                                        } catch(E) {
-                                            obj.error.standard_unexpected_error_alert('print export',E);
-                                        }
-                                    }
-                                obj.list1.full_retrieve();
-                            } catch(E) {
-                                obj.error.standard_unexpected_error_alert('print export',E);
-                            }
-                        }
-                    ],
-
-
-                    'cmd_print_export2' : [
-                        ['command'],
-                        function() {
-                            try {
-                                obj.list2.on_all_fleshed =
-                                    function() {
-                                        try {
-                                            dump( obj.list2.dump_csv() + '\n' );
-                                            //copy_to_clipboard(obj.list.dump_csv());
-                                            JSAN.use('util.print'); var print = new util.print();
-                                            print.simple(obj.list2.dump_csv(),{'content_type':'text/plain'});
-                                            setTimeout(function(){ obj.list2.on_all_fleshed = null; },0);
-                                        } catch(E) {
-                                            obj.error.standard_unexpected_error_alert('print export',E);
-                                        }
-                                    }
-                                obj.list2.full_retrieve();
-                            } catch(E) {
-                                obj.error.standard_unexpected_error_alert('print export',E);
-                            }
-                        }
-                    ],
+                                       'cmd_record_query_csv_to_clipboard' : [ ['command'], function() { obj.list0.dump_csv_to_clipboard(); } ], 
+                                       'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ], 
+                                       'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
+                    'cmd_record_query_csv_to_printer' : [ ['command'], function() { obj.list0.dump_csv_to_printer(); } ],
+                    'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
+                    'cmd_record_buckets_csv_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ], 
+                    'cmd_record_query_csv_to_file' : [ ['command'], function() { obj.list0.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
+                    'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
+                    'cmd_record_buckets_csv_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ], 
 
                                        'cmd_export_records_usmarc' : [
                                                ['command'],
@@ -691,12 +783,6 @@ cat.record_buckets.prototype = {
                                                ['command'],
                                                function() { alert('Not Yet Implemented'); }
                                        ],
-                                       'cmd_record_buckets_done' : [
-                                               ['command'],
-                                               function() {
-                                                       window.close();
-                                               }
-                                       ],
                                        'cmd_sel_opac' : [
                                                ['command'],
                                                function() {
@@ -709,8 +795,10 @@ cat.record_buckets.prototype = {
                                                                                return JSON2js(o).docid; // docid
                                                                        }
                                                                );
+                                var seen = {};
                                                                for (var i = 0; i < docids.length; i++) {
                                                                        var doc_id = docids[i];
+                                    if (seen[doc_id]) continue; seen[doc_id] = true;
                                                                        var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
                                                                        var content_params = { 
                                                                                'session' : ses(),
@@ -728,7 +816,8 @@ cat.record_buckets.prototype = {
                                                        }
                                                }
                                        ],
-
+                    'record_buckets_export_records' : [ ['render'], function(){} ],
+                    'record_buckets_list_actions' : [ ['render'], function(){} ]
                                }
                        }
                );
@@ -737,34 +826,78 @@ cat.record_buckets.prototype = {
                if (typeof xulG == 'undefined') {
                        obj.controller.view.cmd_sel_opac.disabled = true;
                        obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
-               } else {
-                       obj.controller.view.cmd_record_buckets_done.disabled = true;
-                       obj.controller.view.cmd_record_buckets_done.setAttribute('disabled',true);
                }
        },
 
-       'flesh_item_for_list' : function(docid,bucket_item_id) {
+    'submit' : function() {
+        try {
+            var obj = this;
+            var x = document.getElementById('record_query_input'); 
+            if (x.value == '') {
+                setTimeout( function() { obj.controller.view.record_query_input.focus(); obj.controller.view.record_query_input.select(); }, 0 );
+                return;
+            }
+            obj.list0.clear();
+            var y = document.getElementById('query_status');
+            x.disabled = true;
+            if (y) y.value = 'Searching...';
+            obj.network.simple_request(
+                'FM_BRE_ID_SEARCH_VIA_MULTICLASS_QUERY',
+                [ {}, x.value, 1 ],
+                function(req) {
+                    try {
+                        var resp = req.getResultObject();
+                        if (y) y.value = catStrings.getFormattedString('cat.results_returned',[resp.count]);
+                        x.disabled = false;
+                        if (resp.count > 0) {
+                            JSAN.use('util.exec'); var exec = new util.exec();
+                            var funcs = [];
+                            for (var i = 0; i < resp.ids.length; i++) {
+                                funcs.push(
+                                    function(b){
+                                        return function() {
+                                            obj.list0.append(obj.prep_record_for_list(b));
+                                        };
+                                    }(resp.ids[i][0])
+                                );
+                            }
+                            funcs.push(
+                                function() {
+                                    obj.controller.view.record_query_input.focus();
+                                    obj.controller.view.record_query_input.select();
+                                }
+                            );
+                            exec.chain( funcs ); 
+                        } else {
+                            setTimeout( function() { obj.controller.view.record_query_input.focus(); obj.controller.view.record_query_input.select(); }, 0 );
+                        }
+                    } catch(E) {
+                        obj.error.standard_unexpected_error_alert('submit_query_callback',E);
+                    }
+                }
+            );
+        } catch(E) {
+            this.error.standard_unexpected_error_alert('submit_query',E);
+        }
+    },
+
+       'prep_record_for_list' : function(docid,bucket_item_id) {
                var obj = this;
                try {
-                       var record = obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE', [ docid ]);
-                       if (record == null || typeof(record.ilsevent) != 'undefined') {
-                               throw(record);
-                       } else {
-                               var item = {
-                                       'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
-                                       'row' : {
-                                               'my' : {
-                                                       'mvr' : record,
-                                               }
-                                       }
-                               };
-                               return item;
-                       }
+            var item = {
+                'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
+                'row' : {
+                    'my' : {
+                        'docid' : docid,
+                        'bucket_item_id' : bucket_item_id
+                    }
+                }
+            };
+            return item;
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
                        return null;
                }
-
        },
        
 };
index dbf10e0..6779bb0 100644 (file)
@@ -32,6 +32,8 @@
        <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
        <script>
        <![CDATA[
+        var catStrings;
+
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
@@ -39,6 +41,8 @@
                                /* ugly hack so we don't have to upgrade the chrome for quick buckets */
                                if (typeof xulG == 'undefined') location.href = String(location.href).replace(/record_buckets.xul/,'record_buckets_quick.xul');
 
+                catStrings = document.getElementById('catStrings');    
+
                 if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
        ]]>
        </script>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+    <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale' -->/cat.properties"/>
+
        <commandset id="record_buckets_cmds">
-               <command id="sel_clip1" />
-               <command id="sel_clip2" />
+               <command id="sel_clip0" disabled="true"/>
+               <command id="sel_clip1" disabled="true"/>
+               <command id="sel_clip2" disabled="true"/>
+               <command id="save_columns0" />
                <command id="save_columns1" />
                <command id="save_columns2" />
-               <command id="cmd_print_export1" />
-               <command id="cmd_export1" />
-               <command id="cmd_print_export2" />
-               <command id="cmd_record_buckets_submit_barcode" />
-               <command id="cmd_record_buckets_print" />
-               <command id="cmd_record_buckets_export" />
-               <command id="cmd_record_buckets_reprint" />
-               <command id="cmd_record_buckets_done" />
-               <command id="cmd_merge_records" />
+
+               <command id="cmd_record_query_csv_to_printer" />
+               <command id="cmd_record_query_csv_to_clipboard" />
+               <command id="cmd_record_query_csv_to_file" />
+
+               <command id="cmd_pending_buckets_csv_to_printer" />
+               <command id="cmd_pending_buckets_csv_to_clipboard" />
+               <command id="cmd_pending_buckets_csv_to_file" />
+
+               <command id="cmd_record_buckets_new_bucket" />
+               <command id="cmd_record_buckets_delete_bucket" disabled="true"/>
+               <command id="cmd_record_buckets_refresh" disabled="true"/>
+
+       <command id="cmd_record_buckets_delete_item" />
+       <command id="cmd_record_buckets_to_pending_buckets" />
+
+               <command id="cmd_record_buckets_csv_to_printer" />
+               <command id="cmd_record_buckets_csv_to_clipboard" />
+               <command id="cmd_record_buckets_csv_to_file" />
+               
+        <command id="cmd_add_all_query_to_pending" />
+        <command id="cmd_add_sel_query_to_pending" />
+
+        <command id="cmd_add_all_pending_to_record_bucket" />
+        <command id="cmd_add_sel_pending_to_record_bucket" />
+
+               <command id="cmd_merge_records" disabled="true" />
                <command id="cmd_export_records_usmarc" />
                <command id="cmd_export_records_unimarc" />
                <command id="cmd_export_records_xml" />
                <command id="cmd_export_records_bre" />
-               <command id="cmd_delete_records" />
-               <command id="cmd_sel_opac" />
+               <command id="cmd_delete_records" disabled="true" />
+               <command id="cmd_sel_opac" disabled="true" />
+               
+        <command id="cmd_submit_query" />
        </commandset>
 
        <box id="record_buckets_main" />
index f84be23..961fcf6 100644 (file)
 </box>
 
 <vbox id="cmvb1" flex="1">
-       <groupbox flex="1">
-               <caption label="Pending Records" />
-               <hbox id="pending_buckets_top_ui" />
-               <tree id="pending_records_list" flex="1" enableColumnDrag="true"/>
-               <hbox id="pending_buckets_bottom_ui" />
-       </groupbox>
-       <splitter><grippy /></splitter>
-       <groupbox flex="2">
-               <caption label="Bucket View" />
-               <hbox id="record_buckets_top_ui" />
-               <hbox id="info_box" />
-               <tree id="records_in_bucket_list" flex="1" enableColumnDrag="true"/>
-               <hbox id="record_buckets_bottom_ui" />
-       </groupbox>
+    <tabbox id="record_buckets_tabbox" flex="1" persist="selectedIndex">
+        <tabs>
+            <tab id="record_query_tab" label="Record Query" accesskey="Q"/>
+            <tab id="pending_records_tab" label="Pending Records" accesskey="P"/>
+            <tab id="bucket_view_tab" label="Bucket View" accesskey="V" />
+        </tabs>
+        <tabpanels flex="1">
+            <tabpanel id="record_query_panel">
+                <groupbox flex="1">
+                    <caption label="Record Query" />
+                    <hbox id="record_query_top_ui" />
+                    <label id="query_status"/>
+                    <tree id="record_query_list" flex="1" enableColumnDrag="true"/>
+                    <hbox id="record_query_bottom_ui" />
+                </groupbox>
+            </tabpanel>
+            <tabpanel id="pending_records_panel">
+                <groupbox flex="1">
+                    <caption label="Pending Records" />
+                    <hbox id="pending_buckets_top_ui" />
+                    <tree id="pending_records_list" flex="1" enableColumnDrag="true"/>
+                    <hbox id="pending_buckets_bottom_ui" />
+                </groupbox>
+            </tabpanel>
+            <tabpanel id="bucket_view_panel">
+                <vbox flex="1">
+                    <hbox>
+                        <hbox id="record_buckets_menulist_placeholder" />
+                        <button id="record_buckets_action_list" label="Bucket Actions" type="menu" allowevents="true">
+                            <menupopup id="record_buckets_action_list_popup">
+                                <menuitem command="cmd_record_buckets_new_bucket" label="New Bucket"/>
+                                <menuitem command="cmd_record_buckets_delete_bucket" label="Delete Bucket"/>
+                                <menuitem command="cmd_record_buckets_refresh" label="Refresh"/>
+                            </menupopup>
+                        </button>
+                        <label id="bucket_item_count" />
+                    </hbox>
+                    <groupbox flex="1">
+                        <caption>
+                            <hbox id="info_box" />
+                        </caption>
+                        <hbox id="record_buckets_top_ui" />
+                        <tree id="records_in_bucket_list" flex="1" enableColumnDrag="true"/>
+                        <hbox id="record_buckets_bottom_ui" />
+                    </groupbox>
+                </vbox>
+            </tabpanel>
+        </tabpanels>
+    </tabbox>
 </vbox>
 
+<hbox id="record_query_top_ui">
+    <label id="record_query_label" value="Query" accesskey="y" control="record_query_input"/>
+    <textbox id="record_query_input" flex="1"/>
+    <button command="cmd_submit_query" label="Submit" accesskey="S"/>
+    <button id="query_help" label="Help" accesskey="H" oncommand="window.open('/xul/server/locale/<!--#echo var='locale' -->/multiclass_search_help.html','multiclass_search_help','chrome,modal,resizable');" >
+    </button>
+</hbox>
+
+<hbox id="record_query_bottom_ui">
+       <button id="record_query_list_actions" label="List Actions" type="menu" allowevents="true">
+        <menupopup id="record_query_list_actions_popup">
+               <menuitem command="sel_clip0" label="Copy Field from selected row to Clipboard" disabled="true" />
+           <menuitem command="cmd_record_query_csv_to_printer" label="Print List CSV" />
+               <menuitem command="cmd_record_query_csv_to_clipboard" label="Copy List CSV to Clipboard" accesskey=""/>
+               <menuitem command="cmd_record_query_csv_to_file" label="Save List CSV to File" accesskey=""/>
+               <menuitem command="save_columns0" label="Save List Configuration" />
+        </menupopup>
+    </button>
+       <spacer flex="1"/>
+       <button command="cmd_add_all_query_to_pending" label="Add All to Pending Records" accesskey="" image="/xul/server/skin/media/images/right_arrow.png"/>
+       <button command="cmd_add_sel_query_to_pending" label="Add Selected to Pending Records" accesskey="" image="/xul/server/skin/media/images/right_arrow.png"/>
+</hbox>
+
 <hbox id="pending_buckets_bottom_ui">
-       <button id="save_button1" command="save_columns1" label="Save Columns" />
-       <button id="clip_button1" command="sel_clip1" label="Copy to Clipboard" disabled="true" />
-       <button id="cmd_print_export_btn1" command="cmd_print_export1" label="Print CSV" />
-       <button id="cmd_export_btn1" command="cmd_export1" label="CVS to Clipboard" />
+       <button id="pending_buckets_list_actions" label="List Actions" type="menu" allowevents="true">
+        <menupopup id="pending_buckets_list_actions_popup">
+               <menuitem command="sel_clip1" label="Copy Field from selected row to Clipboard" disabled="true" />
+           <menuitem command="cmd_pending_buckets_csv_to_printer" label="Print List CSV" />
+               <menuitem command="cmd_pending_buckets_csv_to_clipboard" label="Copy List CSV to Clipboard" accesskey=""/>
+               <menuitem command="cmd_pending_buckets_csv_to_file" label="Save List CSV to File" accesskey=""/>
+               <menuitem command="save_columns1" label="Save List Configuration" />
+        </menupopup>
+    </button>
        <spacer flex="1"/>
-       <button label="Add All" id="record_buckets_add" accesskey="A" image="/xul/server/skin/media/images/down_arrow.gif"/>
-       <button label="Add Selected" id="record_buckets_sel_add" accesskey="" image="/xul/server/skin/media/images/down_arrow.gif"/>
+       <button command="cmd_add_all_pending_to_record_bucket" label="Add All to current Bucket" accesskey="A" image="/xul/server/skin/media/images/right_arrow.png"/>
+       <button command="cmd_add_sel_pending_to_record_bucket" label="Add Selected to current Bucket" accesskey="" image="/xul/server/skin/media/images/right_arrow.png"/>
 </hbox>
 
 <hbox id="record_buckets_top_ui">
-       <hbox id="record_buckets_menulist_placeholder" />
-       <button id="record_buckets_new_bucket" label="New Bucket"/>
-       <button id="record_buckets_delete_bucket" label="Delete Bucket"/>
-       <button id="refresh" label="Refresh"/>
-       <spacer flex="1"/>
-       <button id="save_button2" command="save_columns2" label="Save Columns" />
-       <button id="clip_button2" command="sel_clip2" label="Copy to Clipboard" disabled="true" />
-       <button id="record_buckets_delete_item" label="Delete Selected" disabled="true" image="/xul/server/skin/media/images/icon_delete.gif"/>
-       <button id="record_buckets_export" label="Add Selected" disabled="true" image="/xul/server/skin/media/images/up_arrow.gif"/>
+       <button command="cmd_record_buckets_delete_item" label="Remove Selected from Bucket" disabled="true" image="/xul/server/skin/media/images/icon_delete.gif"/>
+       <button command="cmd_record_buckets_to_pending_buckets" label="Add Selected to Pending Records" disabled="true" image="/xul/server/skin/media/images/left_arrow.png"/>
 </hbox>
 
 <hbox id="info_box" hidden="true" style="font-size: large;">
 </hbox>
 
 <hbox id="record_buckets_bottom_ui">
-       <button id="cmd_print_export_btn2" command="cmd_print_export2" label="Print CSV" />
-       <button id="record_buckets_export" 
-               label="CSV to Clipboard"
-               command="cmd_record_buckets_export"
-               accesskey=""/>
+       <button id="record_buckets_list_actions" label="List Actions" type="menu" allowevents="true" disabled="true">
+        <menupopup id="record_buckets_list_actions_popup">
+               <menuitem command="sel_clip2" label="Copy Field from selected row to Clipboard" disabled="true" />
+           <menuitem command="cmd_record_buckets_csv_to_printer" label="Print List CSV" />
+               <menuitem command="cmd_record_buckets_csv_to_clipboard" label="Copy List CSV to Clipboard" accesskey=""/>
+               <menuitem command="cmd_record_buckets_csv_to_file" label="Save List CSV to File" accesskey=""/>
+               <menuitem command="save_columns2" label="Save List Configuration" />
+        </menupopup>
+    </button>
        <spacer flex="1"/>
        <hbox style="background: grey">
                <vbox><spacer flex="1"/><label value="Batch:" style="font-weight: bold"/><spacer flex="1"/></vbox>
-               <button command="cmd_sel_opac" label="Show All in Catalog" accesskey="S"/>
-               <button id="record_buckets_delete_records" command="cmd_delete_records" label="Delete All Records"/>
-               <button id="record_buckets_merge_records" command="cmd_merge_records" label="Merge All Records"/>
-               <button id="record_buckets_export_records" label="Export All Records" type="menu" allowevents="true">
+               <button command="cmd_sel_opac" label="Show All in Catalog" accesskey=""/>
+               <button command="cmd_delete_records" label="Delete All Records"/>
+               <button command="cmd_merge_records" label="Merge All Records"/>
+               <button id="record_buckets_export_records" label="Export All Records" type="menu" allowevents="true" disabled="true">
                        <menupopup id="record_buckets_export_record_types" allowevents="true">
                                <menuitem command="cmd_export_records_usmarc" label="MARC21"/>
                                <menuitem command="cmd_export_records_unimarc" label="UNIMARC"/>
index 45ae03e..4dd1299 100644 (file)
@@ -34,9 +34,9 @@
                                        var copy = g.network.simple_request( 'FM_ACP_RETRIEVE_VIA_BARCODE', [ g.barcodes[i] ] );
                                        if (typeof copy.ilsevent != 'undefined') throw(copy);
                                        if (!g.volumes[ copy.call_number() ]) {
-                                               var volume = g.network.simple_request( 'FM_ACN_RETRIEVE', [ copy.call_number() ] );
+                                               var volume = g.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', [ copy.call_number() ] );
                                                if (typeof volume.ilsevent != 'undefined') throw(volume);
-                                               var record = g.network.simple_request('MODS_SLIM_RECORD_RETRIEVE', [ volume.record() ]);
+                                               var record = g.network.simple_request('MODS_SLIM_RECORD_RETRIEVE.authoritative', [ volume.record() ]);
                                                volume.record( record );
                                                g.volumes[ volume.id() ] = volume;
                                        }
index 8588348..e97a3cd 100644 (file)
@@ -31,6 +31,8 @@
        <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
        <script type="text/javascript" src="/xul/server/cat/spine_labels.js"/>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+
        <vbox id="spine_labels_main" flex="1" class="my_overflow">
                <hbox flex="1" class="my_overflow">
                <vbox>
index 715fc99..b009b86 100644 (file)
@@ -113,7 +113,7 @@ cat.util.transfer_copies = function(params) {
 
                JSAN.use('util.functional');
 
-               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE', [ params.copy_ids ]);
+               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ params.copy_ids ]);
 
                for (var i = 0; i < copies.length; i++) {
                        copies[i].call_number( data.marked_volume );
@@ -217,39 +217,36 @@ cat.util.add_copies_to_bucket = function(selection_list) {
        );
 }
 
-cat.util.spawn_copy_editor = function(list,edit) {
+cat.util.spawn_copy_editor = function(params) {
        try {
+        if (!params.copy_ids && !params.copies) return;
+               if (params.copy_ids && params.copy_ids.length == 0) return;
+               if (params.copies && params.copies.length == 0) return;
+        if (params.copy_ids) params.copy_ids = js2JSON(params.copy_ids); // legacy
+        if (!params.caller_handles_update) params.handle_update = 1; // legacy
+
                var obj = {};
                JSAN.use('util.network'); obj.network = new util.network();
                JSAN.use('util.error'); obj.error = new util.error();
        
-               if (list.length == 0) return;
-       
-               var title = list.length == 1 ? '' : 'Batch '; 
-               title += edit == 1 ? 'Edit' : 'View';
+               var title = '';
+               if ((params.copy_ids && params.copy_ids.length > 1) || (params.copies && params.copies.length > 1 )) title += 'Batch ';
+               title += params.edit == 1 ? 'Edit' : 'View';
                title += ' Copy Attributes';
        
                JSAN.use('util.window'); var win = new util.window();
-               //JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
-               //obj.data.temp_copies = undefined; obj.data.stash('temp_copies');
-               //obj.data.temp_callnumbers = undefined; obj.data.stash('temp_callnumbers');
-               //obj.data.temp_copy_ids = js2JSON(list); obj.data.stash('temp_copy_ids');
                var my_xulG = win.open(
-                       //window.xulG.url_prefix(urls.XUL_COPY_EDITOR),
                        (urls.XUL_COPY_EDITOR),
-                       //      +'?handle_update=1&edit='+edit,
                        title,
                        'chrome,modal,resizable',
-                       {
-                               'handle_update' : 1,
-                               'edit' : edit,
-                               'copy_ids' : js2JSON(list),
-                       }
+            params
                );
-               //obj.data.stash_retrieve();
-               if (!my_xulG.copies) alert('Copies not modified.');
-               //if (!obj.data.temp_copies) alert('Copies not modified.');
-               //obj.data.temp_copies = undefined; obj.data.stash('temp_copies');
+               if (!my_xulG.copies && params.edit) {
+            alert(typeof params.no_copies_modified_msg != 'undefined' ? params.no_copies_modified_msg : 'Copies not modified.');
+        } else {
+            return my_xulG.copies;
+        }
+        return [];
        } catch(E) {
                JSAN.use('util.error'); var error = new util.error();
                error.standard_unexpected_error_alert('error in cat.util.spawn_copy_editor',E);
@@ -262,7 +259,7 @@ cat.util.mark_item_damaged = function(copy_ids) {
                JSAN.use('util.error'); error = new util.error();
                JSAN.use('util.functional');
                JSAN.use('util.network'); var network = new util.network();
-               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE', [ copy_ids ]);
+               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
                if (typeof copies.ilsevent != 'undefined') throw(copies);
                var magic_status = false;
                for (var i = 0; i < copies.length; i++) {
@@ -304,7 +301,7 @@ cat.util.mark_item_missing = function(copy_ids) {
                JSAN.use('util.error'); error = new util.error();
                JSAN.use('util.functional');
                JSAN.use('util.network'); var network = new util.network();
-               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE', [ copy_ids ]);
+               var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
                if (typeof copies.ilsevent != 'undefined') throw(copies);
                var magic_status = false;
                for (var i = 0; i < copies.length; i++) {
index 8b75583..8c42e54 100644 (file)
@@ -1,4 +1,6 @@
 const g_max_copies_that_can_be_added_at_a_time_per_volume = 100;
+var g = {};
+
 function my_init() {
        try {
 
@@ -377,47 +379,25 @@ g.stash_and_close = function() {
 
                JSAN.use('util.window'); var win = new util.window();
                if (copies.length > 0) {
-                       //g.data.temp_copies = js2JSON(copies); g.data.stash('temp_copies');
-                       //g.data.temp_copy_ids = undefined; g.data.stash('temp_copy_ids');
-                       ////g.data.temp_callnumbers = js2JSON(volume_labels); g.data.stash('temp_callnumbers');
-                       //g.data.temp_callnumbers = undefined; g.data.stash('temp_callnumbers');
-                       var my_xulG = win.open(
-                               urls.XUL_COPY_EDITOR,
-                                       //+'?edit=1&handle_update=1&docid='+window.escape(g.doc_id),
-                               title,
-                               'chrome,modal,resizable',
-                               { 'edit' : 1, 'handle_update' : 1, 'docid' : g.doc_id, 'copies' : copies }
-                       );
-                       /* FIXME -- need to unique the temp space, and not rely on modalness of window */
-                       //g.data.stash_retrieve();
-                       //copies = JSON2js( g.data.temp_copies );
-                       copies = my_xulG.copies;
-                       //g.data.temp_copy_ids = undefined; g.data.stash('temp_copy_ids');
-                       //g.data.temp_copies = undefined; g.data.stash('temp_copies');
-                       //g.data.temp_callnumbers = undefined; g.data.stash('temp_callnumbers');
-                       if (!copies) {
-                               alert('Items were not created.');
-                               return;
-                       } else {
-                               try {
-                                       //case 1706 /* ITEM_BARCODE_EXISTS */ :
-                                       if (copies.length > 0 && $('print_labels').checked) {
-                                               JSAN.use('util.functional');
-                                               JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
-                                               data.temp_barcodes_for_labels = util.functional.map_list( copies, function(o){return o.barcode();}) ; 
-                                               data.stash('temp_barcodes_for_labels');
-                                               var w = win.open(
-                                                       urls.XUL_SPINE_LABEL,
-                                                       'spine_labels',
-                                                       'chrome,resizable,width=750,height=550'
-                                               );
-                                       }
-                               } catch(E) {
-                                       g.error.standard_unexpected_error_alert('volume tree update 2',E);
-                               }
-
-                       }
-               }
+                       JSAN.use('cat.util');
+            copies = cat.util.spawn_copy_editor( { 'edit' : 1, 'docid' : g.doc_id, 'copies' : copies });
+            try {
+                //case 1706 /* ITEM_BARCODE_EXISTS */ :
+                if (copies && copies.length > 0 && $('print_labels').checked) {
+                    JSAN.use('util.functional');
+                    JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
+                    data.temp_barcodes_for_labels = util.functional.map_list( copies, function(o){return o.barcode();}) ; 
+                    data.stash('temp_barcodes_for_labels');
+                    var w = win.open(
+                        urls.XUL_SPINE_LABEL,
+                        'spine_labels',
+                        'chrome,resizable,width=750,height=550'
+                    );
+                }
+            } catch(E) {
+                g.error.standard_unexpected_error_alert('volume tree update 2',E);
+            }
+       }
 
                if (typeof window.refresh == 'function') window.refresh();
 
index 085d619..f6ad773 100644 (file)
@@ -27,7 +27,7 @@
        <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
        <!-- BEHAVIOR -->
         <script type="text/javascript">
-               var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};
+               var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; 
        </script>
         <scripts id="openils_util_scripts"/>
 
index 4cf522f..094cac3 100644 (file)
@@ -13,12 +13,14 @@ cat.z3950 = function (params) {
 
 cat.z3950.prototype = {
 
-       'creds_version' : 1,
+       'creds_version' : 2,
 
     'number_of_result_sets' : 0,
 
     'result_set' : [],
 
+    'limit' : 10,
+
        'init' : function( params ) {
 
                try {
@@ -27,6 +29,8 @@ cat.z3950.prototype = {
 
                        var obj = this;
 
+            JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
+
                        obj.load_creds();
 
                        JSAN.use('circ.util');
@@ -39,8 +43,9 @@ cat.z3950.prototype = {
                                        'edition' : { 'hidden' : false },
                                        'pubdate' : { 'hidden' : false },
                                        'publisher' : { 'hidden' : false },
+                                       'service' : { 'hidden' : false }
                                }
-                       );
+            );
 
                        JSAN.use('util.list'); obj.list = new util.list('results');
                        obj.list.init(
@@ -100,6 +105,7 @@ cat.z3950.prototype = {
                                                        ['command'],
                                                        function() {
                                                                obj.save_creds();
+                                setTimeout( function() { obj.focus(); }, 0 );
                                                        }
                                                ],
                                                'marc_view' : [
@@ -137,7 +143,10 @@ cat.z3950.prototype = {
                                     var retrieve_id = obj.controller.view.marc_import.getAttribute('retrieve_id');
                                     var result_idx = retrieve_id.split('-')[0];
                                     var record_idx = retrieve_id.split('-')[1];
-                                    obj.spawn_marc_editor( obj.result_set[ result_idx ].records[ record_idx ].marcxml);
+                                    obj.spawn_marc_editor( 
+                                        obj.result_set[ result_idx ].records[ record_idx ].marcxml,
+                                        obj.result_set[ result_idx ].records[ record_idx ].service /* FIXME: we want biblio_source here */
+                                    );
                                 } catch(E) {
                                                obj.error.standard_unexpected_error_alert('Failure during marc import.',E);
                                 }
@@ -150,115 +159,171 @@ cat.z3950.prototype = {
                                     var retrieve_id = obj.controller.view.marc_import_overlay.getAttribute('retrieve_id');
                                     var result_idx = retrieve_id.split('-')[0];
                                     var record_idx = retrieve_id.split('-')[1];
-                                    obj.spawn_marc_editor_for_overlay( obj.result_set[ result_idx ].records[ record_idx ].marcxml);
+                                    obj.spawn_marc_editor_for_overlay( 
+                                        obj.result_set[ result_idx ].records[ record_idx ].marcxml,
+                                        obj.result_set[ result_idx ].records[ record_idx ].service /* FIXME: we want biblio_source here */
+                                    );
                                                                } catch(E) {
                                                obj.error.standard_unexpected_error_alert('Failure during marc import overlay.',E);
                                                                }
                                                        },
                                                ],
+                        'z3950_deck' : [ ['render'], function(e) { return function() { e.selectedIndex = 0; }; } ],
                                                'search' : [
                                                        ['command'],
                                                        function() {
+                                obj.controller.view.z3950_deck.selectedIndex = 1;
                                                                obj.initial_search();
                                                        },
                                                ],
-                                               'page_next' : [
+                                               'search_form' : [
                                                        ['command'],
                                                        function() {
-                                                               obj.page_next();
+                                obj.controller.view.z3950_deck.selectedIndex = 0;
+                                                       },
+                                               ],
+                                               'results_page' : [
+                                                       ['command'],
+                                                       function() {
+                                obj.controller.view.z3950_deck.selectedIndex = 1;
                                                        },
                                                ],
-                                               'raw_search' : [
+                                               'page_next' : [
                                                        ['command'],
                                                        function() {
-                                                               var raw = window.prompt('WARNING: This is not a simple keyword search.  Enter raw z39.50 PQN search string: ','','Raw Z39.50 PQN Search');
-                                                               if (raw) obj.initial_raw_search(raw);
+                                                               obj.page_next();
                                                        },
                                                ],
-                                               'menu_placeholder' : [
+                                               'service_rows' : [
                                                        ['render'],
                                                        function(e) {
                                                                return function() {
                                                                        try {
 
                                                                                function handle_switch(node) {
-                                                                                       var service = obj.controller.view.service_menu.value;
-                                                                                       obj.current_service = service;
-                                                                                       var nl = document.getElementsByAttribute('mytype','search_class');
-                                                                                       for (var i = 0; i < nl.length; i++) { nl[i].disabled = true; }
-                                                                                       for (var i in obj.services[service].attrs) {
-                                                                                               var x = document.getElementById(i + '_input');
-                                                                                               if (x) {
-                                                                                                       x.disabled = false;
-                                                                                               } else {
-                                                                                                       var rows = document.getElementById('query_inputs');
-                                                                                                       var row = document.createElement('row'); rows.appendChild(row);
-                                                                                                       var label = document.createElement('label');
-                                                                                                       label.setAttribute('control',i+'_input');
-                                                                                                       label.setAttribute('search_class',i);
-                                                                                                       label.setAttribute('style','-moz-user-focus: ignore');
-                                                                                                       if (entities['staff.z39_50.search_class.'+i]) {
-                                                                                                               label.setAttribute('value',entities['staff.z39_50.search_class.'+i]);
-                                                                                                       } else {
-                                                                                                               label.setAttribute('value',i);
-                                                                                                       }
-                                                                                                       row.appendChild(label);
-                                                                                                       label.addEventListener('click',function(ev){
-                                                                                                                       var a = ev.target.getAttribute('search_class');
-                                                                                                                       if (a) obj.default_attr = a;
-                                                                                                               },false
-                                                                                                       );
-                                                                                                       var tb = document.createElement('textbox');
-                                                                                                       tb.setAttribute('id',i+'_input');
-                                                                                                       tb.setAttribute('mytype','search_class');
-                                                                                                       tb.setAttribute('search_class',i);
-                                                                                                       row.appendChild(tb);
-                                                                                                       tb.addEventListener('keypress',obj.handle_enter,false);
-                                                                                               }
-                                                                                       }
-                                                                                       if (obj.creds.services[ service ]) {
-                                                                                               document.getElementById('username').setAttribute('value',
-                                                                                                       obj.creds.services[service].username
-                                                                                               );
-                                                                                               document.getElementById('password').setAttribute('value',
-                                                                                                       obj.creds.services[service].password
-                                                                                               );
-                                                                                               try { g.service = service; } catch(E) {}
-                                                                                               obj.focus(service);
-                                                                                       } else {
-                                                                                               document.getElementById('username').focus();
-                                                                                       }
+                                            try {
+                                                obj.active_services = [];
+                                                var snl = document.getElementsByAttribute('mytype','service_class');
+                                                for (var i = 0; i < snl.length; i++) {
+                                                    var n = snl[i];
+                                                    if (n.nodeName == 'checkbox') {
+                                                        if (n.checked) obj.active_services.push( n.getAttribute('service') );
+                                                    }
+                                                }
+                                                var nl = document.getElementsByAttribute('mytype','search_class');
+                                                for (var i = 0; i < nl.length; i++) { nl[i].disabled = true; }
+                                                var attrs = {};
+                                                for (var j = 0; j < obj.active_services.length; j++) {
+                                                    if (obj.services[obj.active_services[j]]) for (var i in obj.services[obj.active_services[j]].attrs) {
+                                                        var attr = obj.services[obj.active_services[j]].attrs[i];
+                                                        if (! attrs[i]) {
+                                                            attrs[i] = { 'labels' : {} };
+                                                        }
+                                                        if (attr.label) {
+                                                            attrs[i].labels[ attr.label ] = true;
+                                                        } else if (document.getElementById('commonStrings').testString('staff.z39_50.search_class.' + i)) {
+                                                            attrs[i].labels[ document.getElementById('commonStrings').getString('staff.z39_50.search_class.' + i) ] = true;
+                                                        } else if (attr.name) {
+                                                            attrs[i].labels[ attr.name ] = true;
+                                                        } else {
+                                                            attrs[i].labels[ i ] = true;
+                                                        }
+
+                                                    }
+                                                    
+                                                }
+
+                                                function set_label(x,attr) {
+                                                    var labels = [];
+                                                    for (var j in attrs[attr].labels) {
+                                                        labels.push(j);
+                                                    }
+                                                    if (labels.length > 0) {
+                                                        x.setAttribute('value',labels[0]);
+                                                        x.setAttribute('tooltiptext',labels.join(','));
+                                                        if (labels.length > 1) x.setAttribute('class','multiple_labels');
+                                                    }
+                                                }
+
+                                                for (var i in attrs) {
+                                                    var x = document.getElementById(i + '_input');
+                                                    if (x) {
+                                                        x.disabled = false;
+                                                        var y = document.getElementById(i + '_label',i);
+                                                        if (y) set_label(y,i);
+                                                    } else {
+                                                        var rows = document.getElementById('query_inputs');
+                                                        var row = document.createElement('row'); rows.appendChild(row);
+                                                        var label = document.createElement('label');
+                                                        label.setAttribute('id',i+'_label');
+                                                        label.setAttribute('control',i+'_input');
+                                                        label.setAttribute('search_class',i);
+                                                        label.setAttribute('style','-moz-user-focus: ignore');
+                                                        row.appendChild(label);
+                                                        set_label(label,i);
+                                                        label.addEventListener('click',function(ev){
+                                                                var a = ev.target.getAttribute('search_class');
+                                                                if (a) obj.default_attr = a;
+                                                            },false
+                                                        );
+                                                        var tb = document.createElement('textbox');
+                                                        tb.setAttribute('id',i+'_input');
+                                                        tb.setAttribute('mytype','search_class');
+                                                        tb.setAttribute('search_class',i);
+                                                        row.appendChild(tb);
+                                                        tb.addEventListener('keypress',function(ev) { return obj.handle_enter(ev); },false);
+                                                    }
+                                                }
+                                            } catch(E) {
+                                                                                       obj.error.standard_unexpected_error_alert('Error setting up search fields.',E);
+                                            }
                                                                                }
 
+                                        document.getElementById('native-evergreen-catalog_service').addEventListener('command',handle_switch,false);
+
                                                                                var robj = obj.network.simple_request(
                                                                                        'RETRIEVE_Z3950_SERVICES',
                                                                                        [ ses() ]
                                                                                );
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                                obj.services = robj;
-                                                                               var list = [];
+                                        var x = document.getElementById('service_rows');
                                                                                for (var i in robj) {
-                                                                                       list.push(
-                                                                                               [
-                                                                                                       i + ' : ' + robj[i].db + '@' + robj[i].host + ':' + robj[i].port,
-                                                                                                       i
-                                                                                               ]
-                                                                                       );
-                                                                               }
-                                                                               util.widgets.remove_children(e);
-                                                                               var ml = util.widgets.make_menulist( list );
-                                                                               ml.setAttribute('flex','1');
-                                                                               e.appendChild(ml);
-                                                                               ml.addEventListener(
-                                                                                       'command',
-                                                                                       function(ev) { handle_switch(ev.target); },
-                                                                                       false
-                                                                               );
-                                                                               obj.controller.view.service_menu = ml;
-                                                                               setTimeout(
+                                            var r = document.createElement('row'); x.appendChild(r);
+                                            var cb = document.createElement('checkbox'); 
+                                                if (robj[i].label) {
+                                                    cb.setAttribute('label',robj[i].label);
+                                                } else if (robj[i].name) {
+                                                    cb.setAttribute('label',robj[i].name);
+                                                } else {
+                                                    cb.setAttribute('label',i);
+                                                }
+                                                cb.setAttribute('tooltiptext',i + ' : ' + robj[i].db + '@' + robj[i].host + ':' + robj[i].port); 
+                                                cb.setAttribute('mytype','service_class'); cb.setAttribute('service',i);
+                                                cb.setAttribute('id',i+'_service'); r.appendChild(cb);
+                                                cb.addEventListener('command',handle_switch,false);
+                                            var username = document.createElement('textbox'); username.setAttribute('id',i+'_username'); 
+                                            if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[i]) username.setAttribute('value',obj.creds.hosts[ obj.data.server_unadorned ].services[i].username);
+                                            r.appendChild(username);
+                                            if (typeof robj[i].auth != 'undefined') username.hidden = ! get_bool( robj[i].auth );
+                                            var password = document.createElement('textbox'); password.setAttribute('id',i+'_password'); 
+                                            if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[i]) password.setAttribute('value',obj.creds.hosts[ obj.data.server_unadorned ].services[i].password);
+                                            password.setAttribute('type','password'); r.appendChild(password);
+                                            if (typeof robj[i].auth != 'undefined') password.hidden = ! get_bool( robj[i].auth );
+                                        }
+                                        obj.services[ 'native-evergreen-catalog' ] = { 'attrs' : { 'author' : {}, 'title' : {} } };
+                                        setTimeout(
                                                                                        function() { 
-                                                                                               if (obj.creds.default_service) ml.value = obj.creds.default_service;
-                                                                                               handle_switch(ml); 
+                                                if (obj.creds.hosts[ obj.data.server_unadorned ]) {
+                                                    for (var i = 0; i < obj.creds.hosts[ obj.data.server_unadorned ].default_services.length; i++) {
+                                                        var x = document.getElementById(obj.creds.hosts[ obj.data.server_unadorned ].default_services[i]+'_service');
+                                                        if (x) x.checked = true;
+                                                    }
+                                                } else if (obj.creds.default_service) {
+                                                    var x = document.getElementById(obj.creds.default_service+'_service');
+                                                    if (x) x.checked = true;
+                                                }
+                                                handle_switch();
                                                                                        },0
                                                                                );
                                                                        } catch(E) {
@@ -273,31 +338,32 @@ cat.z3950.prototype = {
 
                        obj.controller.render();
 
-                       obj.controller.view.username = document.getElementById('username');
-                       obj.controller.view.password = document.getElementById('password');
+            setTimeout( function() { obj.focus(); }, 0 );
 
                } catch(E) {
                        this.error.sdump('D_ERROR','cat.z3950.init: ' + E + '\n');
                }
        },
 
-       'focus' : function(service) {
+       'focus' : function() {
                var obj = this;
-               var x = obj.creds.services[service].default_attr;
-               if (x) {
-                       var xx = document.getElementById(x+'_input'); if (xx) xx.focus();
-               } else {
-                       var y;
-                       for (var i in obj.services[service].attr) { y = i; }
-                       var xx = document.getElementById(y+'_input'); if (xx) xx.focus();
-               }
+        var focus_me; var or_focus_me;
+        for (var i = 0; i < obj.active_services.length; i++) {
+            if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[ obj.active_services[i] ]) {
+                       var x = obj.creds.hosts[ obj.data.server_unadorned ].services[ obj.active_services[i] ].default_attr;
+                if (x) { focus_me = x; break; }
+            }
+            if (ob.services[ obj.active_services[i] ]) for (var i in obj.services[ obj.active_services[i] ].attr) { or_focus_me = i; }
+        }
+        if (! focus_me) focus_me = or_focus_me;
+               var xx = document.getElementById(focus_me+'_input'); if (xx) xx.focus();
        },
 
        'clear' : function() {
                var obj = this;
                var nl = document.getElementsByAttribute('mytype','search_class');
                for (var i = 0; i < nl.length; i++) { nl[i].value = ''; nl[i].setAttribute('value',''); }
-               obj.focus(obj.controller.view.service_menu.value);
+               //obj.focus(obj.controller.view.service_menu.value);
        },
 
        'search_params' : {},
@@ -309,14 +375,23 @@ cat.z3950.prototype = {
                        JSAN.use('util.widgets');
                        util.widgets.remove_children( obj.controller.view.result_message );
                        var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
+            if (obj.active_services.length < 1) {
+                           x.appendChild( document.createTextNode( 'No services selected to search.' ));
+                return;
+            }
                        x.appendChild( document.createTextNode( 'Searching...' ));
                        obj.search_params = {}; obj.list.clear();
                        obj.controller.view.page_next.disabled = true;
 
-                       obj.search_params.service = obj.controller.view.service_menu.value;
-                       obj.search_params.username = obj.controller.view.username.value;
-                       obj.search_params.password = obj.controller.view.password.value;
-                       obj.search_params.limit = 10;
+                       obj.search_params.service = []; 
+                       obj.search_params.username = [];
+                       obj.search_params.password = [];
+            for (var i = 0; i < obj.active_services.length; i++) {
+                obj.search_params.service.push( obj.active_services[i] );
+                obj.search_params.username.push( document.getElementById( obj.active_services[i]+'_username' ).value );
+                obj.search_params.password.push( document.getElementById( obj.active_services[i]+'_password' ).value );
+            }
+                       obj.search_params.limit = Math.ceil( obj.limit / obj.active_services.length );
                        obj.search_params.offset = 0;
 
                        obj.search_params.search = {};
@@ -338,31 +413,6 @@ cat.z3950.prototype = {
                }
        },
 
-       'initial_raw_search' : function(raw) {
-               try {
-                       var obj = this;
-            obj.result_set = []; obj.number_of_result_sets = 0;
-                       JSAN.use('util.widgets');
-                       util.widgets.remove_children( obj.controller.view.result_message );
-                       var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
-                       x.appendChild( document.createTextNode( 'Searching...' ) );
-                       obj.search_params = {}; obj.result_count = 0; obj.list.clear();
-                       obj.controller.view.page_next.disabled = true;
-
-                       obj.search_params.service = obj.controller.view.service_menu.value;
-                       obj.search_params.username = obj.controller.view.username.value;
-                       obj.search_params.password = obj.controller.view.password.value;
-                       obj.search_params.limit = 10;
-                       obj.search_params.offset = 0;
-
-                       obj.search_params.query = raw;
-
-                       obj.search();
-               } catch(E) {
-                       this.error.standard_unexpected_error_alert('Failure during initial raw search.',E);
-               }
-       },
-
        'page_next' : function() {
                try {
                        var obj = this;
@@ -414,50 +464,57 @@ cat.z3950.prototype = {
                                x.appendChild( document.createTextNode( 'Server Error: ' + results.textcode + ' : ' + results.desc ));
                                return;
                        }
-                       if (results.query) {
-                               x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
-                               x.appendChild( document.createTextNode( 'Raw query: ' + results.query ));
-                       }
-                       if (results.count) {
-                               if (results.records) {
-                                       x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
-                                       x.appendChild(
-                                               document.createTextNode( 'Showing ' + (obj.search_params.offset + results.records.length) + ' of ' + results.count)
-                                       );
-                               }
-                               if (obj.search_params.offset + obj.search_params.limit <= results.count) {
-                                       obj.controller.view.page_next.disabled = false;
-                               }
-                       } else {
-                                       x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
-                                       x.appendChild(
-                                               document.createTextNode( results.count + ' records found')
-                                       );
-                       }
-                       if (results.records) {
-                               obj.result_set[ ++obj.number_of_result_sets ] = results;
-                               obj.controller.view.marc_import.disabled = true;
-                               obj.controller.view.marc_import_overlay.disabled = true;
-                               var x = obj.controller.view.marc_view;
-                               if (x.getAttribute('toggle') == '0') x.disabled = true;
-                               for (var i = 0; i < obj.result_set[ obj.number_of_result_sets ].records.length; i++) {
-                                       obj.list.append(
-                                               {
-                                                       'retrieve_id' : String( obj.number_of_result_sets ) + '-' + String( i ),
-                                                       'row' : {
-                                                               'my' : {
-                                                                       'mvr' : function(a){return a;}(obj.result_set[ obj.number_of_result_sets ].records[i].mvr),
-                                                               }
-                                                       }
-                                               }
-                                       );
-                               }
-                       } else {
-                               x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
-                               x.appendChild(
-                                       document.createTextNode( 'Error retrieving results.')
-                               );
-                       }
+            if (typeof results.length == 'undefined') results = [ results ];
+            for (var i = 0; i < results.length; i++) {
+                if (results[i].query) {
+                    x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
+                    x.appendChild( document.createTextNode( 'Raw query: ' + results[i].query ));
+                }
+                if (results[i].count) {
+                    if (results[i].records) {
+                        x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
+                        var showing = obj.search_params.offset + results[i].records.length; 
+                        x.appendChild(
+                            document.createTextNode( 'Showing ' + (showing > results[i].count ? results[i].count : showing) + ' of ' + results[i].count + ' for ' + results[i].service )
+                        );
+                    }
+                    if (obj.search_params.offset + obj.search_params.limit <= results[i].count) {
+                        obj.controller.view.page_next.disabled = false;
+                    }
+                } else {
+                        x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
+                        x.appendChild(
+                            document.createTextNode( (results[i].count ? results[i].count : 0) + ' records found')
+                        );
+                }
+                if (results[i].records) {
+                    obj.result_set[ ++obj.number_of_result_sets ] = results[i];
+                    obj.controller.view.marc_import.disabled = true;
+                    obj.controller.view.marc_import_overlay.disabled = true;
+                    var x = obj.controller.view.marc_view;
+                    if (x.getAttribute('toggle') == '0') x.disabled = true;
+                    for (var j = 0; j < obj.result_set[ obj.number_of_result_sets ].records.length; j++) {
+                        var f;
+                        var n = obj.list.append(
+                            {
+                                'retrieve_id' : String( obj.number_of_result_sets ) + '-' + String( j ),
+                                'row' : {
+                                    'my' : {
+                                        'mvr' : function(a){return a;}(obj.result_set[ obj.number_of_result_sets ].records[j].mvr),
+                                        'service' : results[i].service
+                                    }
+                                }
+                            }
+                        );
+                        if (!f) { n.my_node.parentNode.focus(); f = n; } 
+                    }
+                } else {
+                    x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
+                    x.appendChild(
+                        document.createTextNode( 'Error retrieving results.')
+                    );
+                }
+            }
                } catch(E) {
                        this.error.standard_unexpected_error_alert('Failure during search result handling.',E);
                }
@@ -477,7 +534,7 @@ cat.z3950.prototype = {
                );
        },
 
-       'spawn_marc_editor' : function(my_marcxml) {
+       'spawn_marc_editor' : function(my_marcxml,biblio_source) {
                var obj = this;
                xulG.new_tab(
                        xulG.url_prefix(urls.XUL_MARC_EDIT), 
@@ -488,21 +545,21 @@ cat.z3950.prototype = {
                                        'label' : 'Import Record',
                                        'func' : function (new_marcxml) {
                                                try {
-                                                       var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml, obj.current_service ]);
+                                                       var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml, biblio_source ]);
                                                        if (typeof r.ilsevent != 'undefined') {
-                                                               switch(r.ilsevent) {
+                                                               switch(Number(r.ilsevent)) {
                                                                        case 1704 /* TCN_EXISTS */ :
                                                                                var msg = 'A record with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
                                                                                var title = 'Import Collision';
                                                                                var btn1 = 'Overlay';
                                                                                var btn2 = typeof r.payload.new_tcn == 'undefined' ? null : 'Import with alternate TCN ' + r.payload.new_tcn;
                                                                                if (btn2) {
-                                                                                       JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
+                                                                                       obj.data.init({'via':'stash'});
                                                                                        var robj = obj.network.simple_request(
                                                                                                'PERM_CHECK',[
                                                                                                        ses(),
-                                                                                                       data.list.au[0].id(),
-                                                                                                       data.list.au[0].ws_ou(),
+                                                                                                       obj.data.list.au[0].id(),
+                                                                                                       obj.data.list.au[0].ws_ou(),
                                                                                                        [ 'ALLOW_ALT_TCN' ]
                                                                                                ]
                                                                                        );
@@ -516,7 +573,7 @@ cat.z3950.prototype = {
                                                                                obj.error.sdump('D_ERROR','option ' + p + 'chosen');
                                                                                switch(p) {
                                                                                        case 0:
-                                                                                               var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml, obj.current_service ]);
+                                                                                               var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml, biblio_source ]);
                                                                                                if (typeof r3.ilsevent != 'undefined') {
                                                                                                        throw(r3);
                                                                                                } else {
@@ -528,7 +585,7 @@ cat.z3950.prototype = {
                                                                                                var r2 = obj.network.request(
                                                                                                        api.MARC_XML_RECORD_IMPORT.app,
                                                                                                        api.MARC_XML_RECORD_IMPORT.method + '.override',
-                                                                                                       [ ses(), new_marcxml, obj.current_service ]
+                                                                                                       [ ses(), new_marcxml, biblio_source ]
                                                                                                );
                                                                                                if (typeof r2.ilsevent != 'undefined') {
                                                                                                        throw(r2);
@@ -595,10 +652,10 @@ cat.z3950.prototype = {
                return true;
        },
 
-       'spawn_marc_editor_for_overlay' : function(my_marcxml) {
+       'spawn_marc_editor_for_overlay' : function(my_marcxml,biblio_source) {
                var obj = this;
-               JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
-               if (!data.marked_record) {
+               obj.data.init({'via':'stash'});
+               if (!obj.data.marked_record) {
                        alert('Please mark a record for overlay from within the catalog and try this again.');
                        return;
                }
@@ -612,10 +669,10 @@ cat.z3950.prototype = {
                                        'label' : 'Overlay Record',
                                        'func' : function (new_marcxml) {
                                                try {
-                                                       if (! obj.confirm_overlay( [ data.marked_record ] ) ) { return; }
-                                                       var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', [ ses(), data.marked_record, new_marcxml, obj.current_service ]);
+                                                       if (! obj.confirm_overlay( [ obj.data.marked_record ] ) ) { return; }
+                                                       var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]);
                                                        if (typeof r.ilsevent != 'undefined') {
-                                                               switch(r.ilsevent) {
+                                                               switch(Number(r.ilsevent)) {
                                                                        case 1704 /* TCN_EXISTS */ :
                                                                                var msg = 'A record with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
                                                                                var title = 'Import Collision';
@@ -624,8 +681,8 @@ cat.z3950.prototype = {
                                                                                        var robj = obj.network.simple_request(
                                                                                                'PERM_CHECK',[
                                                                                                        ses(),
-                                                                                                       data.list.au[0].id(),
-                                                                                                       data.list.au[0].ws_ou(),
+                                                                                                       obj.data.list.au[0].id(),
+                                                                                                       obj.data.list.au[0].ws_ou(),
                                                                                                        [ 'ALLOW_ALT_TCN' ]
                                                                                                ]
                                                                                        );
@@ -642,7 +699,7 @@ cat.z3950.prototype = {
                                                                                                var r2 = obj.network.request(
                                                                                                        api.MARC_XML_RECORD_REPLACE.app,
                                                                                                        api.MARC_XML_RECORD_REPLACE.method + '.override',
-                                                                                                       [ ses(), data.marked_record, new_marcxml, obj.current_service ]
+                                                                                                       [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]
                                                                                                );
                                                                                                if (typeof r2.ilsevent != 'undefined') {
                                                                                                        throw(r2);
@@ -678,7 +735,7 @@ cat.z3950.prototype = {
        'load_creds' : function() {
                var obj = this;
                try {
-                       obj.creds = { 'version' : g.save_version, 'services' : {} };
+                       obj.creds = { 'version' : g.save_version, 'services' : {}, 'hosts' : {} };
                        /*
                                {
                                        'version' : xx,
@@ -697,6 +754,26 @@ cat.z3950.prototype = {
                                                        'default_attr' : xx,
                                                },
                                        },
+                    // new in version 2
+                    'hosts' : {
+                        'xxxx' : {
+                            'default_services' : [ xx, ... ],
+                            'services' : {
+
+                                'xx' : {
+                                    'username' : xx,
+                                    'password' : xx,
+                                    'default_attr' : xx,
+                                },
+
+                                'xx' : {
+                                    'username' : xx,
+                                    'password' : xx,
+                                    'default_attr' : xx,
+                                },
+                            },
+                        }
+                    }
                                }
                        */
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
@@ -704,7 +781,8 @@ cat.z3950.prototype = {
                        if (file._file.exists()) {
                                var creds = file.get_object(); file.close();
                                if (typeof creds.version != 'undefined') {
-                                       if (creds.version >= obj.creds_version) {
+                                       if (creds.version >= obj.creds_version) {  /* so apparently, this guy is assuming that future versions will be backwards compatible */
+                        if (typeof creds.hosts == 'undefined') creds.hosts = {};
                                                obj.creds = creds;
                                        }
                                }
@@ -717,15 +795,20 @@ cat.z3950.prototype = {
        'save_creds' : function () {
                try {
                        var obj = this;
-                       obj.creds.default_service = obj.controller.view.service_menu.value;
-                       if (typeof obj.creds.services[ obj.creds.default_service ] == 'undefined') {
-                               obj.creds.services[ obj.creds.default_service ] = {}
-                       }
-                       obj.creds.services[obj.creds.default_service].username = document.getElementById('username').value;
-                       obj.creds.services[obj.creds.default_service].password = document.getElementById('password').value;
-                       if (obj.default_attr) {
-                               obj.creds.services[obj.creds.default_service].default_attr = obj.default_attr;
-                       }
+            if (typeof obj.creds.hosts == 'undefined') obj.creds.hosts = {};
+            if (typeof obj.creds.hosts[ obj.data.server_unadorned ] == 'undefined') obj.creds.hosts[ obj.data.server_unadorned ] = { 'services' : {} };
+            obj.creds.hosts[ obj.data.server_unadorned ].default_services = obj.active_services;
+            for (var i = 0; i < obj.creds.hosts[ obj.data.server_unadorned ].default_services.length; i++) {
+                           var service = obj.creds.hosts[ obj.data.server_unadorned ].default_services[i];
+                       if (typeof obj.creds.hosts[ obj.data.server_unadorned ].services[ service ] == 'undefined') {
+                    obj.creds.hosts[ obj.data.server_unadorned ].services[ service ] = {}
+                       }
+                       obj.creds.hosts[ obj.data.server_unadorned ].services[service].username = document.getElementById(service + '_username').value;
+                       obj.creds.hosts[ obj.data.server_unadorned ].services[service].password = document.getElementById(service + '_password').value;
+                       if (obj.default_attr) {
+                               obj.creds.hosts[ obj.data.server_unadorned ].services[service].default_attr = obj.default_attr;
+                       }
+            }
                        obj.creds.version = obj.creds_version;
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                        JSAN.use('util.file'); var file = new util.file('z3950_store');
@@ -739,7 +822,7 @@ cat.z3950.prototype = {
        'handle_enter' : function(ev) {
                var obj = this;
                if (ev.target.tagName != 'textbox') return;
-               if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.initial_search(); }, 0);
+               if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.controller.view.z3950_deck.selectedIndex = 1; obj.initial_search(); }, 0);
        },
 }
 
index 63abbc2..e72e089 100644 (file)
@@ -75,6 +75,8 @@
        ]]>
        </script>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+
        <commandset id="cat_z3950_cmds">
                <command id="cmd_broken" />
                <command id="cmd_export" />
 
        <groupbox flex="1">
                <caption label="MARC Import via Z39.50"/>
-               <groupbox orient="horizontal">
-                       <caption id="c2" label="Service and Credentials" class="shrinkable_groupbox"/>
-                       <label value="Service:" />
-                       <hbox id="menu_placeholder" flex="1"/>
-                       <label value="Username:" control="username" accesskey="U"/>
-                       <textbox id="username" />
-                       <label value="Password:" control="password"/>
-                       <textbox id="password" />
-                       <button id="save_creds" label="Save as Default" accesskey="D"/>
-               </groupbox>
-               <groupbox>
-                       <caption label="Query" class="shrinkable_groupbox"/>
-                       <hbox>
-                               <spacer flex="1"/>
-                               <description>
-                                       Tip: Click a search field label and then the "Save as Default" button to have that field focused by default.
-                               </description>
-                               <spacer flex="1"/>
-                       </hbox>
-                       <grid>
-                               <columns><column /><column flex="1" /><column /><column flex="1"/><column /><column flex="1"/></columns>
-                               <rows id="query_inputs">
-                                       <row>
-                                               <label value="&staff.z39_50.search_class.tcn;" control="tcn_input" onclick="g.z3950.default_attr = 'tcn'" accesskey="0" style="-moz-user-focus: ignore"/>
-                                               <textbox id="tcn_input" mytype="search_class" search_class="tcn" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.isbn;" control="isbn_input" onclick="g.z3950.default_attr = 'isbn'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="isbn_input" mytype="search_class" search_class="isbn" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.issn;" control="issn_input" onclick="g.z3950.default_attr = 'issn'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="issn_input" mytype="search_class" search_class="issn" onkeypress="handle_enter(event)"/>
-                                       </row>
-                                       <row>
-                                               <label value="&staff.z39_50.search_class.title;" control="title_input" onclick="g.z3950.default_attr = 'title'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="title_input" mytype="search_class" search_class="title" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.author;" control="author_input" onclick="g.z3950.default_attr = 'author'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="author_input" mytype="search_class" search_class="author" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.lccn;" control="lccn_input" onclick="g.z3950.default_attr = 'lccn'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="lccn_input" mytype="search_class" search_class="lccn" onkeypress="handle_enter(event)"/>
-                                       </row>
-                                       <row>
-                                               <label value="&staff.z39_50.search_class.pubdate;" control="pubdate_input" onclick="g.z3950.default_attr = 'pubdate'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="pubdate_input" mytype="search_class" search_class="pubdate" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.publisher;" control="publisher_input" onclick="g.z3950.default_attr = 'publisher'" style="-moz-user-focus: ignore"/>
-                                               <textbox id="publisher_input" mytype="search_class" search_class="publisher" onkeypress="handle_enter(event)"/>
-                                               <label value="&staff.z39_50.search_class.item_type;" control="item_type_input" onclick="g.z3950.default_attr = 'item_type'" style="-moz-user-focus: ignore"/>
-                                               <menulist id="item_type_input" mytype="search_class" search_class="item_type">
-                                                       <menupopup>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.all;" value=""/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.bks;" value="bks"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.ser;" value="ser"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.vis;" value="vis"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.rec;" value="rec"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.sco;" value="sco"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.map;" value="map"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.com;" value="com"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.mix;" value="mix"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.url;" value="url"/>
-                                                               <menuitem label="&staff.z39_50.search_class.item_type.art;" value="art"/>
-                                                       </menupopup>
-                                               </menulist>
-                                       </row>
-                               </rows>
-                       </grid>
-                       <spacer flex="1"/>
-                       <hbox>
-                               <button id="raw_search" label="Raw Search" accesskey="w"/>
-                               <spacer flex="1"/>
-                               <button id="clear" label="Clear Form" accesskey="C"/>
-                               <button id="search" label="Search" accesskey="S"/>
-                       </hbox>
-               </groupbox>
-               <splitter><grippy/></splitter>
-               <groupbox flex="1">
-                       <caption label="Results" />
-                       <vbox id="result_message" />
-                       <hbox>
-                               <button id="page_next" label="Fetch More Results" accesskey="M" disabled="true"/>
-                               <button id="export" label="Export" command="cmd_export" accesskey=""/>
-                               <button id="clip_button" command="sel_clip" label="Copy to Clipboard" disabled="true"/>
-                               <button id="save_cols_btn" command="save_columns" label="Save Columns" />
-                               <spacer flex="1"/>
-                               <button id="marc_view" label="MARC View" accesskey="V" disabled="true"/>
-                               <button id="marc_import_overlay" label="MARC Editor for Overlay" accesskey="O" disabled="true"/>
-                               <button id="marc_import" label="MARC Editor for Import" accesskey="I" disabled="true"/>
-                       </hbox>
-                       <deck id="deck" flex="1">
-                               <tree id="results" flex="1" enableColumnDrag="true" seltype="single"/>
-                               <iframe id="marc_frame" src="/xul/server/cat/marc_view.html" flex="1"/>
-                       </deck>
-               </groupbox>
-       </groupbox>
+        <deck id="z3950_deck" flex="1">
+            <hbox id="top_pane" persist="height" flex="1">
+                <vbox id="top_left_pane" persist="width" flex="1">
+                    <groupbox id="first_pane" flex="1" class="my_overflow">
+                        <caption id="c2" label="Service and Credentials" class="shrinkable_groupbox"/>
+                        <grid flex="1">
+                            <columns>
+                                <column/>
+                                <column/>
+                                <column/>
+                            </columns>
+                            <rows id="service_rows">
+                                <row>
+                                    <label value="Service"/>
+                                    <label value="Username"/>
+                                    <label value="Password"/>
+                                </row>
+                                <row>
+                                    <checkbox id="native-evergreen-catalog_service" mytype="service_class" service="native-evergreen-catalog" label="Local Catalog" tooltiptext="Evergreen Native Catalog" /> 
+                                    <textbox id="native-evergreen-catalog_username" hidden="true"/>
+                                    <textbox id="native-evergreen-catalog_password" type="password" hidden="true"/>
+                                </row>
+                            </rows>
+                        </grid>
+                    </groupbox>
+                    <hbox>
+                        <button id="save_creds" label="Save as Default" accesskey="D"/>
+                    </hbox>
+                </vbox>
+                <splitter collapse="before"><grippy/></splitter>
+                <vbox id="top_right_pane" persist="width" flex="1">
+                    <groupbox id="second_pane" flex="1" class="my_overflow">
+                        <caption label="Query" class="shrinkable_groupbox"/>
+                        <hbox>
+                            <spacer flex="1"/>
+                            <description>
+                                Tip: Click a search field label and then the "Save as Default" button to have that field focused by default.
+                            </description>
+                            <spacer flex="1"/>
+                        </hbox>
+                        <grid>
+                            <columns><column /><column flex="1" /></columns>
+                            <rows id="query_inputs">
+                            <!--
+                                <row>
+                                    <label id="tcn_label" value="&staff.z39_50.search_class.tcn;" control="tcn_input" onclick="g.z3950.default_attr = 'tcn'" accesskey="0" style="-moz-user-focus: ignore"/>
+                                    <textbox id="tcn_input" mytype="search_class" search_class="tcn" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="isbn_label" value="&staff.z39_50.search_class.isbn;" control="isbn_input" onclick="g.z3950.default_attr = 'isbn'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="isbn_input" mytype="search_class" search_class="isbn" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="issn_label" value="&staff.z39_50.search_class.issn;" control="issn_input" onclick="g.z3950.default_attr = 'issn'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="issn_input" mytype="search_class" search_class="issn" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="title_label" value="&staff.z39_50.search_class.title;" control="title_input" onclick="g.z3950.default_attr = 'title'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="title_input" mytype="search_class" search_class="title" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="author_label" value="&staff.z39_50.search_class.author;" control="author_input" onclick="g.z3950.default_attr = 'author'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="author_input" mytype="search_class" search_class="author" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="lccn_label" value="&staff.z39_50.search_class.lccn;" control="lccn_input" onclick="g.z3950.default_attr = 'lccn'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="lccn_input" mytype="search_class" search_class="lccn" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="pubdate_label" value="&staff.z39_50.search_class.pubdate;" control="pubdate_input" onclick="g.z3950.default_attr = 'pubdate'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="pubdate_input" mytype="search_class" search_class="pubdate" onkeypress="handle_enter(event)"/>
+                                </row><row>
+                                    <label id="publisher_label" value="&staff.z39_50.search_class.publisher;" control="publisher_input" onclick="g.z3950.default_attr = 'publisher'" style="-moz-user-focus: ignore"/>
+                                    <textbox id="publisher_input" mytype="search_class" search_class="publisher" onkeypress="handle_enter(event)"/>
+                                </row>
+                            -->
+                                <row>
+                                    <label id="item_type_label" value="&staff.z39_50.search_class.item_type;" control="item_type_input" onclick="g.z3950.default_attr = 'item_type'" style="-moz-user-focus: ignore"/>
+                                    <menulist id="item_type_input" mytype="search_class" search_class="item_type">
+                                        <menupopup>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.all;" value=""/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.bks;" value="bks"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.ser;" value="ser"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.vis;" value="vis"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.rec;" value="rec"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.sco;" value="sco"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.map;" value="map"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.com;" value="com"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.mix;" value="mix"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.url;" value="url"/>
+                                            <menuitem label="&staff.z39_50.search_class.item_type.art;" value="art"/>
+                                        </menupopup>
+                                    </menulist>
+                                </row>
+                            </rows>
+                        </grid>
+                    </groupbox>
+                    <hbox>
+                        <button id="clear" label="Clear Form" accesskey="C"/>
+                        <button id="search" label="Search" accesskey="S"/>
+                        <spacer flex="1"/>
+                        <button id="results_page" label="Results Page" accesskey="P"/>
+                    </hbox>
+                </vbox>
+            </hbox>
+            <groupbox flex="1" id="third_pane" persist="height">
+                <caption label="Results" />
+                <hbox id="result_message" />
+                <hbox>
+                    <button id="search_form" label="Search Form" accesskey="F" />
+                    <button id="page_next" label="Fetch More Results" accesskey="M" disabled="true"/>
+                    <button id="export" label="CSV to Clipboard" command="cmd_export" accesskey=""/>
+                    <button id="clip_button" command="sel_clip" label="Copy to Clipboard" disabled="true"/>
+                    <button id="save_cols_btn" command="save_columns" label="Save Columns" />
+                    <spacer flex="1"/>
+                    <button id="marc_view" label="MARC View" accesskey="V" disabled="true"/>
+                    <button id="marc_import_overlay" label="MARC Editor for Overlay" accesskey="O" disabled="true"/>
+                    <button id="marc_import" label="MARC Editor for Import" accesskey="I" disabled="true"/>
+                </hbox>
+                <deck id="deck" flex="1">
+                    <tree id="results" flex="1" enableColumnDrag="true" seltype="single"/>
+                    <iframe id="marc_frame" src="/xul/server/cat/marc_view.html" flex="1"/>
+                </deck>
+            </groupbox>
+       </deck>
+    </groupbox>
 
 </window>
 
index 5068821..080f616 100644 (file)
@@ -29,10 +29,10 @@ circ.checkin.prototype = {
                                'status' : { 'hidden' : false },
                                'route_to' : { 'hidden' : false },
                                'alert_message' : { 'hidden' : false },
-                               'checkin_time' : { 'hidden' : false },
+                               'checkin_time' : { 'hidden' : false }
                        },
                        {
-                               'except_these' : [ 'uses', 'checkin_time_full' ],
+                               'except_these' : [ 'uses', 'checkin_time_full' ]
                        }
                );
 
@@ -76,8 +76,7 @@ circ.checkin.prototype = {
                                        } catch(E) {
                                                alert('FIXME: ' + E);
                                        }
-                               },
-
+                               }
                        }
                );
                
@@ -137,7 +136,7 @@ circ.checkin.prototype = {
                                                                if (circs.length > 0) {
                                                                        patrons[circs[0].usr()] = 1;
                                                                } else {
-                                                                       alert('Item ' + obj.selection_list[i].barcode + ' has never circulated');
+                                                                       alert(document.getElementById('circStrings').getFormattedString('staff.circ.item_no_circs', [obj.selection_list[i].barcode]));
                                                                }
                                                        }
                                                        for (var i in patrons) {
@@ -201,23 +200,23 @@ circ.checkin.prototype = {
                                                                                throw('invalid date format');
                                                                        }
                                                                        var d = new Date( year, month - 1, day );
-                                                                       if (d.toString() == 'Invalid Date') throw('Invalid Date');
-                                                                       if ( d > new Date() ) throw('Future Date');
+                                                                       if (d.toString() == 'Invalid Date') throw(document.getElementById('circStrings').getString('staff.circ.invalid_date'));
+                                                                       if ( d > new Date() ) throw(document.getElementById('circStrings').getString('staff.circ.future_date'));
                                                                        ev.target.value = util.date.formatted_date(d,'%F');
                                                                        var x = document.getElementById('background');
                                                                        if (x) {
                                                                                if ( ev.target.value == util.date.formatted_date(new Date(),'%F') ) {
                                                                                        x.setAttribute('style','background-color: green');
-                                                                                       document.getElementById('background-text').setAttribute('value','Check In / Process Item');
+                                                                                       document.getElementById('background-text').setAttribute('value',document.getElementById('circStrings').getString('staff.circ.process_item'));
                                                                                } else {
                                                                                        x.setAttribute('style','background-color: red');
-                                                                                       document.getElementById('background-text').setAttribute('value','Backdated ' + ev.target.value + ' Check In');
+                                                                                       document.getElementById('background-text').setAttribute('value',document.getElementById('circStrings').getFormattedString('staff.circ.backdated_checkin', [ev.target.value]));
                                                                                }
                                                                        }
 
                                                                } catch(E) {
                                                                        dump('checkin:effective_date: ' + E + '\n');
-                                                                       alert('Problem setting backdate: ' + E);
+                                                                       alert(document.getElementById('circStrings').getFormattedString('staff.circ.backdate.exception', [E]));
                                                                        ev.target.value = util.date.formatted_date(new Date(),'%F');
                                                                }
                                                        }
@@ -225,7 +224,7 @@ circ.checkin.prototype = {
                                        ],
                                        'cmd_broken' : [
                                                ['command'],
-                                               function() { alert('Not Yet Implemented'); }
+                                               function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
                                        ],
                                        'cmd_checkin_submit_barcode' : [
                                                ['command'],
@@ -260,7 +259,7 @@ circ.checkin.prototype = {
                                                ['command'],
                                                function() {
                                                }
-                                       ],
+                                       ]
                                }
                        }
                );
@@ -278,12 +277,12 @@ circ.checkin.prototype = {
                        return true;
                } else {
                        if ( 1 == obj.error.yns_alert(
-                                               'Bad checkdigit; possible mis-scan.  Use this barcode ("' + bc + '") anyway?',
-                                               'Bad Barcode',
-                                               'Cancel',
-                                               'Accept Barcode',
+                                               document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
                                                null,
-                                               'Check here to confirm this action',
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
                                                '/xul/server/skin/media/images/bad_barcode.png'
                        ) ) {
                                return true;
@@ -323,15 +322,15 @@ circ.checkin.prototype = {
                                }
                        );
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Something went wrong in circ.util.checkin: ',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.exception', [E]));
                        if (typeof obj.on_failure == 'function') {
                                obj.on_failure(E);
                        }
                        if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
-                               obj.error.sdump('D_CIRC','circ.util.checkin: Calling external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.util.checkin.exception.external') + '\n');
                                window.xulG.on_failure(E);
                        } else {
-                               obj.error.sdump('D_CIRC','circ.util.checkin: No external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.util.checkin.exception.no_external') + '\n');
                        }
                }
 
@@ -365,10 +364,10 @@ circ.checkin.prototype = {
                                                        'acp' : checkin.copy,
                                                        'status' : checkin.status,
                                                        'route_to' : checkin.route_to,
-                                                       'message' : checkin.message,
+                                                       'message' : checkin.message
                                                }
                                        },
-                                       'to_top' : true,
+                                       'to_top' : true
                                //I could override map_row_to_column here
                                }
                        );
@@ -380,24 +379,24 @@ circ.checkin.prototype = {
                                obj.on_checkin(checkin);
                        }
                        if (typeof window.xulG == 'object' && typeof window.xulG.on_checkin == 'function') {
-                               obj.error.sdump('D_CIRC','circ.checkin: Calling external .on_checkin()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.checkin.exception.external') + '\n');
                                window.xulG.on_checkin(checkin);
                        } else {
-                               obj.error.sdump('D_CIRC','circ.checkin: No external .on_checkin()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.checkin.exception.no_external') + '\n');
                        }
 
                        return true;
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Something went wrong in circ.util.checkin2: ',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin2.exception', [E]));
                        if (typeof obj.on_failure == 'function') {
                                obj.on_failure(E);
                        }
                        if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
-                               obj.error.sdump('D_CIRC','circ.util.checkin2: Calling external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.checkin2.exception.external') + '\n');
                                window.xulG.on_failure(E);
                        } else {
-                               obj.error.sdump('D_CIRC','circ.util.checkin2: No external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', document.getElementById('circStrings').getString('staff.circ.checkin2.exception.no_external') + '\n');
                        }
                }
 
@@ -418,11 +417,9 @@ circ.checkin.prototype = {
        
        'spawn_copy_editor' : function() {
 
-               /* FIXME -  a lot of redundant calls here */
-
                var obj = this;
 
-               JSAN.use('util.widgets'); JSAN.use('util.functional');
+               JSAN.use('util.functional');
 
                var list = obj.selection_list;
 
@@ -433,37 +430,9 @@ circ.checkin.prototype = {
                        }
                );
 
-               var copies = util.functional.map_list(
-                       list,
-                       function (acp_id) {
-                               return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
-                       }
-               );
-
-               var edit = 0;
-               try {
-                       edit = obj.network.request(
-                               api.PERM_MULTI_ORG_CHECK.app,
-                               api.PERM_MULTI_ORG_CHECK.method,
-                               [ 
-                                       ses(), 
-                                       obj.data.list.au[0].id(), 
-                                       util.functional.map_list(
-                                               copies,
-                                               function (o) {
-                                                       return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
-                                               }
-                                       ),
-                                       copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                               ]
-                       ).length == 0 ? 1 : 0;
-               } catch(E) {
-                       obj.error.sdump('D_ERROR','batch permission check: ' + E);
-               }
-
-               JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
+               JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
 
-       },
+       }
 
 }
 
index 1f34f5c..2a1686a 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                        document.getElementById('checkin_auto').checked = true;
                                        document.getElementById('checkin_auto').hidden = true;
                                        document.getElementById('checkin_effective_date_hbox').hidden = true;
-                                       document.getElementById('caption').setAttribute('label','Hold Capture');
+                                       document.getElementById('caption').setAttribute('label',document.getElementById('circStrings').getString('staff.circ.checkin.hold_capture'));
                                        document.getElementById('hold_capture_blurb').hidden = false;
-                                       tab_name = 'Hold Capture';
+                                       tab_name = document.getElementById('circStrings').getString('staff.circ.checkin.hold_capture');
                                } else {
-                                       tab_name = 'Item Check In';
+                                       tab_name = document.getElementById('circStrings').getString('staff.circ.checkin.check_in.tab');
                                }
 
                                JSAN.use('circ.checkin'); g.checkin = new circ.checkin();
@@ -64,9 +64,7 @@
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'circ.checkin.xul\n' + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ.checkin.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -99,6 +97,9 @@
 
        </commandset>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties"/>
+
        <box id="checkin_main" />
 
 </window>
index ceb3bb8..39d8715 100644 (file)
@@ -1,7 +1,10 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- LOCALIZATION -->
 <!DOCTYPE overlay PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
+
 <overlay id="checkin_overlay" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
 
 <popupset id="copy_status_popupset">
        <popup id="copy_status_actions" position="at_pointer"> 
-               <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-               <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-               <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-               <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-               <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
-               <menuitem command="sel_last_patron" label="Retrieve Last Patron who circulated item" accesskey="R"/>
+               <menuitem command="sel_clip" label="&staff.circ.checkin_overlay.sel_clip.label;" accesskey="&staff.circ.checkin_overlay.sel_clip.accesskey;" />
+               <menuitem command="sel_bucket" label="&staff.circ.checkin_overlay.sel_bucket.label;" accesskey="&staff.circ.checkin_overlay.sel_bucket.accesskey;"/>
+               <menuitem command="sel_opac" label="&staff.circ.checkin_overlay.sel_opac.label;" accesskey="&staff.circ.checkin_overlay.sel_opac.accesskey;" />
+               <menuitem command="sel_copy_details" label="&staff.circ.checkin_overlay.sel_copy_details.label;" accesskey="&staff.circ.checkin_overlay.sel_copy_details.accesskey;" />
+               <menuitem command="sel_patron" label="&staff.circ.checkin_overlay.sel_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_patron.accesskey;"/>
+               <menuitem command="sel_last_patron" label="&staff.circ.checkin_overlay.sel_last_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_last_patron.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
+               <menuitem command="sel_edit" label="&staff.circ.checkin_overlay.sel_edit.label;" accesskey="&staff.circ.checkin_overlay.sel_edit.accesskey;" />
                <menuseparator />
-               <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
+               <menuitem command="sel_mark_items_damaged" label="&staff.circ.checkin_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey;"/>
                <menuseparator />
-               <menuitem command="sel_transit_abort" label="Abort Transit" />
+               <menuitem command="sel_transit_abort" label="&staff.circ.checkin_overlay.sel_transit_abort.label;" />
                <menuseparator />
-               <menuitem command="sel_spine" label="Print Spine Label" accesskey="P"/>
-               <menuitem command="save_columns" label="Save Columns"/>
+               <menuitem command="sel_spine" label="&staff.circ.checkin_overlay.sel_spine.label;" accesskey="&staff.circ.checkin_overlay.sel_spine.accesskey;"/>
+               <menuitem command="save_columns" label="&staff.circ.checkin_overlay.save_columns.label;"/>
        </popup>
 </popupset>
 
@@ -37,8 +40,8 @@
        <hbox id="background" style="background-color: green;">
                <spacer flex="1"/>
                <vbox>
-                       <label id="background-text" value="Check In / Process Item" style="font-size: x-large; font-weight: bold;"/>
-                       <label id="hold_capture_blurb" hidden="true" value="(and Auto-Print Hold/Transit Slips)" style="font-size: large; font-weight: bold;"/>
+                       <label id="background-text" value="&staff.circ.checkin_overlay.background_text;" style="font-size: x-large; font-weight: bold;"/>
+                       <label id="hold_capture_blurb" hidden="true" value="&staff.circ.checkin_overlay.background_text.hold_capture;" style="font-size: large; font-weight: bold;"/>
                </vbox>
                <spacer flex="1"/>
        </hbox>
        <vbox>
                <hbox>
                        <hbox id="checkin_effective_date_hbox">
-                               <label id="checkin_effective_date_label" value="Effective Date:" control="checkin_effective_date_textbox" accesskey="D"/>
+                               <label id="checkin_effective_date_label" value="&staff.circ.checkin_overlay.effective_date.label;" control="checkin_effective_date_textbox" accesskey="D"/>
                                <textbox id="checkin_effective_date_textbox"/>
                        </hbox>
                        <menubar>
-                       <menu label="Actions for Selected Items" accesskey="S">
+                       <menu label="&staff.circ.checkin_overlay.actions.label;" accesskey="&staff.circ.checkin_overlay.actions.accesskey;">
                                <menupopup>
-                                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-                                       <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-                                       <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-                                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
-                                       <menuitem command="sel_last_patron" label="Retrieve Last Patron who circulated item" accesskey="R"/>
-                                       <menuseparator />
-                                       <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
+                                       <menuitem command="sel_clip" label="&staff.circ.checkin_overlay.sel_clip.label;" accesskey="&staff.circ.checkin_overlay.sel_clip.accesskey;" />
+                                       <menuitem command="sel_bucket" label="&staff.circ.checkin_overlay.sel_bucket.label;" accesskey="&staff.circ.checkin_overlay.sel_bucket.accesskey;"/>
+                                       <menuitem command="sel_opac" label="&staff.circ.checkin_overlay.sel_opac.label;" accesskey="&staff.circ.checkin_overlay.sel_opac.accesskey;" />
+                                       <menuitem command="sel_copy_details" label="&staff.circ.checkin_overlay.sel_copy_details.label;" accesskey="&staff.circ.checkin_overlay.sel_copy_details.accesskey;" />
+                                       <menuitem command="sel_patron" label="&staff.circ.checkin_overlay.sel_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_patron.accesskey;"/>
+                                       <menuitem command="sel_last_patron" label="&staff.circ.checkin_overlay.sel_last_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_last_patron.accesskey;"/>
+                                       <menuseparator/>
+                                       <menuitem command="sel_edit" label="&staff.circ.checkin_overlay.sel_edit.label;" accesskey="&staff.circ.checkin_overlay.sel_edit.accesskey;" />
                                        <menuseparator />
-                                       <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
+                                       <menuitem command="sel_mark_items_damaged" label="&staff.circ.checkin_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey;"/>
                                        <menuseparator />
-                                       <menuitem command="sel_transit_abort" label="Abort Transit" />
+                                       <menuitem command="sel_transit_abort" label="&staff.circ.checkin_overlay.sel_transit_abort.label;" />
                                        <menuseparator />
-                                       <menuitem command="sel_spine" label="Print Spine Label" accesskey="P"/>
-                                       <menuitem command="save_columns" label="Save Columns"/>
+                                       <menuitem command="sel_spine" label="&staff.circ.checkin_overlay.sel_spine.label;" accesskey="&staff.circ.checkin_overlay.sel_spine.accesskey;"/>
+                                       <menuitem command="save_columns" label="&staff.circ.checkin_overlay.save_columns.label;"/>
                                </menupopup>
                        </menu>
                        </menubar>
                command="cmd_checkin_print"
                accesskey="&staff.checkin.print_receipt_label.accesskey;"/>
        <button id="checkin_export" 
-               label="Export"
+               label="&staff.circ.checkin_overlay.checkin_export.label;"
                command="cmd_checkin_export"
                accesskey=""/>
-       <checkbox id="trim_list" label="Trim List (20 rows)" checked="true" persist="checked"/> 
-       <checkbox id="strict_barcode" label="Strict Barcode" checked="false" persist="checked"/> 
-       <checkbox id="do_not_alert_on_precat" label="Don't Alert on Pre-Cat" persist="checked"/> 
+       <checkbox id="trim_list" label="&staff.circ.checkin_overlay.trim_list.label;" checked="true" persist="checked"/> 
+       <checkbox id="strict_barcode" label="&staff.circ.checkin_overlay.strict_barcode.label;" checked="false" persist="checked"/> 
+       <checkbox id="do_not_alert_on_precat" label="&staff.circ.checkin_overlay.do_not_alert_on_precat.label;" persist="checked"/> 
        <spacer id="pcii3s" flex="1"/>
-       <checkbox id="checkin_auto" label="Auto-Print for Hold/Transit Slips" accesskey="P" persist="checked"/> 
+       <checkbox id="checkin_auto" label="&staff.circ.checkin_overlay.checkin_auto.label;" accesskey="&staff.circ.checkin_overlay.checkin_auto.accesskey;" persist="checked"/> 
 </hbox>
 
 </overlay>
index 6753f3c..6f21e3e 100644 (file)
@@ -1,13 +1,13 @@
 dump('entering circ.checkout.js\n');
 
-if (typeof circ == 'undefined') circ = {};
+if (typeof circ == 'undefined') { circ = {}; }
 circ.checkout = function (params) {
 
        JSAN.use('util.error'); this.error = new util.error();
        JSAN.use('util.network'); this.network = new util.network();
        JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
        JSAN.use('util.barcode');
-}
+};
 
 circ.checkout.prototype = {
 
@@ -15,14 +15,14 @@ circ.checkout.prototype = {
 
                var obj = this;
 
-               obj.patron_id = params['patron_id'];
+               obj.patron_id = params.patron_id;
 
                JSAN.use('circ.util');
                var columns = circ.util.columns( 
                        { 
                                'barcode' : { 'hidden' : false },
                                'title' : { 'hidden' : false },
-                               'due_date' : { 'hidden' : false },
+                               'due_date' : { 'hidden' : false }
                        } 
                );
 
@@ -52,10 +52,10 @@ circ.checkout.prototype = {
                                                function(e) {
                                                        return function() {
                                                                JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
-                                                               var items = [ [ 'Barcode:' , 'barcode' ] ].concat(
+                                                               var items = [ [ document.getElementById('circStrings').getString('staff.circ.checkout.barcode') , 'barcode' ] ].concat(
                                                                        util.functional.map_list(
                                                                                util.functional.filter_list(
-                                                                                       obj.data.list.cnct,
+                                                                                       obj.data.list.my_cnct,
                                                                                        function(o) {
                                                                                                return util.fm_utils.compare_aou_a_is_b_or_ancestor(o.owning_lib(), obj.data.list.au[0].ws_ou());
                                                                                        }
@@ -68,7 +68,7 @@ circ.checkout.prototype = {
                                                                                                                [ b.owning_lib(), b.name() ]
                                                                                                        );
                                                                                                } catch(E) {
-                                                                                                       alert('error in noncat sorting: ' + E);
+                                                                                                       alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkout.sorting.exception', [E]));
                                                                                                        return 0;
                                                                                                }
                                                                                        }
@@ -81,9 +81,7 @@ circ.checkout.prototype = {
                                                                );
                                                                g.error.sdump('D_TRACE','items = ' + js2JSON(items));
                                                                util.widgets.remove_children( e );
-                                                               var ml = util.widgets.make_menulist(
-                                                                       items
-                                                               );
+                                                               var ml = util.widgets.make_menulist(items);
                                                                e.appendChild( ml );
                                                                ml.setAttribute('id','checkout_menulist');
                                                                ml.setAttribute('accesskey','');
@@ -100,13 +98,13 @@ circ.checkout.prototype = {
                                                                                } else {
                                                                                        db.hidden = true;
                                                                                        tb.disabled = true;
-                                                                                       tb.value = 'Non-Cataloged';
+                                                                                       tb.value = document.getElementById('circStrings').getString('staff.circ.non_cataloged');
                                                                                }
                                                                        }, false
                                                                );
                                                                obj.controller.view.checkout_menu = ml;
                                                        };
-                                               },
+                                               }
                                        ],
                                        'checkout_barcode_entry_textbox' : [
                                                ['keypress'],
@@ -124,19 +122,19 @@ circ.checkout.prototype = {
                                                                ev.target.parentNode.setAttribute('style','');
                                                        } catch(E) {
                                                                ev.target.parentNode.setAttribute('style','background-color: red');
-                                                               alert(E + '\nUse this format: YYYY-MM-DD');
+                                                               alert(E + '\n' + document.getElementById('circStrings').getString('staff.circ.checkout.date.exception'));
                                                                try {
                                                                        ev.target.inputField.select();
                                                                        ev.target.inputField.focus();
-                                                               } catch(E) { /* this should work, let me try on other platforms */ 
-                                                                       obj.error.sdump('D_ERROR','menulist.inputField: ' + E);
+                                                               } catch(EX) { /* this should work, let me try on other platforms */ 
+                                                                       obj.error.sdump('D_ERROR','menulist.inputField: ' + EX);
                                                                }
                                                        }
                                                }
                                        ],
                                        'cmd_broken' : [
                                                ['command'],
-                                               function() { alert('Not Yet Implemented'); }
+                                               function() { alert(document.getElementById('circStrings').getString('staff.circ.checkout.unimplemented')); }
                                        ],
                                        'cmd_checkout_submit' : [
                                                ['command'],
@@ -144,25 +142,50 @@ circ.checkout.prototype = {
                                                        var params = {}; var count = 1;
 
                                                        if (obj.controller.view.checkout_menu.value == 'barcode' ||
-                                                               obj.controller.view.checkout_menu.value == '') {
+                                                               obj.controller.view.checkout_menu.value === '') {
                                                                params.barcode = obj.controller.view.checkout_barcode_entry_textbox.value;
                                                        } else {
                                                                params.noncat = 1;
                                                                params.noncat_type = obj.controller.view.checkout_menu.value;
                                                                netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
-                                                               var r = window.prompt('Enter the number of ' + obj.data.hash.cnct[ params.noncat_type].name() + ' circulating:','1','Non-cataloged Items');
+                                                               var r = window.prompt(
+                                                                       document.getElementById('circStrings').getFormattedString('staff.circ.checkout.cmd_checkout_submit.msg', [obj.data.hash.cnct[params.noncat_type].name()]),
+                                                                       '1',
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.cmd_checkout_submit.title')
+                                                               );
                                                                if (r) {
                                                                        count = Number(r);
                                                                        if (count > 0) {
                                                                                if (count > 99) {
-                                                                                       obj.error.yns_alert('You tried to circulate ' + count + ' ' + obj.data.hash.cnct[ params.noncat_type].name() + '.  The maximum is 99 per action.','Non-cataloged Circulation','OK',null,null,'Check here to confirm this message.');
+                                                                                       obj.error.yns_alert(
+                                                                                               document.getElementById('circStrings').getFormattedString('staff.circ.checkout.cmd_checkout_submit.too_many.msg', [count, obj.data.hash.cnct[params.noncat_type].name()]),
+                                                                                               document.getElementById('circStrings').getString('staff.circ.checkout.cmd_checkout_submit.too_many.title'),
+                                                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                                                               null,
+                                                                                               null,
+                                                                                               document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                                                       );
                                                                                        return;
                                                                                } else if (count > 20) {
-                                                                                       r = obj.error.yns_alert('Are you sure you want to circulate ' + count + ' ' + obj.data.hash.cnct[ params.noncat_type].name() + '?','Non-cataloged Circulation','Yes','No',null,'Check here to confirm this message.');
-                                                                                       if (r != 0) return;
+                                                                                       r = obj.error.yns_alert(
+                                                                                               document.getElementById('circStrings').getFormattedString('staff.circ.checkout.cmd_checkout_submit.confirm.msg', [count, obj.data.hash.cnct[params.noncat_type].name()]),
+                                                                                               document.getElementById('circStrings').getString('staff.circ.checkout.cmd_checkout_submit.confirm.title'),
+                                                                                               document.getElementById('circStrings').getString('staff.circ.checkout.yes.btn'),
+                                                                                               document.getElementById('circStrings').getString('staff.circ.checkout.no.btn'),
+                                                                                               null,
+                                                                                               document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                                                       );
+                                                                                       if (r !== 0) { return; }
                                                                                }
                                                                        } else {
-                                                                               r = obj.error.yns_alert('Error with non-cataloged checkout.  ' + r + ' is not a valid number.','Non-cataloged Circulation','Ok',null,null,'Check here to confirm this message.');
+                                                                               r = obj.error.yns_alert(
+                                                                                       document.getElementById('circStrings').getFormattedString('staff.circ.checkout.cmd_checkout_submit.non_numeric.msg', [r]),
+                                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.cmd_checkout_submit.non_numeric.title'),
+                                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                                                       null,
+                                                                                       null,
+                                                                                       document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                                               );
                                                                                return;
                                                                        }
                                                                } else {
@@ -223,7 +246,7 @@ circ.checkout.prototype = {
                                                                obj.error.standard_unexpected_error_alert('cmd_checkout_done',E);
                                                        }
                                                }
-                                       ],
+                                       ]
                                }
                        }
                );
@@ -233,7 +256,7 @@ circ.checkout.prototype = {
                this.check_disable();
 
                var robj = obj.network.simple_request(
-                       'FM_CIRC_COUNT_RETRIEVE_VIA_USER',
+                       'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',
                        [ ses(), obj.patron_id ]
                );
                obj.items_out_count = (robj.out + robj.overdue + robj.claims_returned + robj.long_overdue );
@@ -258,7 +281,7 @@ circ.checkout.prototype = {
                                }
                        }
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Error determining whether to disable checkout.',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.checkout.disable.error'),E);
                }
        },
 
@@ -277,13 +300,13 @@ circ.checkout.prototype = {
                                     function() {
                                         f();
                                     }, 1000
-                                )
+                                );
                             } 
                         }, 1000
                     );
                 }
             };
-                       if (silent) params.no_prompt = true;
+                       if (silent) { params.no_prompt = true; }
                        obj.list.print(params);
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('print',E);
@@ -302,16 +325,22 @@ circ.checkout.prototype = {
        'check_date' : function(node) {
                JSAN.use('util.date');
                try {
-                       if (node.value == 'Normal') return true;
+                       if (node.value == 'Normal') { return true; }
                        var pattern = node.value.match(/Today \+ (\d+) days/);
                        if (pattern) {
                                var today = new Date();
                                var todayPlus = new Date(); todayPlus.setTime( today.getTime() + 24*60*60*1000*pattern[1] );
                                node.value = util.date.formatted_date(todayPlus,"%F");
                        }
-                       if (! util.date.check('YYYY-MM-DD',node.value) ) { throw('Invalid Date'); }
-                       if (util.date.check_past('YYYY-MM-DD',node.value) ) { throw('Due date needs to be after today.'); }
-                       if ( util.date.formatted_date(new Date(),'%F') == node.value) { throw('Due date needs to be after today.'); }
+                       if (! util.date.check('YYYY-MM-DD',node.value) ) { 
+                               throw(document.getElementById('circStrings').getString('staff.circ.invalid_date'));
+                       }
+                       if (util.date.check_past('YYYY-MM-DD',node.value) ) {
+                               throw(document.getElementById('circStrings').getString('staff.circ.checkout.date.too_early.error'));
+                       }
+                       if ( util.date.formatted_date(new Date(),'%F') == node.value) {
+                               throw(document.getElementById('circStrings').getString('staff.circ.checkout.date.too_early.error'));
+                       }
                        return true;
                } catch(E) {
                        throw(E);
@@ -329,13 +358,15 @@ circ.checkout.prototype = {
                        function _checkout_callback(req,x) {
                                try {
 
-                                       if (params.barcode) { delete obj._checkout_pending_hash[ params.barcode ];      }
+                                       if (params.barcode) { 
+                                               delete obj._checkout_pending_hash[ params.barcode ];
+                                       }
 
                                        var checkout = req.getResultObject();
 
-                                       if (checkout.ilsevent == 0) {
+                                       if (checkout.ilsevent === '0') {
                
-                                               if (!checkout.payload) checkout.payload = {};
+                                               if (!checkout.payload) { checkout.payload = {}; }
                
                                                if (!checkout.payload.circ) {
                                                        checkout.payload.circ = new aoc();
@@ -376,8 +407,12 @@ circ.checkout.prototype = {
                        
                                                /*********************************************************************************************/
                                                /* Override mvr title/author with dummy title/author for Pre cat */
-                                               if (checkout.payload.copy.dummy_title())  checkout.payload.record.title( checkout.payload.copy.dummy_title() );
-                                               if (checkout.payload.copy.dummy_author())  checkout.payload.record.author( checkout.payload.copy.dummy_author() );
+                                               if (checkout.payload.copy.dummy_title()) {
+                                                       checkout.payload.record.title( checkout.payload.copy.dummy_title() );
+                                               }
+                                               if (checkout.payload.copy.dummy_author()) {
+                                                       checkout.payload.record.author( checkout.payload.copy.dummy_author() );
+                                               }
                        
                                                obj.list.append(
                                                        {
@@ -388,7 +423,7 @@ circ.checkout.prototype = {
                                                                        'acp' : checkout.payload.copy
                                                                        }
                                                                },
-                                                               'to_top' : true,
+                                                               'to_top' : true
                                                        //I could override map_row_to_column here
                                                        }
                                                );
@@ -410,9 +445,9 @@ circ.checkout.prototype = {
                
                                } catch(E) {
                                        x.setAttribute('style','color: red');
-                                       x.setAttribute('value',params.barcode + ' failed.');
-                                       if (typeof params.noncat == 'undefined') obj.items_out_count--;
-                                       obj.error.standard_unexpected_error_alert('Check Out Failed #3',E);
+                                       x.setAttribute('value', document.getElementById('circStrings').getFormattedString('staff.circ.checkout.barcode.failed', [params.barcode]));
+                                       if (typeof params.noncat == 'undefined') { obj.items_out_count--; }
+                                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkout.barcode.failed.alert', ['#3']),E);
                                }
                        }
 
@@ -421,7 +456,11 @@ circ.checkout.prototype = {
                
                        var x = document.createElement('label');
                        x.setAttribute('style','color: green');
-                       x.setAttribute('value',(params.barcode ? params.barcode : 'non-cat' ) + ' checkout pending...');
+                       if (params.barcode) {
+                               x.setAttribute('value',document.getElementById('circStrings').getFormattedString('staff.circ.checkout.barcode.pending', [params.barcode]));
+                       } else {
+                               x.setAttribute('value',document.getElementById('circStrings').getString('staff.circ.checkout.non_cataloged.pending'));
+                       }
                        document.getElementById('msg_area').appendChild(x);
 
                        obj.network.request(
@@ -433,13 +472,13 @@ circ.checkout.prototype = {
                                }
                        );
                        
-                       if (typeof params.noncat == 'undefined') obj.items_out_count++;
+                       if (typeof params.noncat == 'undefined') { obj.items_out_count++; }
 
                } catch(E) {
                        x.setAttribute('style','color: red');
-                       x.setAttribute('value',params.barcode + ' failed.');
-                       if (typeof params.noncat == 'undefined') obj.items_out_count--;
-                       obj.error.standard_unexpected_error_alert('Check Out Failed #2',E);
+                       x.setAttribute('value', document.getElementById('circStrings').getFormattedString('staff.circ.checkout.barcode.failed', [params.barcode]));
+                       if (typeof params.noncat == 'undefined') { obj.items_out_count--; }
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkout.barcode.failed.alert', ['#2']),E);
                }
        },
 
@@ -447,20 +486,21 @@ circ.checkout.prototype = {
        'test_barcode' : function(bc) {
                var obj = this;
                var x = document.getElementById('strict_barcode');
-               if (x && x.checked != true) return true;
+               if (x && x.checked !== true) { return true; }
                var good = util.barcode.check(bc);
                if (good) {
                        return true;
                } else {
                        if ( 1 == obj.error.yns_alert(
-                                               'Bad checkdigit; possible mis-scan.  Use this barcode ("' + bc + '") anyway?',
-                                               'Bad Barcode',
-                                               'Cancel',
-                                               'Accept Barcode',
+                                               document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
                                                null,
-                                               'Check here to confirm this action',
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
                                                '/xul/server/skin/media/images/bad_barcode.png'
-                       ) ) {
+                               )
+                       ) {
                                return true;
                        } else {
                                return false;
@@ -478,7 +518,7 @@ circ.checkout.prototype = {
 
                if (typeof obj.on_checkout == 'function') { obj.on_checkout(params); }
 
-               if (! (params.barcode||params.noncat)) return;
+               if (! (params.barcode||params.noncat)) { return; }
 
                if (params.barcode) {
 
@@ -509,7 +549,7 @@ circ.checkout.prototype = {
                                [ ses(), params, obj.items_out_count ],
                                null,
                                {
-                                       'title' : 'Override Checkout Failure?',
+                                       'title' : document.getElementById('circStrings').getString('staff.circ.checkout.override.confirm'),
                                        'overridable_events' : [ 
                                                1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */,
                                                1213 /* PATRON_BARRED */,
@@ -520,7 +560,7 @@ circ.checkout.prototype = {
                                                7006 /* COPY_IS_REFERENCE */, 
                                                7010 /* COPY_ALERT_MESSAGE */,
                                                7016 /* ITEM_ON_HOLDS_SHELF */,
-                                               7013 /* PATRON_EXCEEDS_FINES */,
+                                               7013 /* PATRON_EXCEEDS_FINES */
                                        ],
                                        'text' : {
                                                '7004' : function(r) {
@@ -531,12 +571,12 @@ circ.checkout.prototype = {
                                                },
                                                '7010' : function(r) {
                                                        return r.payload;
-                                               },
+                                               }
                                        }
                                }
                        );
 
-                       if (!permit) throw(permit);
+                       if (!permit) { throw(permit); }
 
                        function test_event(list,ev) {
                                if (typeof list.ilsevent != 'undefined' ) {
@@ -548,7 +588,7 @@ circ.checkout.prototype = {
                                } else {
                                        for (var i = 0; i < list.length; i++) {
                                                if (typeof list[i].ilsevent != 'undefined') {
-                                                       if (list[i].ilsevent == ev) return list[i];
+                                                       if (list[i].ilsevent == ev) { return list[i]; }
                                                }
                                        }
                                        return false;
@@ -557,7 +597,7 @@ circ.checkout.prototype = {
 
                        /**********************************************************************************************************************/
                        /* Normal case, proceed with checkout */
-                       if (permit.ilsevent == 0) {
+                       if (permit.ilsevent === '0') {
 
                                JSAN.use('util.sound'); var sound = new util.sound(); sound.circ_good();
                                params.permit_key = permit.payload;
@@ -574,12 +614,12 @@ circ.checkout.prototype = {
                                if (test_event(permit,1202 /* ITEM_NOT_CATALOGED */)) {
 
                                        if ( 1 == obj.error.yns_alert(
-                                               'Mis-scan or non-cataloged item.  Checkout as a pre-cataloged item?',
-                                               'Alert',
-                                               'Cancel',
-                                               'Pre-Cat',
+                                               document.getElementById('circStrings').getString('staff.circ.checkout.not_cataloged.confirm'),
+                                               document.getElementById('circStrings').getString('staff.circ.alert'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.pre_cataloged'),
                                                null,
-                                               'Check here to confirm this action',
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
                                                '/xul/server/skin/media/images/book_question.png'
                                        ) ) {
 
@@ -593,16 +633,20 @@ circ.checkout.prototype = {
                                                params.dummy_author = obj.data.dummy_author;
                                                params.precat = 1;
 
-                                               if (params.dummy_title != '') { obj._checkout( params ); } else { throw('Checkout cancelled'); }
+                                               if (params.dummy_title !== '') { 
+                                                       obj._checkout( params );
+                                               } else {
+                                                       alert(document.getElementById('circStrings').getString('staff.circ.checkout.cancelled'));
+                                               }
                                        } 
-                               };
+                               }
 
                                var test_permit;
                                if (typeof permit.ilsevent != 'undefined') { test_permit = [ permit ]; } else { test_permit = permit; }
 
                                var stop_checkout = false;
                                for (var i = 0; i < test_permit.length; i++) {
-                                       switch(test_permit[i].ilsevent) {
+                                       switch(Number(test_permit[i].ilsevent)) {
                                                case 1216 /* PATRON_CARD_INACTIVE */ :
                                                case 1217 /* PATRON_INACTIVE */ :
                                                case 1224 /* PATRON_ACCOUNT_EXPIRED */ :
@@ -613,7 +657,7 @@ circ.checkout.prototype = {
 
                                for (var i = 0; i < test_permit.length; i++) {
                                        dump('found [' + test_permit[i].ilsevent + ']\n');
-                                       switch(test_permit[i].ilsevent) {
+                                       switch(Number(test_permit[i].ilsevent)) {
                                                case 1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */ :
                                                        found_handled = true;
                                                break;
@@ -625,18 +669,39 @@ circ.checkout.prototype = {
                                                break;
                                                case 1216 /* PATRON_CARD_INACTIVE */ :
                                                        found_handled = true;
-                                                       msg += 'The card used to retrieve this account is inactive and may not be used to circulate items.\n';
-                                                       obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                       msg += document.getElementById('circStrings').getString('staff.circ.checkout.card.inactive') + '\n';
+                                                       obj.error.yns_alert(
+                                                               msg,
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
                                                break;
                                                case 1217 /* PATRON_INACTIVE */ :
                                                        found_handled = true;
-                                                       msg += 'This account is inactive and may not circulate items.\n';
-                                                       obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                       msg += document.getElementById('circStrings').getString('staff.circ.checkout.account.inactive') + '\n';
+                                                       obj.error.yns_alert(
+                                                               msg,
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
                                                break;
                                                case 1224 /* PATRON_ACCOUNT_EXPIRED */ :
                                                        found_handled = true;
-                                                       msg += 'This account has expired  and may not circulate items.\n';
-                                                       obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                       msg += document.getElementById('circStrings').getString('staff.circ.checkout.account.expired') + '\n';
+                                                       obj.error.yns_alert(
+                                                               msg,
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
                                                break;
                                                case 7013 /* PATRON_EXCEEDS_FINES */ :
                                                        found_handled = true;
@@ -648,7 +713,7 @@ circ.checkout.prototype = {
                                                        found_handled = true;
                                                break;
                                                case 7004 /* COPY_NOT_AVAILABLE */ :
-                                                       msg += test_permit[i].desc + '\n' + 'Copy status = ' + ( test_permit[i].payload.status().name() ) + '\n';
+                                                       msg += test_permit[i].desc + '\n' + document.getElementById('circStrings').getFormattedString('staff.circ.checkout.copy_status', [test_permit[i].payload.status().name()]) + '\n';
                                                        found_handled = true;
                                                break;
                                                case 7006 /* COPY_IS_REFERENCE */ :
@@ -657,11 +722,18 @@ circ.checkout.prototype = {
                                                break;
                                                case 7009 /* CIRC_CLAIMS_RETURNED */ :
                                                        msg += test_permit[i].desc + '\n';
-                                                       obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                       obj.error.yns_alert(
+                                                               msg,
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
                                                        found_handled = true;
                                                break;
                                                case 7010 /* COPY_ALERT_MESSAGE */ :
-                                                       msg += test_permit[i].desc + '\n' + 'Alert Message = ' + test_permit[i].payload + '\n';
+                                                       msg += test_permit[i].desc + '\n' + document.getElementById('circStrings').getFormattedString('staff.circ.checkout.alert_message', [test_permit[i].payload]) + '\n';
                                                        found_handled = true;
                                                break;
                                                case 7016 /* ITEM_ON_HOLDS_SHELF */ :
@@ -672,7 +744,7 @@ circ.checkout.prototype = {
                                                        found_handled = true;
                                                break;
                                                case 5000 /* PERM_FAILURE */ :
-                                                       msg += test_permit[i].desc + '\n' + 'Permission Denied = ' + test_permit[i].ilsperm + '\n';
+                                                       msg += test_permit[i].desc + '\n' + document.getElementById('circStrings').getFormattedString('staff.circ.checkout.permission_denied', [test_permit[i].ilsperm]) + '\n';
                                                        found_handled = true;
                                                break;
                                                case 1702 /* OPEN_CIRCULATION_EXISTS */ :
@@ -680,15 +752,26 @@ circ.checkout.prototype = {
                                                        found_handled = true;
 
                                                        var my_copy = obj.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[params.barcode]);
-                                                       if (typeof my_copy.ilsevent != 'undefined') throw(my_copy);
+                                                       if (typeof my_copy.ilsevent != 'undefined') { throw(my_copy); }
                                                        var my_circ = obj.network.simple_request('FM_CIRC_RETRIEVE_VIA_COPY',[ses(),my_copy.id(),1]);
-                                                       if (typeof my_circ.ilsevent != 'undefined') throw(my_copy);
+                                                       if (typeof my_circ.ilsevent != 'undefined') { throw(my_copy); }
                                                        my_circ = my_circ[0];
                                                        var due_date = my_circ.due_date() ? my_circ.due_date().substr(0,10) : null;
                                                        JSAN.use('util.date'); var today = util.date.formatted_date(new Date(),'%F');
-                                                       if (due_date) if (today > due_date) msg += '\nThis item was due on ' + due_date + '.\n';
+                                                       if (due_date) {
+                                                               if (today > due_date) {
+                                                                       msg += (document.getElementById('circStrings').getFormattedString('staff.circ.checkout.item_due', [due_date]) + '\n');
+                                                               }
+                                                       }
                                                        if (! stop_checkout ) {
-                                                               var r = obj.error.yns_alert(msg,'Check Out Failed','Cancel','Normal Checkin then Checkout', due_date ? (today > due_date ? 'Forgiving Checkin then Checkout' : null) : null,'Check here to confirm this message');
+                                                               var r = obj.error.yns_alert(
+                                                                       msg,
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.normal_checkin_then_checkout'),
+                                                                       due_date ? (today > due_date ? document.getElementById('circStrings').getString('staff.circ.checkout.forgiving_checkin_then_checkout') : null) : null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                               );
                                                                JSAN.use('circ.util');
                                                                switch(r) {
                                                                        case 1:
@@ -701,41 +784,67 @@ circ.checkout.prototype = {
                                                                        break;
                                                                }
                                                        } else {
-                                                               obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                               obj.error.yns_alert(
+                                                                       msg,
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                                       null,
+                                                                       null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                               );
                                                        }
                                                break;
                                                case 7014 /* COPY_IN_TRANSIT */ :
                                                        msg += test_permit[i].desc + '\n';
                                                        found_handled = true;
                                                        if (! stop_checkout ) {
-                                                               var r = obj.error.yns_alert(msg,'Check Out Failed','Cancel','Abort Transit then Checkout',null,'Check here to confirm this message');
-                                                               switch(r) {
-                                                                       case 1:
-                                                                               var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : params.barcode } ]);
-                                                                               if (typeof robj.ilsevent == 'undefined') {
-                                                                                       obj.checkout(params);
-                                                                               } else {
-                                                                                       switch(robj.ilsevent) {
-                                                                                               case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
-                                                                                                       alert(robj.desc);
-                                                                                               break;
-                                                                                               case 5000 /* PERM_FAILURE */ :
-                                                                                               break;
-                                                                                               default:
-                                                                                                       throw(robj);
-                                                                                               break;
-                                                                                       }
+                                                               var r = obj.error.yns_alert(
+                                                                       msg,
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.abort_transit_then_checkout'),
+                                                                       null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                               );
+                                                               if (r == 1) {
+                                                                       var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : params.barcode } ]);
+                                                                       if (typeof robj.ilsevent == 'undefined') {
+                                                                               obj.checkout(params);
+                                                                       } else {
+                                                                               switch(robj.ilsevent) {
+                                                                                       case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
+                                                                                               alert(robj.desc);
+                                                                                       break;
+                                                                                       case 5000 /* PERM_FAILURE */ :
+                                                                                       break;
+                                                                                       default:
+                                                                                               throw(robj);
+                                                                                       break;
                                                                                }
-                                                                       break;
+                                                                       }
                                                                }
                                                        } else {
-                                                               obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                               obj.error.yns_alert(
+                                                                       msg,
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                                       null,
+                                                                       null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                               );
                                                        }
                                                break;
                                                case -1 /* NETWORK_FAILURE */ :
-                                                       msg += 'There was a network failure.\n';
+                                                       msg += document.getElementById('circStrings').getString('staff.circ.checkout.network_failure') + '\n';
                                                        found_handled = true;
-                                                       obj.error.yns_alert(msg,'Check Out Failed','OK',null,null,'Check here to confirm this message');
+                                                       obj.error.yns_alert(
+                                                               msg,
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.checkout.ok.btn'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
                                                break;
                                                default:
                                                        msg += 'FIXME: ' + js2JSON(test_permit[i]) + '\n';
@@ -755,9 +864,9 @@ circ.checkout.prototype = {
                } catch(E) {
                        if (params.barcode) { delete obj._checkout_pending_hash[ params.barcode ];      }
                        if (typeof E.ilsevent != 'undefined' && E.ilsevent == -1) {
-                               obj.error.standard_network_error_alert('Check Out Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface');
+                               obj.error.standard_network_error_alert(document.getElementById('circStrings').getString('staff.circ.checkout.suggest_offline'));
                        } else {
-                               obj.error.standard_unexpected_error_alert('Check Out Failed',E);
+                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.checkout.barcode.check_out_failed'),E);
                        }
                        if (typeof obj.on_failure == 'function') {
                                obj.on_failure(E);
@@ -784,6 +893,6 @@ circ.checkout.prototype = {
                this.controller.view.checkout_barcode_entry_textbox.select();
                this.controller.view.checkout_barcode_entry_textbox.focus();
        }
-}
+};
 
 dump('exiting circ.checkout.js\n');
index 3f5c76a..c620adb 100644 (file)
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -82,6 +82,8 @@
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+
        <commandset id="checkout_cmds">
                <command id="cmd_checkout_submit" />
                <command id="cmd_checkout_print" />
index aa2e79d..1eef372 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE overlay PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 <overlay id="checkout_overlay" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
@@ -31,7 +31,7 @@
                control="checkout_barcode_entry_textbox"/>
 -->
        <hbox id="checkout_menu_placeholder" flex="0"/>
-       <label accesskey="C" control="checkout_barcode_entry_textbox"/>
+       <label accesskey="&staff.circ.checkout_overlay.barcode.accesskey;" control="checkout_barcode_entry_textbox"/>
        <textbox id="checkout_barcode_entry_textbox"/>
        <button id="checkout_submit_barcode_button" 
                label="&staff.patron_display.checkout.submit_label;" 
                accesskey="&staff.patron_display.checkout.submit_label.accesskey;"/>
        <spacer flex="1"/>
        <hbox id="duedate_hbox">
-               <label value="Due Date" accesskey="u" control="checkout_duedate_menu"/>
+               <label value="&staff.circ.checkout_overlay.duedate_menu.label;" accesskey="&staff.circ.checkout_overlay.duedate_menu.accesskey;" control="checkout_duedate_menu"/>
                <menulist id="checkout_duedate_menu" editable="true">
                        <menupopup>
-                               <menuitem label="Normal" selected="true"/>
-                               <menuitem label="Today + 3 days" />
-                               <menuitem label="Today + 7 days" />
-                               <menuitem label="Today + 14 days" />
-                               <menuitem label="Today + 30 days" />
+                               <menuitem label="&common.date_helper.normal;" selected="true"/>
+                               <menuitem label="&common.date_helper.3_days;" />
+                               <menuitem label="&common.date_helper.7_days;" />
+                               <menuitem label="&common.date_helper.14_days;" />
+                               <menuitem label="&common.date_helper.30_days;" />
                        </menupopup>
                </menulist>
        </hbox>
                command="cmd_checkout_print"
                accesskey="&staff.patron_display.checkout.print_receipt_label.accesskey;"/>
        <button id="checkout_export" 
-               label="Export"
+               label="&staff.circ.checkout_overlay.export.label;"
                command="cmd_checkout_export"
-               accesskey=""/>
-       <button id="clip_button" disabled="true" command="sel_clip" label="Copy to Clipboard" />
-       <button id="save_col_btn" command="save_columns" label="Save Columns" />
-       <checkbox id="strict_barcode" label="Strict Barcode" checked="false" persist="checked"/> 
+               accesskey="&staff.circ.checkout_overlay.export.accesskey;"/>
+       <button id="clip_button" disabled="true" command="sel_clip" label="&staff.circ.checkout_overlay.sel_clip.label;" />
+       <button id="save_col_btn" command="save_columns" label="&staff.circ.checkout_overlay.save_columns.label;" />
+       <checkbox id="strict_barcode" label="&staff.circ.checkout_overlay.strict_barcode.label;" checked="false" persist="checked"/> 
        <spacer id="pcii3s" flex="1"/>
        <checkbox id="checkout_auto" persist="checked"
                label="&staff.patron_display.checkout.auto_print_label;" 
index 55fe393..b065f21 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Brief Bib Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -37,7 +37,7 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.missing') ); }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                                $('circ_lib').value = r_circ.circ_lib() ? g.data.hash.aou[ r_circ.circ_lib() ].shortname() : '';
                                                $('xact_start').value = r_circ.xact_start() ? r_circ.xact_start().toString().substr(0,16).replace(/T/,' ') : '';
                                                $('due_date').value = r_circ.due_date() ? r_circ.due_date().toString().substr(0,10) : '';
-                                               $('circ_lib').setAttribute('tooltiptext','Check Out Staff ID = ' + r_circ.circ_staff() );
+                                               $('circ_lib').setAttribute('tooltiptext', document.getElementById('circStrings').getFormattedString('staff.circ.circ_brief.staff_out_id', [r_circ.circ_staff()]) );
                                                $('checkin_lib').value = r_circ.checkin_lib() ? g.data.hash.aou[ r_circ.checkin_lib() ].shortname() : '';
                                                $('checkin_time').value = r_circ.checkin_time() ? r_circ.checkin_time().toString().substr(0,16).replace(/T/,' ') : '';
-                                               $('checkin_lib').setAttribute('tooltiptext','Check In Staff ID = ' + r_circ.checkin_staff() );
+                                               $('checkin_lib').setAttribute('tooltiptext', document.getElementById('circStrings').getFormattedString('staff.circ.circ_brief.staff_in_id', [r_circ.checkin_staff()]) );
                                                $('id').value = r_circ.id() ? r_circ.id() : '';
                                                $('stop_fines').value = r_circ.stop_fines() ? r_circ.stop_fines() : '';
                                                $('stop_fines_time').value = r_circ.stop_fines_time() ? r_circ.stop_fines_time().toString().substr(0,16).replace(/T/,' ') : '';
@@ -69,7 +69,7 @@
                                                if (get_bool( r_circ.desk_renewal() ) ) r += 'DESK ';
                                                if (get_bool(r_circ.opac_renewal() ) ) r += 'OPAC ';
                                                if (get_bool(r_circ.phone_renewal() ) ) r += 'PHONE ';
-                                               $('renewal').value = r || 'No';
+                                               $('renewal').value = r || document.getElementById('circStrings').getString('staff.circ.checkout.no.btn');
                                                g.patron_id = r_circ.usr(); $('add_billing').disabled = false;
                                                g.network.simple_request('FM_AU_FLESHED_RETRIEVE_VIA_ID',[ ses(), r_circ.usr() ], function(preq) {
                                                        var r_au = preq.getResultObject();
@@ -78,7 +78,7 @@
                                                });
 
                                        } catch(E) {
-                                               g.error.standard_unexpected_error_alert('Failure rendering circ.',E);
+                                               g.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.circ_brief.failure'), E);
                                        }
                                }
 
@@ -91,8 +91,7 @@
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncirc/circ_brief.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ/circ_brief.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <groupbox id="gb" flex="1" style="overflow: auto;">
                <caption id="caption"/>
                <hbox>
                        <label id="patron_name" class="patronNameLarge" flex="1"/>
-                       <label value="Circ ID: "/><label id="id"/>
-                       <button id="add_billing" disabled="true" label="Add Billing" oncommand="g.add_billing();"/>
+                       <label value="&staff.circ.circ_brief.patron_id.label;"/><label id="id"/>
+                       <button id="add_billing" disabled="true" label="&staff.circ.circ_brief.add_billing.label;" oncommand="g.add_billing();"/>
                </hbox>
                <grid flex="1">
                        <columns>
                        </columns>
                        <rows>
                                <row>
-                                       <label style="font-weight: bold" value="Check Out Time"/><label id="xact_start"/>
-                                       <label style="font-weight: bold" value="Due Date"/><label id="due_date"/>
-                                       <label style="font-weight: bold" value="Stop Fines Time"/><label id="stop_fines_time"/>
-                                       <label style="font-weight: bold" value="Check In Time"/><label id="checkin_time"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.xact_start.label;"/><label id="xact_start"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.due_date.label;"/><label id="due_date"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.stop_fines_time.label;"/><label id="stop_fines_time"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.checkin_time.label;"/><label id="checkin_time"/>
                                </row>
                                <row>
-                                       <label style="font-weight: bold" value="Check Out Lib"/><label id="circ_lib"/>
-                                       <label style="font-weight: bold" value="Renewal"/><label id="renewal"/>
-                                       <label style="font-weight: bold" value="Stop Fines Reason"/><label id="stop_fines"/>
-                                       <label style="font-weight: bold" value="Check In Lib"/><label id="checkin_lib"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.circ_lib.label;"/><label id="circ_lib"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.renewal.label;"/><label id="renewal"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.stop_fines.label;"/><label id="stop_fines"/>
+                                       <label style="font-weight: bold" value="&staff.circ.circ_brief.checkin_lib.label;"/><label id="checkin_lib"/>
                                </row>
                        </rows>
                </grid>
index 9b0988c..193aae7 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Brief Bib Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -42,7 +42,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') {
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
@@ -57,7 +59,7 @@
 
                                g.copy = g.network.simple_request('FM_ACP_RETRIEVE',[ g.copy_id ]);
                                if (typeof g.copy.ilsevent != 'undefined') throw(g.copy);
-                               g.callnumber = g.network.simple_request('FM_ACN_RETRIEVE',[ g.copy.call_number() ]);
+                               g.callnumber = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ g.copy.call_number() ]);
                                if (typeof g.callnumber.ilsevent != 'undefined') throw(g.callnumber);
 
                                $('top').setAttribute('src',urls.XUL_BIB_BRIEF);// + '?docid=' + g.callnumber.record());
                <iframe id="mid" style="overflow: auto;"/>
                <splitter><grippy/></splitter>
                <groupbox flex="1" id="circs" style="overflow: auto;">
-                       <caption label="Last Few Circulations"/>
+                       <caption label="&staff.circ.circ_summary.caption;"/>
                </groupbox>
                <hbox>
-                       <button id="r_last" label="Retrieve Last Patron" accesskey="L" oncommand="retrieve_last();"/>
-                       <button id="r_all" label="Retrieve All These Patrons" accesskey="A" oncommand="retrieve_all();"/>
+                       <button id="r_last" label="&staff.circ.circ_summary.retrieve_last.label;" accesskey="&staff.circ.circ_summary.retrieve_last.accesskey;" oncommand="retrieve_last();"/>
+                       <button id="r_all" label="&staff.circ.circ_summary.retrieve_all.label;" accesskey="&staff.circ.circ_summary.retrieve_all.accesskey;" oncommand="retrieve_all();"/>
                        <spacer flex="1"/>
-                       <button label="Done" accesskey="D" oncommand="window.close();"/>
+                       <button label="&staff.circ.circ_summary.done.label;" accesskey="&staff.circ.circ_summary.done.accesskey;" oncommand="window.close();"/>
                </hbox>
        </vbox>
 
index 1fa277f..3122a5c 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Brief Bib Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -42,7 +42,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') { 
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
 
                                // uber method
                                var robj = g.network.simple_request('FM_ACP_DETAILS', [ ses(), g.copy_id ] );
-                               if (typeof robj.ilsevent != 'undefined') throw(robj);
-                               if (robj.copy) g.copy = robj.copy; else throw(robj);
+                               if (typeof robj.ilsevent != 'undefined') {
+                                       throw(robj);
+                               }
+                               if (robj.copy) {
+                                       g.copy = robj.copy;
+                               } else {
+                                       throw(robj);
+                               }
                                g.hold = robj.hold; g.transit = robj.transit; g.circ = robj.circ; g.callnumber = robj.volume;
-                               if (g.hold) $('hold_caption').setAttribute('tooltiptext','Hold ID = ' + g.hold.id());
-                               if (g.transit) $('transit_caption').setAttribute('tooltiptext','Transit ID = ' + g.transit.id());
-                               if (g.circ) $('circ_caption').setAttribute('tooltiptext','Circ ID = ' + g.circ.id());
+                               var tt_msg = '';
+                               if (g.hold) {
+                                       tt_msg = $('circStrings').getFormattedString('staff.circ.copy_details.hold', [g.hold.id()]);
+                                       $('hold_caption').setAttribute('tooltiptext', tt_msg);
+                               }
+                               if (g.transit) {
+                                       tt_msg = $('circStrings').getFormattedString('staff.circ.copy_details.transit', [g.transit.id()]);
+                                       $('transit_caption').setAttribute('tooltiptext', tt_msg);
+                               }
+                               if (g.circ) {
+                                       tt_msg = $('circStrings').getFormattedString('staff.circ.copy_details.circ', [g.circ.id()]);
+                                       $('circ_caption').setAttribute('tooltiptext', tt_msg);
+                               }
 
-                               //g.callnumber = g.network.simple_request('FM_ACN_RETRIEVE',[ g.copy.call_number() ]);
+                               //g.callnumber = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ g.copy.call_number() ]);
                                //if (typeof g.callnumber.ilsevent != 'undefined') throw(g.callnumber);
 
                                $('top').setAttribute('src',urls.XUL_BIB_BRIEF); // + '?docid=' + g.callnumber.record());
                                        $('circ').setAttribute('src',urls.XUL_CIRC_BRIEF); // + '?no_border=1');
                                        get_contentWindow($('circ')).xulG = { 'no_border' : 1 };
                                        if (g.circ.checkin_time()) {
-                                               $('circ_caption').setAttribute('label','Last Circulation');
+                                               $('circ_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.last_circ'));
                                        } else {
-                                               $('circ_caption').setAttribute('label','Current Circulation');
+                                               $('circ_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.current_circ'));
                                        }
                                } else {
-                                       $('circ_caption').setAttribute('label','This item has yet to circulate.');
+                                       $('circ_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.no_circ'));
                                        $('circ').hidden = true;
                                }
 
                                        g.list.append( { 'row' : { 'my' : { 'atc' : g.transit, } } });
        
                                } else {
-                                       $('transit_caption').setAttribute('label','This item is not in transit.');
+                                       $('transit_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.not_transit'));
                                        $('transit').hidden = true;
                                }
 
        
                                        JSAN.use('patron.util'); 
                                        var au_obj = patron.util.retrieve_fleshed_au_via_id( ses(), g.hold.usr() );
-                                       $('patron_name').setAttribute('value', au_obj.family_name() + ', ' + au_obj.first_given_name() + ' : ' + au_obj.card().barcode() );
+                                       $('patron_name').setAttribute('value', $('circStrings').getFormattedString('staff.circ.copy_details.user_details', [au_obj.family_name(), au_obj.first_given_name(), au_obj.card().barcode()]) );
 
                                } else {
                                        if (g.copy.status() == 8 /* ON HOLDS SHELF */) {
-                                               $('hold_caption').setAttribute('label','This item is not captured for a hold, however its status is incorrectly set to "On Holds Shelf".  Please check this item in to correct the status.');
+                                               $('hold_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.bad_hold_status'));
                                        } else {
-                                               $('hold_caption').setAttribute('label','This item is not captured for a hold.');
+                                               $('hold_caption').setAttribute('label', $('circStrings').getString('staff.circ.copy_details.no_hold'));
                                        }
                                        $('hold').hidden = true;
                                }
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+
        <vbox flex="1" style="overflow: auto;">
                <vbox style="border: none; overflow: none; min-height: 80;">
                        <iframe flex="1" id="top" style="overflow: none; min-height: 80;"/>
                </vbox>
                <splitter><grippy/></splitter>
                <groupbox flex="1" id="holds" style="overflow: none; min-height: 80;">
-                       <caption id="hold_caption" label="Captured for Hold"/>
+                       <caption id="hold_caption" label="&staff.circ.copy_details.hold_caption;"/>
                        <label id="patron_name" class="patronNameLarge"/>
                        <tree id="hold" flex="1" enableColumnDrag="true"/>
                        <spacer FIXME="label and tree get swapped without this"/>
                </groupbox>
                <splitter><grippy/></splitter>
                <groupbox flex="1" id="transits" style="overflow: none; min-height: 80;">
-                       <caption id="transit_caption" label="In Transit"/>
+                       <caption id="transit_caption" label="&staff.circ.copy_details.transit_caption;"/>
                        <tree id="transit" flex="1" enableColumnDrag="true"/>
                </groupbox>
                <splitter><grippy/></splitter>
                <groupbox flex="1" id="circs" style="overflow: none; min-height: 80;">
-                       <caption id="circ_caption" label="Last/Current Circulation" style="font-weight: bold"/>
+                       <caption id="circ_caption" label="&staff.circ.copy_details.circ_caption;" style="font-weight: bold"/>
                        <iframe id="circ" style="min-height: 80" flex="1"/>
                </groupbox>
        </vbox>
        <hbox>
-               <button id="r_last" label="Retrieve Last Patron" accesskey="L" oncommand="retrieve_last_patron();"/>
-               <button id="r_hold" label="Retrieve Hold Patron" accesskey="H" oncommand="retrieve_hold_patron();"/>
+               <button id="r_last" label="&staff.circ.copy_details.r_last.label;" accesskey="&staff.circ.copy_details.r_last.accesskey;" oncommand="retrieve_last_patron();"/>
+               <button id="r_hold" label="&staff.circ.copy_details.r_hold.label;" accesskey="&staff.circ.copy_details.r_hold.accesskey;" oncommand="retrieve_hold_patron();"/>
                <spacer flex="1"/>
-               <button id="done" label="Done" accesskey="D" oncommand="window.close();"/>
+               <button id="done" label="&staff.circ.copy_details.done.label;" accesskey="&staff.circ.copy_details.done.accesskey;" oncommand="window.close();"/>
        </hbox>
 
 </window>
index ab8f8f0..79dd8c6 100644 (file)
@@ -1,6 +1,7 @@
 dump('entering circ.copy_status.js\n');
+// vim:noet:sw=4:ts=4:
 
-if (typeof circ == 'undefined') circ = {};
+if (typeof circ == 'undefined') { circ = {}; }
 circ.copy_status = function (params) {
 
        JSAN.use('util.error'); this.error = new util.error();
@@ -9,7 +10,7 @@ circ.copy_status = function (params) {
        JSAN.use('util.date');
        JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
        JSAN.use('util.sound'); this.sound = new util.sound();
-}
+};
 
 circ.copy_status.prototype = {
        'selection_list' : [],
@@ -28,12 +29,12 @@ circ.copy_status.prototype = {
                                'call_number' : { 'hidden' : false },
                                'status' : { 'hidden' : false },
                                'alert_message' : { 'hidden' : false },
-                               'due_date' : { 'hidden' : false },
+                               'due_date' : { 'hidden' : false }
                        },
                        {
                                'except_these' : [
-                                       'checkin_time', 'checkin_time_full', 'route_to', 'message', 'uses', 'xact_finish',
-                               ],
+                                       'checkin_time', 'checkin_time_full', 'route_to', 'message', 'uses', 'xact_finish'
+                               ]
                        }
                );
 
@@ -101,7 +102,7 @@ circ.copy_status.prototype = {
                                        } catch(E) {
                                                alert('FIXME: ' + E);
                                        }
-                               },
+                               }
                        }
                );
                
@@ -126,9 +127,9 @@ circ.copy_status.prototype = {
                                                                        funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
                                                                }
                                                                for (var i = 0; i < funcs.length; i++) { funcs[i](); }
-                                                               alert('Action complete.');
+                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Checkin did not likely happen.',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_checkin.error'),E);
                                                        }
                                                }
                                        ],
@@ -144,13 +145,13 @@ circ.copy_status.prototype = {
                                                                                var new_bc = cat.util.replace_barcode( barcode );
                                                                                funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(new_bc) );
                                                                        } catch(E) {
-                                                                               obj.error.standard_unexpected_error_alert('Barcode ' + barcode + ' was not likely replaced.',E);
+                                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.cmd_replace_barcode.error', [barcode]), E);
                                                                        }
                                                                }
                                                                for (var i = 0; i < funcs.length; i++) { funcs[i](); }
-                                                               alert('Action complete.');
+                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Barcode replacements did not likely happen.',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.cmd_replace_barcodes.error'), E);
                                                        }
                                                }
                                        ],
@@ -166,7 +167,7 @@ circ.copy_status.prototype = {
                                                                }
                                                                for (var i = 0; i < funcs.length; i++) { funcs[i](); }
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('with copy editor',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_edit.error'), E);
                                                        }
                                                }
                                        ],
@@ -195,7 +196,7 @@ circ.copy_status.prototype = {
                                                                funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
                                                        }
                                                        for (var i = 0; i < funcs.length; i++) { funcs[i](); }
-                                                       alert('Action complete.');
+                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
                                                }
                                        ],
                                        'sel_patron' : [
@@ -226,11 +227,11 @@ circ.copy_status.prototype = {
                                                                        circ.util.renew_via_barcode( barcode );
                                                                        funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
                                                                } else {
-                                                                       alert('Item with barcode ' + barcode + ' is not circulating.');
+                                                                       alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.sel_renew.not_circulating', [barcode]));
                                                                }
                                                        }
                                                        for (var i = 0; i < funcs.length; i++) { funcs[i](); }
-                                                       alert('Action complete.');
+                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
                                                }
                                        ],
 
@@ -277,7 +278,7 @@ circ.copy_status.prototype = {
                                        ],
                                        'cmd_broken' : [
                                                ['command'],
-                                               function() { alert('Not Yet Implemented'); }
+                                               function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
                                        ],
                                        'cmd_copy_status_submit_barcode' : [
                                                ['command'],
@@ -291,8 +292,8 @@ circ.copy_status.prototype = {
                                                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
                                                        JSAN.use('util.file');
                                                        var f = new util.file('');
-                            var content = f.import_file( { 'title' : 'Import Barcode File', 'not_json' : true } );
-                            if (!content) return;
+                            var content = f.import_file( { 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.title'), 'not_json' : true } );
+                            if (!content) { return; }
                                                        var barcodes = content.split(/\s+/);
                                        if (barcodes.length > 0) {
                                            JSAN.use('util.exec'); var exec = new util.exec();
@@ -302,14 +303,14 @@ circ.copy_status.prototype = {
                                                    function(b){
                                                        return function() {
                                                            obj.copy_status(b);
-                                                       }
+                                                       };
                                                    }(barcodes[i])
                                                );
                                            }
-                                                               funcs.push( function() { alert('File uploaded.'); } );
+                                                               funcs.push( function() { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.complete')); } );
                                            exec.chain( funcs );
                                        } else {
-                                                               alert('No barcodes found in file.');
+                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.no_barcodes'));
                                                        }
 
                                                }
@@ -352,7 +353,7 @@ circ.copy_status.prototype = {
                                                                                } catch(E) {
                                                                                        obj.error.standard_unexpected_error_alert('export',E); 
                                                                                }
-                                                                       }
+                                                                       };
                                                                obj.list.full_retrieve();
                                                        } catch(E) {
                                                                obj.error.standard_unexpected_error_alert('export',E); 
@@ -367,21 +368,27 @@ circ.copy_status.prototype = {
 
                                                                JSAN.use('util.functional');
                                                                var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
-                                                               if (list.length == 0) return;
+                                                               if (list.length == 0) { return; }
 
                                                                var copy_shortcut = {}; var map_acn = {};
 
                                                                for (var i = 0; i < list.length; i++) {
                                                                        var volume_id = list[i];
-                                                                       if (volume_id == -1) continue; /* ignore magic pre-cat volume */
+                                                                       if (volume_id == -1) { 
+                                                                               continue; /* ignore magic pre-cat volume */
+                                                                       }
                                                                        if (! map_acn[volume_id]) {
-                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
+                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
                                                                        }
                                                                        var record_id = map_acn[ volume_id ].record();
                                                                        var ou_id = map_acn[ volume_id ].owning_lib();
                                                                        var label = map_acn[ volume_id ].label();
-                                                                       if (!copy_shortcut[record_id]) copy_shortcut[record_id] = {};
-                                                                       if (!copy_shortcut[record_id][ou_id]) copy_shortcut[record_id][ou_id] = {};
+                                                                       if (!copy_shortcut[record_id]) {
+                                                                               copy_shortcut[record_id] = {};
+                                                                       }
+                                                                       if (!copy_shortcut[record_id][ou_id]) {
+                                                                               copy_shortcut[record_id][ou_id] = {};
+                                                                       }
                                                                        copy_shortcut[record_id][ou_id][ label ] = volume_id;
 
                                                                }
@@ -407,9 +414,11 @@ circ.copy_status.prototype = {
                                                                                obj.error.sdump('D_ERROR','batch permission check: ' + E);
                                                                        }
        
-                                                                       if (edit==0) return; // no read-only view for this interface
+                                                                       if (edit==0) { 
+                                                                               return; // no read-only view for this interface
+                                                                       }
        
-                                                                       var title = 'Add Item for record #' + r;
+                                                                       var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_items.title', [r]);
        
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        var w = win.open(
@@ -450,7 +459,9 @@ circ.copy_status.prototype = {
                                     copies[i].isdeleted(1);
                                 }
 
-                                                               if (! window.confirm('Are you sure sure you want to delete these items? ' + util.functional.map_list( copies, function(o) { return o.barcode(); }).join(", ")) ) return;
+                                                               if (! window.confirm(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.del_items.confirm', [util.functional.map_list( copies, function(o) { return o.barcode(); }).join(", ")]))) {
+                                                                       return;
+                                                               }
 
                                 var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
                                                                var robj = obj.network.simple_request(
@@ -458,24 +469,24 @@ circ.copy_status.prototype = {
                                                                        [ ses(), copies, true ], 
                                                                        null,
                                                                        {
-                                                                               'title' : 'Override Delete Failure?',
+                                                                               'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.title'),
                                                                                'overridable_events' : [
                                                                                        1208 /* TITLE_LAST_COPY */,
-                                                                                       1227 /* COPY_DELETE_WARNING */,
+                                                                                       1227 /* COPY_DELETE_WARNING */
                                                                                ]
                                                                        }
                                                                );
        
                                 if (typeof robj.ilsevent != 'undefined') {
-                                                                       switch(robj.ilsevent) {
+                                                                       switch(Number(robj.ilsevent)) {
                                                                                case 1208 /* TITLE_LAST_COPY */:
                                                                                case 1227 /* COPY_DELETE_WARNING */:
                                                                                break;
                                                                                default:
-                                                                                       obj.error.standard_unexpected_error_alert('Batch Item Deletion',robj);
+                                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success.error'), robj);
                                                                                break;
                                                                        }
-                                                               } else { alert('Items Deleted'); }
+                                                               } else { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success')); }
 
                                                        } catch(E) {
                                                                obj.error.standard_unexpected_error_alert('copy status -> delete items',E);
@@ -488,7 +499,7 @@ circ.copy_status.prototype = {
                                                                try {
                                                                        obj.data.stash_retrieve();
                                                                        if (!obj.data.marked_volume) {
-                                                                               alert('Please mark a volume as the destination and then try this again.');
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.mark_destination'));
                                                                                return;
                                                                        }
                                                                        
@@ -496,17 +507,17 @@ circ.copy_status.prototype = {
 
                                                                        var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
 
-                                                                       var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
+                                                                       var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_volume ]);
 
                                                                        JSAN.use('cat.util'); cat.util.transfer_copies( { 
                                                                                'copy_ids' : list, 
                                                                                'docid' : volume.record(),
                                                                                'volume_label' : volume.label(),
-                                                                               'owning_lib' : volume.owning_lib(),
+                                                                               'owning_lib' : volume.owning_lib()
                                                                        } );
 
                                                                } catch(E) {
-                                                                       obj.error.standard_unexpected_error_alert('All copies not likely transferred.',E);
+                                                                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.problem'), E);
                                                                }
                                                        }
 
@@ -517,15 +528,17 @@ circ.copy_status.prototype = {
                                                        try {
                                                                JSAN.use('util.functional');
                                                                var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
-                                                               if (list.length == 0) return;
+                                                               if (list.length == 0) { return; }
 
                                                                var aou_hash = {}; var map_acn = {};
 
                                                                for (var i = 0; i < list.length; i++) {
                                                                        var volume_id = list[i];
-                                                                       if (volume_id == -1) continue; /* ignore magic pre-cat volume */
+                                                                       if (volume_id == -1) {
+                                                                               continue; /* ignore magic pre-cat volume */
+                                                                       }
                                                                        if (! map_acn[volume_id]) {
-                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
+                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
                                                                        }
                                                                        var record_id = map_acn[ volume_id ].record();
                                                                        var ou_id = map_acn[ volume_id ].owning_lib();
@@ -556,11 +569,11 @@ circ.copy_status.prototype = {
                                                                        }
 
                                                                        if (edit==0) {
-                                                                               alert("You don't have permission to add volumes to that library.");
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.add_volumes.perm_failure'));
                                                                                return; // no read-only view for this interface
                                                                        }
 
-                                                                       var title = 'Add Volume/Item for Record # ' + r;
+                                                                       var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_volumes.title', [r]);
 
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        var w = win.open(
@@ -586,25 +599,32 @@ circ.copy_status.prototype = {
                                                        try {
                                                                JSAN.use('util.functional');
                                                                var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
-                                                               if (list.length == 0) return;
+                                                               if (list.length == 0) { return; }
 
                                                                var volume_hash = {}; var map_acn = {};
 
                                                                for (var i = 0; i < list.length; i++) {
                                                                        var volume_id = list[i];
-                                                                       if (volume_id == -1) continue; /* ignore magic pre-cat volume */
+                                                                       if (volume_id == -1) {
+                                                                               continue; /* ignore magic pre-cat volume */
+                                                                       }
                                                                        if (! map_acn[volume_id]) {
-                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
+                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
                                                                                map_acn[ volume_id ].copies( [] );
                                                                        }
                                                                        var record_id = map_acn[ volume_id ].record();
-                                                                       if (!volume_hash[record_id]) volume_hash[record_id] = {};
+                                                                       if (!volume_hash[record_id]) {
+                                                                               volume_hash[record_id] = {};
+                                                                       }
                                                                        volume_hash[record_id][volume_id] = 1;
                                                                }
 
                                                                for (var rec in volume_hash) {
 
-                                                                       list = []; for (var v in volume_hash[rec]) list.push( map_acn[v] );
+                                                                       list = [];
+                                                                       for (var v in volume_hash[rec]) {
+                                                                               list.push( map_acn[v] );
+                                                                       }
 
                                                                        var edit = 0;
                                                                        try {
@@ -628,11 +648,16 @@ circ.copy_status.prototype = {
                                                                        }
 
                                                                        if (edit==0) {
-                                                                               alert("You don't have permission to edit this volume.");
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.perm_failure'));
                                                                                return; // no read-only view for this interface
                                                                        }
 
-                                                                       var title = (list.length == 1 ? 'Volume' : 'Volumes') + ' for record # ' + rec;
+                                                                       var title;
+                                                                       if (list.length == 1) {
+                                                                               title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.edit_volume.title', [rec]);
+                                                                       } else {
+                                                                               title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.edit_volumes.title', [rec]);
+                                                                       }
 
                                                                        JSAN.use('util.window'); var win = new util.window();
                                                                        //obj.data.volumes_temp = js2JSON( list );
@@ -648,7 +673,7 @@ circ.copy_status.prototype = {
                                                                        //obj.data.stash_retrieve();
                                                                        //var volumes = JSON2js( obj.data.volumes_temp );
                                                                        var volumes = my_xulG.volumes;
-                                                                       if (!volumes) return;
+                                                                       if (!volumes) { return; }
                                                                
                                                                        volumes = util.functional.filter_list(
                                                                                volumes,
@@ -665,7 +690,7 @@ circ.copy_status.prototype = {
                                                                                }
                                                                        );
 
-                                                                       if (volumes.length == 0) return;
+                                                                       if (volumes.length == 0) { return; }
 
                                                                        try {
                                                                                var r = obj.network.request(
@@ -674,14 +699,14 @@ circ.copy_status.prototype = {
                                                                                        [ ses(), volumes, false ]
                                                                                );
                                         if (typeof r.ilsevent != 'undefined') {
-                                            switch(r.ilsevent) {
+                                            switch(Number(r.ilsevent)) {
                                                 case 1705 /* VOLUME_LABEL_EXISTS */ :
-                                                    alert("Edit failed:  You tried to change a volume's callnumber to one that is already in use for the given library.  You should transfer the items to the desired callnumber instead.");
+                                                    alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.duplicate'));
                                                     break;
                                                 default: throw(r);
                                             }
                                         } else {
-                                                                               alert('Volumes modified.');
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.success'));
                                         }
                                                                        } catch(E) {
                                                                                obj.error.standard_unexpected_error_alert('volume update error: ',E);
@@ -700,21 +725,40 @@ circ.copy_status.prototype = {
                                                        try {
                                                                JSAN.use('util.functional');
                                                                var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
-                                                               if (list.length == 0) return;
+                                                               if (list.length == 0) { return; }
 
                                                                var map_acn = {};
 
                                                                for (var i = 0; i < list.length; i++) {
                                                                        var volume_id = list[i];
-                                                                       if (volume_id == -1) continue; /* ignore magic pre-cat volume */
+                                                                       if (volume_id == -1) {
+                                                                               continue; /* ignore magic pre-cat volume */
+                                                                       }
                                                                        if (! map_acn[volume_id]) {
-                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
+                                                                               map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
                                                                        }
                                                                }
 
-                                                               list = []; for (var v in map_acn) list.push( map_acn[v] );
+                                                               list = [];
+                                                               for (var v in map_acn) {
+                                                                       list.push( map_acn[v] );
+                                                               }
 
-                                                               var r = obj.error.yns_alert('Are you sure you would like to delete ' + (list.length != 1 ? 'these ' + list.length + ' volumes' : 'this one volume') + '?', 'Delete Volumes?', 'Delete', 'Cancel', null, 'Check here to confirm this action');
+                                                               var confirm_prompt;
+                                                               if (list.length == 1) {
+                                                                       confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.singular');
+                                                               } else {
+                                                                       confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.plural');
+                                                               }       
+
+                                                               var r = obj.error.yns_alert(
+                                                                       confirm_prompt,
+                                                                       document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.title'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.cancel'),
+                                                                       null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                               );
 
                                                                if (r == 0) {
                                                                        for (var i = 0; i < list.length; i++) {
@@ -725,7 +769,7 @@ circ.copy_status.prototype = {
                                                                                [ ses(), list, true ],
                                                                                null,
                                                                                {
-                                                                                       'title' : 'Override Delete Failure?',
+                                                                                       'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.override'),
                                                                                        'overridable_events' : [
                                                                                        ]
                                                                                }
@@ -733,12 +777,12 @@ circ.copy_status.prototype = {
                                                                        if (robj == null) throw(robj);
                                                                        if (typeof robj.ilsevent != 'undefined') {
                                                                                if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
-                                                                                       alert('You must delete all the copies on the volume before you may delete the volume itself.');
+                                                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete_copies'));
                                                                                        return;
                                                                                }
-                                                                               if (robj.ilsevent != 0) throw(robj);
+                                                                               if (robj.ilsevent != 0) { throw(robj); }
                                                                        }
-                                                                       alert('Volumes deleted.');
+                                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.success'));
                                                                }
                                                        } catch(E) {
                                                                obj.error.standard_unexpected_error_alert('copy status -> delete volumes',E);
@@ -757,9 +801,16 @@ circ.copy_status.prototype = {
                                                                if (list.length == 1) {
                                                                        obj.data.marked_volume = list[0];
                                                                        obj.data.stash('marked_volume');
-                                                                       alert('Volume marked as Item Transfer Destination');
+                                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.status'));
                                                                } else {
-                                                                       obj.error.yns_alert('Choose just one Volume to mark as Item Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
+                                                                       obj.error.yns_alert(
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.prompt'),
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.title'),
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
+                                                                               null,
+                                                                               null,
+                                                                               document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                                       );
                                                                }
                                                        } catch(E) {
                                                                obj.error.standard_unexpected_error_alert('copy status -> mark volume',E);
@@ -774,14 +825,24 @@ circ.copy_status.prototype = {
                                                                var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
 
                                                                if (list.length == 1) {
-                                                                       var v = obj.network.simple_request('FM_ACN_RETRIEVE',[list[0]]);
-                                                                       var owning_lib = v.owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
+                                                                       var v = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[list[0]]);
+                                                                       var owning_lib = v.owning_lib();
+                                                                       if (typeof owning_lib == 'object') {
+                                                                               owning_lib = owning_lib.id();
+                                                                       }
 
                                                                        obj.data.marked_library = { 'lib' : owning_lib, 'docid' : v.record() };
                                                                        obj.data.stash('marked_library');
-                                                                       alert('Library + Record marked as Volume Transfer Destination');
+                                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library'));
                                                                } else {
-                                                                       obj.error.yns_alert('Choose just one Library to mark as Volume Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
+                                                                       obj.error.yns_alert(
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one'),
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one.title'),
+                                                                               document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
+                                                                               null,
+                                                                               null,
+                                                                               document.getElementById('circStrings').getString('staff.circ.confirm')
+                                                                       );
                                                                }
                                                        } catch(E) {
                                                                obj.error.standard_unexpected_error_alert('copy status -> mark library',E);
@@ -794,42 +855,55 @@ circ.copy_status.prototype = {
                                                        try {
                                                                        obj.data.stash_retrieve();
                                                                        if (!obj.data.marked_library) {
-                                                                               alert('Please mark a library as the destination from within holdings maintenance and then try this again.');
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.none'));
                                                                                return;
                                                                        }
                                                                        
                                                                        JSAN.use('util.functional');
 
                                                                        var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
-                                                                       if (list.length == 0) return;
+                                                                       if (list.length == 0) { return; }
 
                                                                        var map_acn = {};
 
                                                                        for (var i = 0; i < list.length; i++) {
                                                                                var volume_id = list[i];
-                                                                               if (volume_id == -1) continue; /* ignore magic pre-cat volume */
+                                                                               if (volume_id == -1) {
+                                                                                       continue; /* ignore magic pre-cat volume */
+                                                                               }
                                                                                if (! map_acn[volume_id]) {
-                                                                                       map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
+                                                                                       map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
                                                                                }
                                                                        }
 
-                                                                       list = []; for (v in map_acn) list.push(map_acn[v]);
+                                                                       list = [];
+                                                                       for (v in map_acn) {
+                                                                               list.push(map_acn[v]);
+                                                                       }
 
                                                                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
                                                                        var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
-                                                                       xml += '<description>Transfer volumes ';
+                                                                       xml += '<description>';
 
-                                                                       xml += util.functional.map_list(
-                                                                               list,
+                                                                       var vols = util.functional.map_list(list,
                                                                                function (o) {
                                                                                        return o.label();
                                                                                }
                                                                        ).join(", ");
 
-                                                                       xml += ' to library ' + obj.data.hash.aou[ obj.data.marked_library.lib ].shortname();
-                                                                       xml += ' on the following record?</description>';
-                                                                       xml += '<hbox><button label="Transfer" name="fancy_submit"/>';
-                                                                       xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
+                                                                       var volume_list = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.transfer_volume.confirm', 
+                                                                               [vols, obj.data.hash.aou[ obj.data.marked_library.lib ].shortname()]);
+
+                                                                       xml += volume_list;
+                                                                       xml += '</description>';
+                                                                       xml += '<hbox><button label="';
+                                                                       xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.transfer.label');
+                                                                       xml += '" name="fancy_submit"/>';
+                                                                       xml += '<button label="';
+                                                                       xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.label');
+                                                                       xml += '" accesskey="';
+                                                                       xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.accesskey');
+                                                                       xml += '" name="fancy_cancel"/></hbox>';
                                                                        xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
                                                                        xml += '</vbox>';
                                                                        JSAN.use('OpenILS.data');
@@ -841,40 +915,43 @@ circ.copy_status.prototype = {
                                                                                //+ '?xml_in_stash=temp_transfer'
                                                                                //+ '&title=' + window.escape('Volume Transfer'),
                                                                                'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
-                                                                               { 'xml' : xml, 'title' : 'Volume Transfer' }
+                                                                               { 'xml' : xml, 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.title') }
                                                                        );
                                                                
-                                                                       if (fancy_prompt_data.fancy_status == 'incomplete') { alert('Transfer Aborted'); return; }
+                                                                       if (fancy_prompt_data.fancy_status == 'incomplete') { 
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.aborted'));
+                                                                               return;
+                                                                       }
 
                                                                        var robj = obj.network.simple_request(
                                                                                'FM_ACN_TRANSFER', 
                                                                                [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : util.functional.map_list( list, function(o) { return o.id(); }) } ],
                                                                                null,
                                                                                {
-                                                                                       'title' : 'Override Volume Transfer Failure?',
+                                                                                       'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.override_failure'),
                                                                                        'overridable_events' : [
                                                                                                1208 /* TITLE_LAST_COPY */,
-                                                                                               1219 /* COPY_REMOTE_CIRC_LIB */,
-                                                                                       ],
+                                                                                               1219 /* COPY_REMOTE_CIRC_LIB */
+                                                                                       ]
                                                                                }
                                                                        );
 
                                                                        if (typeof robj.ilsevent != 'undefined') {
                                                                                if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
-                                                                                       alert('That destination cannot have volumes.');
+                                                                                       alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cannot_have_vols'));
                                                                                } else {
                                                                                        throw(robj);
                                                                                }
                                                                        } else {
-                                                                               alert('Volumes transferred.');
+                                                                               alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.success'));
                                                                        }
 
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('All volumes not likely transferred.',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.error'),E);
                                                        }
                                                }
 
-                                       ],
+                                       ]
                                }
                        }
                );
@@ -887,17 +964,17 @@ circ.copy_status.prototype = {
                var obj = this;
                var good = util.barcode.check(bc);
                var x = document.getElementById('strict_barcode');
-               if (x && x.checked != true) return true;
+               if (x && x.checked != true) { return true; }
                if (good) {
                        return true;
                } else {
                        if ( 1 == obj.error.yns_alert(
-                                               'Bad checkdigit; possible mis-scan.  Use this barcode ("' + bc + '") anyway?',
-                                               'Bad Barcode',
-                                               'Cancel',
-                                               'Accept Barcode',
+                                               document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
                                                null,
-                                               'Check here to confirm this action',
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
                                                '/xul/server/skin/media/images/bad_barcode.png'
                        ) ) {
                                return true;
@@ -911,8 +988,10 @@ circ.copy_status.prototype = {
                var obj = this;
                try {
                        try { document.getElementById('last_scanned').setAttribute('value',''); } catch(E) {}
-                       if (!barcode) barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
-                       if (!barcode) return;
+                       if (!barcode) {
+                               barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
+                       }
+                       if (!barcode) { return; }
                        if (barcode) {
                                if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
                        }
@@ -921,9 +1000,9 @@ circ.copy_status.prototype = {
                                try {
                                        var details = req.getResultObject();
                                        if (details == null) {
-                                               throw('Something weird happened.  null result');
+                                               throw(document.getElementById('circStrings').getString('staff.circ.copy_status.status.null_result'));
                                        } else if (details.ilsevent) {
-                                               switch(details.ilsevent) {
+                                               switch(Number(details.ilsevent)) {
                                                        case -1: 
                                                                obj.error.standard_network_error_alert(); 
                                                                obj.controller.view.copy_status_barcode_entry_textbox.select();
@@ -931,8 +1010,15 @@ circ.copy_status.prototype = {
                                                                return;
                                                        break;
                                                        case 1502 /* ASSET_COPY_NOT_FOUND */ :
-                                                               try { document.getElementById('last_scanned').setAttribute('value',barcode + ' was either mis-scanned or is not cataloged.'); } catch(E) {}
-                                                               obj.error.yns_alert(barcode + ' was either mis-scanned or is not cataloged.','Not Cataloged','OK',null,null,'Check here to confirm this message');
+                                                               try { document.getElementById('last_scanned').setAttribute('value', document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode])); } catch(E) {}
+                                                               obj.error.yns_alert(
+                                                                       document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode]),
+                                                                       document.getElementById('circStrings').getString('staff.circ.copy_status.status.not_cataloged'),
+                                                                       document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
+                                                                       null,
+                                                                       null,
+                                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                               );
                                                                obj.controller.view.copy_status_barcode_entry_textbox.select();
                                                                obj.controller.view.copy_status_barcode_entry_textbox.focus();
                                                                return;
@@ -943,10 +1029,18 @@ circ.copy_status.prototype = {
                                                }
                                        }
                                        var msg = details.copy.barcode() + ' -- ';
-                                       if (details.copy.call_number() == -1) msg += 'Item is a Pre-Cat.  ';
-                                       if (details.hold) msg += 'Item is captured for a Hold.  ';
-                                       if (details.transit) msg += 'Item is in Transit.  ';
-                                       if (details.circ && ! details.circ.checkin_time()) msg += 'Item is circulating.  ';
+                                       if (details.copy.call_number() == -1) {
+                                               msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.pre_cat') + '  ';
+                                       }
+                                       if (details.hold) {
+                                               msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.hold') + '  ';
+                                       }
+                                       if (details.transit) {
+                                               msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.transit') + '  ';
+                                       }
+                                       if (details.circ && ! details.circ.checkin_time()) {
+                                               msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.circ') + '  ';
+                                       }
                                        try { document.getElementById('last_scanned').setAttribute('value',msg); } catch(E) {}
                                        if (document.getElementById('trim_list')) {
                                                var x = document.getElementById('trim_list');
@@ -969,10 +1063,10 @@ circ.copy_status.prototype = {
                                                                'acn' : details.volume,
                                                                'atc' : details.transit,
                                                                'circ' : details.circ,
-                                                               'ahr' : details.hold,
+                                                               'ahr' : details.hold
                                                        }
                                                },
-                                               'to_top' : true,
+                                               'to_top' : true
                                        };
                                        if (!refresh) {
                                                var nparams = obj.list.append(params);
@@ -1002,7 +1096,7 @@ circ.copy_status.prototype = {
                                        obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
                                }
                        }
-                       var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE', [ ses(), barcode ]);
+                       var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE.authoritative', [ ses(), barcode ]);
                        handle_req({'getResultObject':function(){return result;}}); // used to be async
                        obj.controller.view.copy_status_barcode_entry_textbox.value = '';
                        obj.controller.view.copy_status_barcode_entry_textbox.focus();
@@ -1017,11 +1111,9 @@ circ.copy_status.prototype = {
        
        'spawn_copy_editor' : function() {
 
-               /* FIXME -  a lot of redundant calls here */
-
                var obj = this;
 
-               JSAN.use('util.widgets'); JSAN.use('util.functional');
+               JSAN.use('util.functional');
 
                var list = obj.selection_list;
 
@@ -1032,35 +1124,7 @@ circ.copy_status.prototype = {
                        }
                );
 
-               var copies = util.functional.map_list(
-                       list,
-                       function (acp_id) {
-                               return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
-                       }
-               );
-
-               var edit = 0;
-               try {
-                       edit = obj.network.request(
-                               api.PERM_MULTI_ORG_CHECK.app,
-                               api.PERM_MULTI_ORG_CHECK.method,
-                               [ 
-                                       ses(), 
-                                       obj.data.list.au[0].id(), 
-                                       util.functional.map_list(
-                                               copies,
-                                               function (o) {
-                                                       return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
-                                               }
-                                       ),
-                                       copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
-                               ]
-                       ).length == 0 ? 1 : 0;
-               } catch(E) {
-                       obj.error.sdump('D_ERROR','batch permission check: ' + E);
-               }
-
-               JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
+               JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
 
        },
 
index bf05ed6..c1ec687 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') {
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                );
 
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Item Status'); } catch(E) { alert(E); }
+                                       try {
+                                               window.xulG.set_tab_name(document.getElementById('circStrings').getString('staff.circ.copy_status.tab_name'));
+                                       } catch(E) {
+                                               alert(E);
+                                       }
                                }
 
                                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.stash_retrieve();
@@ -78,9 +84,7 @@
                                }
        
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'circ.copy_status.xul\n' + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ.copy_status.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -90,6 +94,9 @@
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <commandset id="copy_status_cmds">
                <command id="cmd_copy_status_submit_barcode" />
                <command id="cmd_copy_status_upload_file" />
index ad406a9..6fd1a31 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE overlay PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 <overlay id="copy_status_overlay" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
 <popupset id="copy_status_popupset">
        <popup id="copy_status_actions" position="at_pointer"> 
-               <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-               <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-               <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-               <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-               <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+               <menuitem command="sel_clip" label="&staff.circ.copy_status_overlay.sel_clip.label;" accesskey="&staff.circ.copy_status_overlay.sel_clip.accesskey;" />
+               <menuitem command="sel_bucket" label="&staff.circ.copy_status_overlay.sel_bucket.label;" accesskey="&staff.circ.copy_status_overlay.sel_bucket.accesskey;"/>
+               <menuitem command="sel_opac" label="&staff.circ.copy_status_overlay.sel_opac.label;" accesskey="&staff.circ.copy_status_overlay.sel_opac.accesskey;" />
+               <menuitem command="sel_copy_details" label="&staff.circ.copy_status_overlay.sel_copy_details.label;" accesskey="&staff.circ.copy_status_overlay.sel_copy_details.accesskey;" />
+               <menuitem command="sel_patron" label="&staff.circ.copy_status_overlay.sel_patron.label;" accesskey="&staff.circ.copy_status_overlay.sel_patron.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
+               <menuitem command="sel_edit" label="&staff.circ.copy_status_overlay.sel_edit.label;" accesskey="&staff.circ.copy_status_overlay.sel_edit.accesskey;" />
                <menuseparator/>
-               <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
+               <menuitem command="sel_mark_items_damaged" label="&staff.circ.copy_status_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="M"/>
+               <menuitem command="sel_mark_items_missing" label="&staff.circ.copy_status_overlay.sel_mark_items_missing.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_transit_abort" label="Abort Transits" />
+               <menuitem command="sel_transit_abort" label="&staff.circ.copy_status_overlay.sel_transit_abort.label;" />
                <menuseparator/>
-               <menuitem command="sel_checkin" label="Check In Items" accesskey="N" />
+               <menuitem command="sel_checkin" label="&staff.circ.copy_status_overlay.sel_checkin.label;" accesskey="&staff.circ.copy_status_overlay.sel_checkin.accesskey;" />
                <menuseparator/>
-               <menuitem command="sel_renew" label="Renew Items" accesskey="R" />
+               <menuitem command="sel_renew" label="&staff.circ.copy_status_overlay.sel_renew.label;" accesskey="&staff.circ.copy_status_overlay.sel_renew.accesskey;" />
                <menuseparator />
-               <menuitem command="sel_spine" label="Print Spine Label" accesskey="P"/>
-               <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-               <menuitem command="save_columns" label="Save Columns"/>
+               <menuitem command="sel_spine" label="&staff.circ.copy_status_overlay.sel_spine.label;" accesskey="&staff.circ.copy_status_overlay.sel_spine.accesskey;"/>
+               <menuitem command="cmd_replace_barcode" label="&staff.circ.copy_status_overlay.cmd_replace_barcode.label;" accesskey="&staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey;"/>
+               <menuitem command="save_columns" label="&staff.circ.copy_status_overlay.save_columns.label;"/>
        </popup>
 </popupset>
 
 <popupset id="copy_cat_status_popupset">
        <popup id="copy_cat_status_actions" position="at_pointer"> 
-               <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C"/>
-               <menuitem command="sel_bucket" label="Add Items to Buckets" accesskey="B"/>
-               <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-               <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-               <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+               <menuitem command="sel_clip" label="&staff.circ.copy_status_overlay.sel_clip.label;" accesskey="&staff.circ.copy_status_overlay.sel_clip.accesskey;" />
+               <menuitem command="sel_bucket" label="&staff.circ.copy_status_overlay.sel_bucket.label;" accesskey="&staff.circ.copy_status_overlay.sel_bucket.accesskey;"/>
+               <menuitem command="sel_opac" label="&staff.circ.copy_status_overlay.sel_opac.label;" accesskey="&staff.circ.copy_status_overlay.sel_opac.accesskey;" />
+               <menuitem command="sel_copy_details" label="&staff.circ.copy_status_overlay.sel_copy_details.label;" accesskey="&staff.circ.copy_status_overlay.sel_copy_details.accesskey;" />
+               <menuitem command="sel_patron" label="&staff.circ.copy_status_overlay.sel_patron.label;" accesskey="&staff.circ.copy_status_overlay.sel_patron.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E"/>
-               <menuitem command="cmd_transfer_items" label="Transfer Items to Previously Marked Volume" accesskey="T"/>
+               <menuitem command="sel_edit" label="&staff.circ.copy_status_overlay.sel_edit.label;" accesskey="&staff.circ.copy_status_overlay.sel_edit.accesskey;" />
+               <menuitem command="cmd_transfer_items" label="&staff.circ.copy_status_overlay.cmd_transfer_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_transfer_items.accesskey;"/>
                <menuseparator/>
-               <menuitem command="cmd_add_volumes" label="Add Volumes" accesskey="V"/>
-               <menuitem command="cmd_mark_library" label="Mark Library as Volume Transfer Destination" accesskey="M"/>
+               <menuitem command="cmd_add_volumes" label="&staff.circ.copy_status_overlay.cmd_add_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_add_volumes.accesskey;"/>
+               <menuitem command="cmd_mark_library" label="&staff.circ.copy_status_overlay.cmd_mark_library.label;" accesskey="&staff.circ.copy_status_overlay.cmd_mark_library.accesskey;"/>
                <menuseparator/>
-               <menuitem command="cmd_add_items" label="Add Items" accesskey="A"/>
-               <menuitem command="cmd_edit_volumes" label="Edit Volumes" accesskey="E"/>
-               <menuitem command="cmd_mark_volume" label="Mark Volume as Item Transfer Destination" accesskey="M"/>
-               <menuitem command="cmd_transfer_volume" label="Transfer Volumes to Previously Marked Library" accesskey="T"/>
+               <menuitem command="cmd_add_items" label="&staff.circ.copy_status_overlay.cmd_add_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_add_items.accesskey;"/>
+               <menuitem command="cmd_edit_volumes" label="&staff.circ.copy_status_overlay.cmd_edit_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_edit_volumes.accesskey;"/>
+               <menuitem command="cmd_mark_volume" label="&staff.circ.copy_status_overlay.cmd_mark_volume.label;" accesskey="&staff.circ.copy_status_overlay.cmd_mark_volume.accesskey;"/>
+               <menuitem command="cmd_transfer_volume" label="&staff.circ.copy_status_overlay.cmd_transfer_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_transfer_volumes.accesskey;"/>
                <menuseparator/>
-               <menuitem command="cmd_delete_items" label="Delete Items" accesskey=""/>
-               <menuitem command="cmd_delete_volumes" label="Delete Volumes" accesskey=""/>
+               <menuitem command="cmd_delete_items" label="&staff.circ.copy_status_overlay.cmd_delete_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_delete_items.accesskey;"/>
+               <menuitem command="cmd_delete_volumes" label="&staff.circ.copy_status_overlay.cmd_delete_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_delete_volumes.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-               <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="g"/>
+               <menuitem command="sel_mark_items_damaged" label="&staff.circ.copy_status_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey;"/>
+               <menuitem command="sel_mark_items_missing" label="&staff.circ.copy_status_overlay.sel_mark_items_missing.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey;"/>
                <menuseparator/>
-               <menuitem command="sel_spine" label="Print Item Spine Labels" accesskey="P"/>
-               <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-               <menuitem command="save_columns" label="Save Columns"/>
+               <menuitem command="sel_spine" label="&staff.circ.copy_status_overlay.sel_spine.label;" accesskey="&staff.circ.copy_status_overlay.sel_spine.accesskey;"/>
+               <menuitem command="cmd_replace_barcode" label="&staff.circ.copy_status_overlay.cmd_replace_barcode.label;" accesskey="&staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey;"/>
+               <menuitem command="save_columns" label="&staff.circ.copy_status_overlay.save_columns.label;"/>
        </popup>
 </popupset>
 
@@ -74,7 +74,7 @@
 <vbox id="cmvb1" flex="1">
        <hbox id="background" style="background-color: yellow">
                <spacer flex="1"/>
-               <label value="Item Status" style="font-size: x-large; font-weight: bold;"/>
+               <label value="&staff.circ.copy_status_overlay.item_status.label;" style="font-size: x-large; font-weight: bold;"/>
                <spacer flex="1"/>
        </hbox>
        <hbox id="last_scanned_hbox" style="background-color: yellow">
@@ -83,7 +83,7 @@
                <spacer flex="1"/>
        </hbox>
        <groupbox id="cmgb1" flex="2">
-               <caption label="Scan Item" />
+               <caption label="&staff.circ.copy_status_overlay.last_scanned.caption;" />
                <hbox id="copy_status_top_ui" />
                <tree id="copy_status_list" flex="1" enableColumnDrag="true" context="copy_status_actions" />
                <hbox id="copy_status_bottom_ui" />
 
 <hbox id="copy_status_top_ui">
        <label id="copy_status_scan_barcode_label" 
-               value="Barcode:"
-               accesskey="B"
+               value="&staff.circ.copy_status_overlay.copy_status_scan_barcode.label;"
+               accesskey="&staff.circ.copy_status_overlay.copy_status_scan_barcode.accesskey;"
                control="copy_status_barcode_entry_textbox"/>
        <textbox id="copy_status_barcode_entry_textbox"/>
        <button id="copy_status_submit_barcode_button" 
-               label="Submit"
-               accesskey="t"
+               label="&staff.circ.copy_status_overlay.copy_status_submit_barcode.label;"
+               accesskey="&staff.circ.copy_status_overlay.copy_status_submit_barcode.accesskey;"
                command="cmd_copy_status_submit_barcode"/>
        <button id="copy_status_upload_file_button" 
-               label="Upload From File"
-               accesskey="U"
+               label="&staff.circ.copy_status_overlay.copy_status_upload_file.label;"
+               accesskey="&staff.circ.copy_status_overlay.copy_status_upload_file.accesskey;"
                command="cmd_copy_status_upload_file"/>
        <spacer flex="1"/>
        <menubar>
-       <menu label="Actions for Catalogers" accesskey="f">
+       <menu label="&staff.circ.copy_status_overlay.cataloger_actions.label;" accesskey="&staff.circ.copy_status_overlay.cataloger_actions.accesskey;">
                <menupopup>
-                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C"/>
-                       <menuitem command="sel_bucket" label="Add Items to Buckets" accesskey="B"/>
-                       <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                       <menuitem command="sel_clip" label="&staff.circ.copy_status_overlay.sel_clip.label;" accesskey="&staff.circ.copy_status_overlay.sel_clip.accesskey;" />
+                       <menuitem command="sel_bucket" label="&staff.circ.copy_status_overlay.sel_bucket.label;" accesskey="&staff.circ.copy_status_overlay.sel_bucket.accesskey;"/>
+                       <menuitem command="sel_opac" label="&staff.circ.copy_status_overlay.sel_opac.label;" accesskey="&staff.circ.copy_status_overlay.sel_opac.accesskey;" />
+                       <menuitem command="sel_copy_details" label="&staff.circ.copy_status_overlay.sel_copy_details.label;" accesskey="&staff.circ.copy_status_overlay.sel_copy_details.accesskey;" />
+                       <menuitem command="sel_patron" label="&staff.circ.copy_status_overlay.sel_patron.label;" accesskey="&staff.circ.copy_status_overlay.sel_patron.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E"/>
-                       <menuitem command="cmd_transfer_items" label="Transfer Items to Previously Marked Volume" accesskey="T"/>
+                       <menuitem command="sel_edit" label="&staff.circ.copy_status_overlay.sel_edit.label;" accesskey="&staff.circ.copy_status_overlay.sel_edit.accesskey;" />
+                       <menuitem command="cmd_transfer_items" label="&staff.circ.copy_status_overlay.cmd_transfer_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_transfer_items.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_add_volumes" label="Add Volumes" accesskey="V"/>
-                       <menuitem command="cmd_mark_library" label="Mark Library as Volume Transfer Destination" accesskey="M"/>
+                       <menuitem command="cmd_add_volumes" label="&staff.circ.copy_status_overlay.cmd_add_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_add_volumes.accesskey;"/>
+                       <menuitem command="cmd_mark_library" label="&staff.circ.copy_status_overlay.cmd_mark_library.label;" accesskey="&staff.circ.copy_status_overlay.cmd_mark_library.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_add_items" label="Add Items" accesskey="A"/>
-                       <menuitem command="cmd_edit_volumes" label="Edit Volumes" accesskey="E"/>
-                       <menuitem command="cmd_mark_volume" label="Mark Volume as Item Transfer Destination" accesskey="M"/>
-                       <menuitem command="cmd_transfer_volume" label="Transfer Volumes to Previously Marked Library" accesskey="T"/>
+                       <menuitem command="cmd_add_items" label="&staff.circ.copy_status_overlay.cmd_add_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_add_items.accesskey;"/>
+                       <menuitem command="cmd_edit_volumes" label="&staff.circ.copy_status_overlay.cmd_edit_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_edit_volumes.accesskey;"/>
+                       <menuitem command="cmd_mark_volume" label="&staff.circ.copy_status_overlay.cmd_mark_volume.label;" accesskey="&staff.circ.copy_status_overlay.cmd_mark_volume.accesskey;"/>
+                       <menuitem command="cmd_transfer_volume" label="&staff.circ.copy_status_overlay.cmd_transfer_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_transfer_volumes.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="cmd_delete_items" label="Delete Items" accesskey=""/>
-                       <menuitem command="cmd_delete_volumes" label="Delete Volumes" accesskey=""/>
+                       <menuitem command="cmd_delete_items" label="&staff.circ.copy_status_overlay.cmd_delete_items.label;" accesskey="&staff.circ.copy_status_overlay.cmd_delete_items.accesskey;"/>
+                       <menuitem command="cmd_delete_volumes" label="&staff.circ.copy_status_overlay.cmd_delete_volumes.label;" accesskey="&staff.circ.copy_status_overlay.cmd_delete_volumes.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-                       <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="g"/>
+                       <menuitem command="sel_mark_items_damaged" label="&staff.circ.copy_status_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey;"/>
+                       <menuitem command="sel_mark_items_missing" label="&staff.circ.copy_status_overlay.sel_mark_items_missing.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey;"/>
                        <menuseparator/>
-                       <menuitem command="sel_spine" label="Print Item Spine Labels" accesskey="P"/>
-                       <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-                       <menuitem command="save_columns" label="Save Columns"/>
+                       <menuitem command="sel_spine" label="&staff.circ.copy_status_overlay.sel_spine.label;" accesskey="&staff.circ.copy_status_overlay.sel_spine.accesskey;"/>
+                       <menuitem command="cmd_replace_barcode" label="&staff.circ.copy_status_overlay.cmd_replace_barcode.label;" accesskey="&staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey;"/>
+                       <menuitem command="save_columns" label="&staff.circ.copy_status_overlay.save_columns.label;"/>
                </menupopup>
        </menu>
        <menu label="Actions for Selected Items" accesskey="S">
                <menupopup>
-                       <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-                       <menuitem command="sel_bucket" label="Add to Item Bucket" accesskey="A"/>
-                       <menuitem command="sel_opac" label="Show in Catalog" accesskey="S" />
-                       <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                       <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                       <menuitem command="sel_clip" label="&staff.circ.copy_status_overlay.sel_clip.label;" accesskey="&staff.circ.copy_status_overlay.sel_clip.accesskey;" />
+                       <menuitem command="sel_bucket" label="&staff.circ.copy_status_overlay.sel_bucket.label;" accesskey="&staff.circ.copy_status_overlay.sel_bucket.accesskey;"/>
+                       <menuitem command="sel_opac" label="&staff.circ.copy_status_overlay.sel_opac.label;" accesskey="&staff.circ.copy_status_overlay.sel_opac.accesskey;" />
+                       <menuitem command="sel_copy_details" label="&staff.circ.copy_status_overlay.sel_copy_details.label;" accesskey="&staff.circ.copy_status_overlay.sel_copy_details.accesskey;" />
+                       <menuitem command="sel_patron" label="&staff.circ.copy_status_overlay.sel_patron.label;" accesskey="&staff.circ.copy_status_overlay.sel_patron.accesskey;"/>
                        <menuseparator />
-                       <menuitem command="sel_edit" label="Edit Item Attributes" accesskey="E" />
+                       <menuitem command="sel_edit" label="&staff.circ.copy_status_overlay.sel_edit.label;" accesskey="&staff.circ.copy_status_overlay.sel_edit.accesskey;" />
                        <menuseparator />
-                       <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
+                       <menuitem command="sel_mark_items_damaged" label="&staff.circ.copy_status_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_damaged.accesskey;"/>
                        <menuseparator />
-                       <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="M"/>
+                       <menuitem command="sel_mark_items_missing" label="&staff.circ.copy_status_overlay.sel_mark_items_missing.label;" accesskey="&staff.circ.copy_status_overlay.sel_mark_items_missing.accesskey;"/>
                        <menuseparator />
-                       <menuitem command="sel_transit_abort" label="Abort Transits" />
+                       <menuitem command="sel_transit_abort" label="&staff.circ.copy_status_overlay.sel_transit_abort.label;" />
                        <menuseparator />
-                       <menuitem command="sel_checkin" label="Check In Items" accesskey="N" />
+                       <menuitem command="sel_checkin" label="&staff.circ.copy_status_overlay.sel_checkin.label;" accesskey="&staff.circ.copy_status_overlay.sel_checkin.accesskey;" />
                        <menuseparator />
-                       <menuitem command="sel_renew" label="Renew Items" accesskey="R" />
+                       <menuitem command="sel_renew" label="&staff.circ.copy_status_overlay.sel_renew.label;" accesskey="&staff.circ.copy_status_overlay.sel_renew.accesskey;" />
                        <menuseparator />
-                       <menuitem command="sel_spine" label="Print Spine Label" accesskey="P"/>
-                       <menuitem command="cmd_replace_barcode" label="Replace Barcode" accesskey=""/>
-                       <menuitem command="save_columns" label="Save Columns"/>
+                       <menuitem command="sel_spine" label="&staff.circ.copy_status_overlay.sel_spine.label;" accesskey="&staff.circ.copy_status_overlay.sel_spine.accesskey;"/>
+                       <menuitem command="cmd_replace_barcode" label="&staff.circ.copy_status_overlay.cmd_replace_barcode.label;" accesskey="&staff.circ.copy_status_overlay.cmd_replace_barcode.accesskey;"/>
+                       <menuitem command="save_columns" label="&staff.circ.copy_status_overlay.save_columns.label;"/>
                </menupopup>
        </menu>
        </menubar>
 </hbox>
 
 <hbox id="copy_status_bottom_ui">
-       <button id="copy_status_print" label="Print" command="cmd_copy_status_print" accesskey="P"/>
-       <button id="copy_status_export" label="Export" command="cmd_copy_status_export" accesskey=""/>
-       <button id="copy_status_export" label="Print Export" command="cmd_copy_status_print_export" accesskey=""/>
-       <checkbox id="trim_list" label="Trim List (20 rows)" checked="true" persist="checked" oncommand="try{this.setAttribute('checked',this.checked);}catch(E){alert(E);}" /> 
-       <checkbox id="strict_barcode" label="Strict Barcode" checked="false" persist="checked" oncommand="try{this.setAttribute('checked',this.checked);}catch(E){alert(E);}" /> 
+       <button id="copy_status_print" label="&staff.circ.copy_status_overlay.copy_status_print.label;" command="cmd_copy_status_print" accesskey="&staff.circ.copy_status_overlay.copy_status_print.accesskey;"/>
+       <button id="copy_status_export" label="&staff.circ.copy_status_overlay.copy_status_export.label;" command="cmd_copy_status_export" accesskey="&staff.circ.copy_status_overlay.copy_status_export.accesskey;"/>
+       <button id="copy_status_print_export" label="&staff.circ.copy_status_overlay.copy_status_print_export.label;" command="cmd_copy_status_print_export" accesskey="&staff.circ.copy_status_overlay.copy_status_print_export.accesskey;"/>
+       <checkbox id="trim_list" label="&staff.circ.copy_status_overlay.trim_list.label;" checked="true" persist="checked" oncommand="try{this.setAttribute('checked',this.checked);}catch(E){alert(E);}" /> 
+       <checkbox id="strict_barcode" label="&staff.circ.copy_status_overlay.strict_barcode.label;" checked="false" persist="checked" oncommand="try{this.setAttribute('checked',this.checked);}catch(E){alert(E);}" /> 
        <spacer flex="1"/>
 </hbox>
 
diff --git a/Open-ILS/xul/staff_client/server/circ/hold_capture.js b/Open-ILS/xul/staff_client/server/circ/hold_capture.js
deleted file mode 100644 (file)
index cc544a0..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-dump('entering circ.hold_capture.js\n');
-
-if (typeof circ == 'undefined') circ = {};
-circ.hold_capture = function (params) {
-
-       JSAN.use('util.error'); this.error = new util.error();
-       JSAN.use('util.network'); this.network = new util.network();
-       this.OpenILS = {}; JSAN.use('OpenILS.data'); this.OpenILS.data = new OpenILS.data(); this.OpenILS.data.init({'via':'stash'});
-}
-
-circ.hold_capture.prototype = {
-
-       'init' : function( params ) {
-
-               var obj = this;
-
-               JSAN.use('circ.util');
-               var columns = circ.util.columns( 
-                       { 
-                               'barcode' : { 'hidden' : false },
-                               'title' : { 'hidden' : false },
-                               'status' : { 'hidden' : false },
-                               //'checkin_status' : { 'hidden' : false },
-                               'checkin_route_to' : { 'hidden' : false },
-                               'checkin_text' : { 'hidden' : false, 'flex' : 3 },
-                       } 
-               );
-               dump('columns = ' + js2JSON(columns) + '\n');
-
-               JSAN.use('util.list'); obj.list = new util.list('hold_capture_list');
-               obj.list.init(
-                       {
-                               'columns' : columns,
-                               'map_row_to_columns' : circ.util.std_map_row_to_columns(),
-                       }
-               );
-               
-               JSAN.use('util.controller'); obj.controller = new util.controller();
-               obj.controller.init(
-                       {
-                               'control_map' : {
-                                       'hold_capture_barcode_entry_textbox' : [
-                                               ['keypress'],
-                                               function(ev) {
-                                                       if (ev.keyCode && ev.keyCode == 13) {
-                                                               obj.hold_capture();
-                                                       }
-                                               }
-                                       ],
-                                       'cmd_broken' : [
-                                               ['command'],
-                                               function() { alert('Not Yet Implemented'); }
-                                       ],
-                                       'cmd_hold_capture_submit_barcode' : [
-                                               ['command'],
-                                               function() {
-                                                       obj.hold_capture();
-                                               }
-                                       ],
-                                       'cmd_hold_capture_print' : [
-                                               ['command'],
-                                               function() {
-                                                       var p = { 
-                                                               'template' : 'hold_capture'
-                                                       };
-                                                       obj.list.print(p);
-                                               }
-                                       ],
-                                       'cmd_hold_capture_reprint' : [
-                                               ['command'],
-                                               function() {
-                                               }
-                                       ],
-                                       'cmd_hold_capture_done' : [
-                                               ['command'],
-                                               function() {
-                                               }
-                                       ],
-                               }
-                       }
-               );
-               this.controller.view.hold_capture_barcode_entry_textbox.focus();
-
-       },
-
-       'hold_capture' : function() {
-               var obj = this;
-               try {
-                       var barcode = obj.controller.view.hold_capture_barcode_entry_textbox.value;
-                       JSAN.use('circ.util');
-                       var hold_capture = circ.util.hold_capture_via_copy_barcode(
-                               ses(), barcode, true
-                       );
-                       if (hold_capture) {
-                               JSAN.use('patron.util');
-                               var au_obj;
-                               if (hold_capture.hold && hold_capture.hold.usr()) {
-
-                                       au_obj = patron.util.retrieve_au_via_id( ses(), hold_capture.hold.usr() );
-
-                               } else {
-
-                                       au_obj = new au(); au_obj.family_name( '???' );
-
-                               }
-                               obj.list.append(
-                                       {
-                                               'row' : {
-                                                       'my' : {
-                                                               'au' : au_obj,
-                                                               'hr' : hold_capture.hold,
-                                                               'circ' : hold_capture.circ,
-                                                               'mvr' : hold_capture.record,
-                                                               'acp' : hold_capture.copy,
-                                                               'route_to' : hold_capture.route_to,
-                                                               'message' : hold_capture.message,
-                                                       }
-                                               }
-                                       //I could override map_row_to_column here
-                                       }
-                               );
-               
-                               try {
-                               alert('To Printer\n' + hold_capture.text + '\r\n' + 'Barcode: ' + barcode + '  Title: ' + hold_capture.record.title() + 
-                                       '  Author: ' + hold_capture.record.author() + '\r\n' +
-                                       'Route To: ' + hold_capture.route_to + 
-                                       '  Patron: ' + au_obj.card().barcode() + ' ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + 
-                                       '\r\n'); //FIXME
-                               } catch(E) { dump('errors\n'); }
-                               /*
-                               sPrint(hold_capture.text + '<br />\r\n' + 'Barcode: ' + barcode + '  Title: ' + hold_capture.record.title() + 
-                                       '  Author: ' + hold_capture.record.author() + '<br />\r\n' +
-                                       'Route To: ' + hold_capture.route_to + 
-                                       '  Patron: ' + au_obj.card().barcode() + ' ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + 
-                                       '<br />\r\n'
-                               );
-                               */
-
-                               if (typeof obj.on_hold_capture == 'function') {
-                                       obj.on_hold_capture(hold_capture);
-                               }
-                               if (typeof window.xulG == 'object' && typeof window.xulG.on_hold_capture == 'function') {
-                                       obj.error.sdump('D_CIRC','circ.hold_capture: Calling external .on_hold_capture()\n');
-                                       window.xulG.on_hold_capture(hold_capture);
-                               } else {
-                                       obj.error.sdump('D_CIRC','circ.hold_capture: No external .on_hold_capture()\n');
-                               }
-                       } else {
-                               throw("Could not capture hold.");
-                       }
-
-               } catch(E) {
-                       alert('FIXME: need special alert and error handling\n'
-                               + js2JSON(E));
-                       if (typeof obj.on_failure == 'function') {
-                               obj.on_failure(E);
-                       }
-                       if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
-                               obj.error.sdump('D_CIRC','circ.hold_capture: Calling external .on_failure()\n');
-                               window.xulG.on_failure(E);
-                       } else {
-                               obj.error.sdump('D_CIRC','circ.hold_capture: No external .on_failure()\n');
-                       }
-               }
-
-       },
-
-       'on_hold_capture' : function() {
-               this.controller.view.hold_capture_barcode_entry_textbox.value = '';
-               this.controller.view.hold_capture_barcode_entry_textbox.focus();
-       },
-
-       'on_failure' : function() {
-               this.controller.view.hold_capture_barcode_entry_textbox.select();
-               this.controller.view.hold_capture_barcode_entry_textbox.focus();
-       }
-}
-
-dump('exiting circ.hold_capture.js\n');
diff --git a/Open-ILS/xul/staff_client/server/circ/hold_capture.xul b/Open-ILS/xul/staff_client/server/circ/hold_capture.xul
deleted file mode 100644 (file)
index 55f7cad..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-<!-- Application: Evergreen Staff Client -->
-<!-- Screen: Patron Display -->
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- STYLESHEETS -->
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
-<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
-<?xml-stylesheet href="/xul/server/skin/circ.css" type="text/css"?>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- LOCALIZATION -->
-<!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
-]>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- OVERLAYS -->
-<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
-<?xul-overlay href="/xul/server/circ/hold_capture_overlay.xul"?>
-
-<window id="hold_capture_win" 
-       onload="try { my_init(); font_helper(); } catch(E) { alert(E); }"
-       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-       <!-- BEHAVIOR -->
-        <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
-        <scripts id="openils_util_scripts"/>
-
-       <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
-       <script>
-       <![CDATA[
-               function my_init() {
-                       try {
-                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
-                               JSAN.errorLevel = "die"; // none, warn, or die
-                               JSAN.addRepository('/xul/server/');
-                               JSAN.use('util.error'); g.error = new util.error();
-                               g.error.sdump('D_TRACE','my_init() for hold_capture.xul');
-
-                               JSAN.use('circ.hold_capture'); g.hold_capture = new circ.hold_capture();
-                               g.hold_capture.init( 
-                                       { 
-                                       } 
-                               );
-       
-                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Hold Capture'); } catch(E) { alert(E); }
-                               }
-
-                       } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'circ.hold_capture.xul\n' + E + '\n';
-                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
-                               alert(err_msg);
-                       }
-               }
-
-       ]]>
-       </script>
-
-       <commandset id="hold_capture_cmds">
-               <command id="cmd_hold_capture_submit_barcode" />
-               <command id="cmd_hold_capture_print" />
-               <command id="cmd_hold_capture_reprint" />
-               <command id="cmd_hold_capture_done" />
-       </commandset>
-
-       <box id="hold_capture_main" />
-
-</window>
-
diff --git a/Open-ILS/xul/staff_client/server/circ/hold_capture_overlay.xul b/Open-ILS/xul/staff_client/server/circ/hold_capture_overlay.xul
deleted file mode 100644 (file)
index 91bc0e4..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE overlay PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
-]>
-<overlay id="hold_capture_overlay" 
-       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<script>dump('loading hold_capture_overlay.xul\n');</script>
-
-<commandset id="hold_capture_cmds" />
-
-<box id="hold_capture_main" flex="1" orient="vertical" class="my_overflow">
-       <vbox id="cmvb1" flex="1"/>
-</box>
-
-<vbox id="cmvb1" flex="1">
-       <groupbox id="cmgb1" flex="2">
-               <caption label="&staff.circ.hold_capture.caption;" />
-               <hbox id="hold_capture_top_ui" />
-               <tree id="hold_capture_list" flex="1" enableColumnDrag="true"/>
-               <hbox id="hold_capture_bottom_ui" />
-       </groupbox>
-</vbox>
-
-<hbox id="hold_capture_top_ui">
-       <label id="hold_capture_scan_barcode_label" 
-               value="&staff.circ.hold_capture.scan_label;" 
-               accesskey="&staff.circ.hold_capture.scan_label.accesskey;" 
-               control="hold_capture_barcode_entry_textbox"/>
-       <textbox id="hold_capture_barcode_entry_textbox"/>
-       <button id="hold_capture_submit_barcode_button" 
-               label="&staff.circ.hold_capture.submit_label;" 
-               command="cmd_hold_capture_submit_barcode"
-               accesskey="&staff.circ.hold_capture.submit_label.accesskey;"/>
-</hbox>
-
-<hbox id="hold_capture_bottom_ui">
-       <button id="hold_capture_print" 
-               label="&staff.hold_capture.print_receipt_label;" 
-               command="cmd_hold_capture_print"
-               accesskey="&staff.hold_capture.print_receipt_label.accesskey;"/>
-       <button id="hold_capture_reprint" 
-               label="&staff.hold_capture.reprint_receipt_label;" 
-               command="cmd_hold_capture_reprint"
-               accesskey="&staff.hold_capture.reprint_receipt_label.accesskey;"/>
-       <spacer id="pcii3s" flex="1"/>
-       <checkbox id="hold_capture_auto" 
-               label="&staff.hold_capture.auto_print_label;" 
-               accesskey="&staff.hold_capture.auto_print_label.accesskey;"/> 
-       <button id="hold_capture_done" 
-               label="&staff.hold_capture.done_label;" 
-               command="cmd_hold_capture_done"
-               accesskey="&staff.hold_capture.done_label.accesskey;"/>
-</hbox>
-
-</overlay>
index 9c2d24e..da0e6b4 100644 (file)
@@ -1,4 +1,5 @@
 dump('entering circ.in_house_use.js\n');
+// vim:noet:sw=4:ts=4:
 
 if (typeof circ == 'undefined') circ = {};
 circ.in_house_use = function (params) {
@@ -24,7 +25,7 @@ circ.in_house_use.prototype = {
                                'status' : { 'hidden' : false },
                                'location' : { 'hidden' : false },
                                'call_number' : { 'hidden' : false },
-                               'uses' : { 'hidden' : false },
+                               'uses' : { 'hidden' : false }
                        } 
                );
 
@@ -54,10 +55,10 @@ circ.in_house_use.prototype = {
                                                function(e) {
                                                        return function() {
                                                                JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
-                                                               var items = [ [ 'Barcode:' , 'barcode' ] ].concat(
+                                                               var items = [ [ document.getElementById('circStrings').getString('staff.circ.in_house_use.barcode') , 'barcode' ] ].concat(
                                                                        util.functional.map_list(
                                                                                util.functional.filter_list(
-                                                                                       obj.data.list.cnct,
+                                                                                       obj.data.list.my_cnct,
                                                                                        function(o) {
                                                                                                return util.fm_utils.compare_aou_a_is_b_or_ancestor(o.owning_lib(), obj.data.list.au[0].ws_ou());
                                                                                        }
@@ -70,7 +71,7 @@ circ.in_house_use.prototype = {
                                                                                                                [ b.owning_lib(), b.name() ]
                                                                                                        );
                                                                                                } catch(E) {
-                                                                                                       alert('error in noncat sorting: ' + E);
+                                                                                                       alert(document.getElementById('circStrings').getString('staff.circ.in_house_use.noncat_sort_error') + ' ' + E);
                                                                                                        return 0;
                                                                                                }
                                                                                        }
@@ -81,7 +82,7 @@ circ.in_house_use.prototype = {
                                                                                }
                                                                        )
                                                                );
-                                                               g.error.sdump('D_TRACE','items = ' + js2JSON(items));
+                                                               g.error.sdump('D_TRACE', document.getElementById('circStrings').getString('staff.circ.in_house_use.items_dump') + js2JSON(items));
                                                                util.widgets.remove_children( e );
                                                                var ml = util.widgets.make_menulist(
                                                                        items
@@ -99,7 +100,7 @@ circ.in_house_use.prototype = {
                                                                                        tb.focus();
                                                                                } else {
                                                                                        tb.disabled = true;
-                                                                                       tb.value = 'Non-Cataloged';
+                                                                                       tb.value = document.getElementById('circStrings').getString('staff.circ.in_house_use.noncataloged');
                                                                                }
                                                                        }, false
                                                                );
@@ -144,7 +145,7 @@ circ.in_house_use.prototype = {
                                        ],
                                        'cmd_broken' : [
                                                ['command'],
-                                               function() { alert('Not Yet Implemented'); }
+                                               function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
                                        ],
                                        'cmd_in_house_use_submit_barcode' : [
                                                ['command'],
@@ -177,7 +178,7 @@ circ.in_house_use.prototype = {
                                                ['command'],
                                                function() {
                                                }
-                                       ],
+                                       ]
                                }
                        }
                );
@@ -195,12 +196,12 @@ circ.in_house_use.prototype = {
                        return true;
                } else {
                        if ( 1 == obj.error.yns_alert(
-                                               'Bad checkdigit; possible mis-scan.  Use this barcode ("' + bc + '") anyway?',
-                                               'Bad Barcode',
-                                               'Cancel',
-                                               'Accept Barcode',
+                                               document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
                                                null,
-                                               'Check here to confirm this action',
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
                                                '/xul/server/skin/media/images/bad_barcode.png'
                        ) ) {
                                return true;
@@ -237,7 +238,14 @@ circ.in_house_use.prototype = {
                        }
 
                        if (multiplier > 20) {
-                               var r = obj.error.yns_alert('Are you sure you want to mark ' + barcode + ' as having been used ' + multiplier + ' times?','In-House Use Verification', 'Yes', 'No', null, 'Check here to confirm this message.');
+                               var r = obj.error.yns_alert(
+                                       document.getElementById('circStrings').getFormattedString('staff.circ.in_house_use.confirm_multiple', [barcode, multiplier]),
+                                       document.getElementById('circStrings').getString('staff.circ.in_house_use.confirm_multiple.title'),
+                                       document.getElementById('circStrings').getString('staff.circ.in_house_use.yes'),
+                                       document.getElementById('circStrings').getString('staff.circ.in_house_use.no'),
+                                       null,
+                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                               );
                                if (r != 0) {
                                        obj.controller.view.in_house_use_multiplier_textbox.focus();
                                        obj.controller.view.in_house_use_multiplier_textbox.select();
@@ -251,15 +259,27 @@ circ.in_house_use.prototype = {
 
                                var copy = obj.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ barcode ]); 
                                if (copy.ilsevent) { 
-                                       switch(copy.ilsevent) {
-                                               case -1 : obj.error.standard_network_error_alert('In House Use Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface'); break;
-                                               case 1502 /* ASSET_COPY_NOT_FOUND */ : obj.error.yns_alert(copy.textcode,'In House Use Failed','Ok',null,null,'Check here to confirm this message'); break;
-                                               default: throw(copy);
+                                       switch(Number(copy.ilsevent)) {
+                                               case -1 : 
+                                                       obj.error.standard_network_error_alert(document.getElementById('circStrings').getString('staff.circ.in_house_use.failed.verbose'));
+                                                       break;
+                                               case 1502 /* ASSET_COPY_NOT_FOUND */ : 
+                                                       obj.error.yns_alert(
+                                                               copy.textcode,
+                                                               document.getElementById('circStrings').getString('staff.circ.in_house_use.failed'),
+                                                               document.getElementById('circStrings').getString('staff.circ.in_house_use.ok'),
+                                                               null,
+                                                               null,
+                                                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                                                       );
+                                                       break;
+                                               default:
+                                                       throw(copy);
                                        }
                                        return; 
                                }
        
-                               var mods = obj.network.simple_request('MODS_SLIM_RECORD_RETRIEVE_VIA_COPY',[ copy.id() ]);
+                               var mods = obj.network.simple_request('MODS_SLIM_RECORD_RETRIEVE.authoritative_VIA_COPY',[ copy.id() ]);
                                var result = obj.network.simple_request('FM_AIHU_CREATE',
                                        [ ses(), { 'copyid' : copy.id(), 'location' : obj.data.list.au[0].ws_ou(), 'count' : multiplier } ]
                                );
@@ -282,10 +302,10 @@ circ.in_house_use.prototype = {
                                                'my' : {
                                                        'mvr' : mods,
                                                        'acp' : copy,
-                                                       'uses' : result.length,
+                                                       'uses' : result.length
                                                }
                                        },
-                                       'to_top' : true,
+                                       'to_top' : true
                                //I could override map_row_to_column here
                                }
                        );
@@ -294,22 +314,22 @@ circ.in_house_use.prototype = {
                                obj.on_in_house_use(result);
                        }
                        if (typeof window.xulG == 'object' && typeof window.xulG.on_in_house_use == 'function') {
-                               obj.error.sdump('D_CIRC','circ.in_house_use: Calling external .on_in_house_use()\n');
+                               obj.error.sdump('D_CIRC', + document.getElementById('circStrings').getString('staff.circ.in_house_use.external') + '\n');
                                window.xulG.on_in_house_use(result);
                        } else {
-                               obj.error.sdump('D_CIRC','circ.in_house_use: No external .on_in_house_use()\n');
+                               obj.error.sdump('D_CIRC', + document.getElementById('circStrings').getString('staff.circ.in_house_use.no_external') + '\n');
                        }
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('In House Use Failed',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.in_house_use.failed'), E);
                        if (typeof obj.on_failure == 'function') {
                                obj.on_failure(E);
                        }
                        if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
-                               obj.error.sdump('D_CIRC','circ.in_house_use: Calling external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', + document.getElementById('circStrings').getString('staff.circ.in_house_use.on_failure.external') + '\n');
                                window.xulG.on_failure(E);
                        } else {
-                               obj.error.sdump('D_CIRC','circ.in_house_use: No external .on_failure()\n');
+                               obj.error.sdump('D_CIRC', + document.getElementById('circStrings').getString('staff.circ.in_house_use.on_failure.external') + '\n');
                        }
                }
 
index db11262..bee9bf3 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
 
@@ -12,7 +12,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -34,7 +34,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') {
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                );
        
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('In-House Use'); } catch(E) { alert(E); }
+                                       try {
+                                               window.xulG.set_tab_name(document.getElementById('circStrings').getString('staff.circ.in_house_use.tab_name'));
+                                       } catch(E) {
+                                               alert(E);
+                                       }
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" 
-                                       + 'circ.in_house_use.xul\n' + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ.in_house_use.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
@@ -63,6 +67,9 @@
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <commandset id="in_house_use_cmds">
                <command id="sel_clip" />
                <command id="cmd_in_house_use_submit_barcode" />
 <vbox id="cmvb1" flex="1">
 <hbox id="background" style="background-color: purple; color: white;">
        <spacer flex="1"/>
-       <label value="Record In-House Use" style="font-size: x-large; font-weight: bold;"/>
+       <label value="&staff.circ.in_house_use.main.label;" style="font-size: x-large; font-weight: bold;"/>
        <spacer flex="1"/>
 </hbox>
 <groupbox id="cmgb1" flex="2">
 
-       <caption label="In-House Use" />
+       <caption label="&staff.circ.in_house_use.cmgb1.caption;" />
 
        <hbox id="in_house_use_top_ui">
-               <label id="in_house_use_multiplier_label" value="# of uses:" control="in_house_use_multiplier_textbox" accesskey="u" hidden="false"/>
+               <label id="in_house_use_multiplier_label" value="&staff.circ.in_house_use.multiplier_label.value;" control="in_house_use_multiplier_textbox" accesskey="&staff.circ.in_house_use.multiplier_label.accesskey;" hidden="false"/>
                <textbox id="in_house_use_multiplier_textbox" value="1" hidden="false" size="2" cols="2"/>
                <hbox id="in_house_use_menu_placeholder" flex="0"/>
                <textbox id="in_house_use_barcode_entry_textbox"/>
                <button id="in_house_use_submit_barcode_button" 
-                       label="Submit"
+                       label="&staff.circ.in_house_use.submit.label;"
                        command="cmd_in_house_use_submit_barcode"
-                       accesskey="S"/>
+                       accesskey="&staff.circ.in_house_use.submit.accesskey;"/>
        </hbox>
 
        <tree id="in_house_use_list" flex="1" enableColumnDrag="true" />
 
        <hbox id="in_house_use_bottom_ui">
                <button id="in_house_use_print" 
-                       label="Print List
+                       label="&staff.circ.in_house_use.print.label;
                        command="cmd_in_house_use_print"
                        accesskey=""/>
                <button id="in_house_use_export" 
-                       label="Export"
+                       label="&staff.circ.in_house_use.export.label;"
                        command="cmd_in_house_use_export"
                        accesskey=""/>
-               <checkbox id="trim_list" label="Trim List (20 rows)" checked="true" persist="checked"/> 
-               <checkbox id="strict_barcode" label="Strict Barcode" checked="false" persist="checked"/> 
+               <checkbox id="trim_list" label="&staff.circ.in_house_use.trim_list.label;" checked="true" persist="checked"/> 
+               <checkbox id="strict_barcode" label="&staff.circ.in_house_use.strict_barcode.label;" checked="false" persist="checked"/> 
                <spacer id="pcii3s" flex="1"/>
-               <button id="clip_button" disabled="true" command="sel_clip" label="Copy to Clipboard" />
-               <button id="save_cols_btn" command="save_columns" label="Save Columns" />
+               <button id="clip_button" disabled="true" command="sel_clip" label="&staff.circ.in_house_use.sel_clip.label;" />
+               <button id="save_cols_btn" command="save_columns" label="&staff.circ.in_house_use.save_cols_btn.label;" />
        </hbox>
 
 </groupbox>
index 7adae41..907092a 100644 (file)
@@ -1,6 +1,9 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Patron Display -->
+<!--
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- STYLESHEETS -->
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- OVERLAYS -->
 <?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
 
-<window id="pre_cat_fields" title="Pre-Cat Fields"
+<window id="pre_cat_fields" title="&staff.circ.pre_cat.window.title;"
        orient="vertical" style="overflow: auto"
        onload="try{my_init();font_helper(); }catch(E){alert(E);}"
        onunload="try{my_finish();}catch(E){alert(E);}"
@@ -36,7 +39,9 @@
 
                function my_init() {
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                       if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                       if (typeof JSAN == 'undefined') {
+                               throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                       }
                        JSAN.errorLevel = "die"; // none, warn, or die
                        JSAN.addRepository('/xul/server/');
                        JSAN.use('util.error'); g.error = new util.error();
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
 
        <groupbox>
-               <caption label="Pre-Catalog Field Entry"/>
+               <caption label="&staff.circ.pre_cat.caption.label;"/>
                <grid>
                        <columns><column /><column flex="1"/></columns>
                        <rows>
                                <row>
-                                       <label value="Title" control="dummy_title"/>
+                                       <label value="&staff.circ.pre_cat.dummy_title.value;" control="dummy_title"/>
                                        <textbox id="dummy_title" onchange="g.data.dummy_title = event.target.value;"/>
                                </row>
                                <row>
-                                       <label value="Author" control="dummy_author"/>
+                                       <label value="&staff.circ.pre_cat.dummy_author.value;" control="dummy_author"/>
                                        <textbox id="dummy_author" onchange="g.data.dummy_author = event.target.value;"/>
                                </row>
                        </rows>
                </grid>
                <hbox>
                        <spacer flex="1"/>
-                       <button label="Cancel" oncommand="g.data.dummy_title = ''; window.close()" accesskey="C"/>
-                       <button label="Checkout" oncommand="window.close();" accesskey="o"/>
+                       <button label="&staff.circ.pre_cat.cancel.label;" oncommand="g.data.dummy_title = ''; window.close()" accesskey="&staff.circ.pre_cat.cancel.accesskey;"/>
+                       <button label="&staff.circ.pre_cat.checkout.label;" oncommand="window.close();" accesskey="&staff.circ.pre_cat.checkout.accesskey;"/>
                </hbox>
        </groupbox>
 
index 19bc1c8..340f870 100644 (file)
@@ -1,4 +1,5 @@
 dump('entering print_list_template_editor.js\n');
+// vim:noet:sw=4:ts=4:
 
 if (typeof circ == 'undefined') circ = {};
 circ.print_list_template_editor = function (params) {
@@ -37,22 +38,54 @@ circ.print_list_template_editor.prototype = {
                                        'change_given' : '0.00',
                                        'credit_given' : '0.00',
                                        'note' : "We refunded this because...",
-                                       'new_balance' : '16.36',
-                               },
+                                       'new_balance' : '16.36'
+                               }
                        }
 
                        this.test_list = {
                        
-                               'items' : [{"uses":"undefined","alert_message":"","author":"Annixter, Jane.","barcode":"3635300990263","call_number":"F","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:15-0400","circ_as_type":"","circ_id":"19907","circ_lib":"URRLS-SC","circ_modifier":"","circulate":"Yes","acp_id":"34","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"13","due_date":"2006-08-23","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"URRLS-SC","price":"10.00","pubdate":"1961","publisher":"Longmans","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000015 ","title":"Peace comes to Castle Oak ","xact_finish":""},{"uses":"undefined","alert_message":"","author":"Josephson, Matthew","barcode":"33207002163014","call_number":"NONFIC 330.922 JOSEPHSO","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:23-0400","circ_as_type":"","circ_id":"19908","circ_lib":"ARL-ATH","circ_modifier":"","circulate":"Yes","acp_id":"1658","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"250","due_date":"2006-09-06","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"ARL-ATH","price":"10.95","pubdate":"[c1934]","publisher":"Harcourt, Brace and company","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000311 ","title":"The  robber barons :  the great American capitalists, 1861-1901","xact_finish":""},{"uses":"undefined","alert_message":"","author":"Payne, Emmy","barcode":"33034001434539","call_number":"EJ PAYNE","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:36:54-0400","circ_as_type":"","circ_id":"19904","circ_lib":"SHRL-RM","circ_modifier":"","circulate":"Yes","acp_id":"6165596","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"1220497","due_date":"2006-09-06","edition":"Reinforced ed.","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"075872926X (BWI bdg.)","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"SHRL-RM","price":"0.00","pubdate":"1944","publisher":"Houghton Mifflin","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000377 ","title":"Katy no-pocket ","xact_finish":""},{"uses":"undefined","alert_message":"","author":"Ames, Leslie","barcode":"31039000791757","call_number":"AF AME","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:07-0400","circ_as_type":"","circ_id":"19906","circ_lib":"ORLS-TEL","circ_modifier":"","circulate":"Yes","acp_id":"28","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"8","due_date":"2006-09-06","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"ORLS-TEL","price":"5.95","pubdate":"","publisher":"Lenox Hill","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000009 ","title":"King's Castle ","xact_finish":""},{"uses":"undefined","alert_message":"","author":"Payne, Emmy","barcode":"33034001434539","call_number":"EJ PAYNE","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:36:54-0400","circ_as_type":"","circ_id":"19903","circ_lib":"SHRL-RM","circ_modifier":"","circulate":"Yes","acp_id":"6165596","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"1220497","due_date":"2006-09-06","edition":"Reinforced ed.","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"075872926X (BWI bdg.)","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"SHRL-RM","price":"0.00","pubdate":"1944","publisher":"Houghton Mifflin","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000377 ","title":"Katy no-pocket ","xact_finish":""}],
-                               'holds' : [{"author":"Wells, H. G. ","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:14:53-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:14:53-0400","current_copy":"33207003884402","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"57","holdable_formats":"","isbn":"0192828266 :","notify_time":"","notify_count":"0","patron_name":"23500000023053 Stompro, Josh","phone_notify":"218-233-3757","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-02T16:15:11-0400","pubdate":"1995","publisher":"Oxford University Press","request_time":"2006-05-20","request_timestamp":"2006-05-20","requestor":"1000000","selection_depth":"0","status":"Ready for pickup","tcn":"PIN03002240 ","target":"131469","title":"The  war of the worlds","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1000567"},{"author":"Kramer, Kathryn.","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:32:58-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:32:58-0400","current_copy":"33207004030757","edition":"1st ed.","email_notify":"No","expire_time":"","fulfillment_time":"","id":"470","holdable_formats":"","isbn":"0375400834","notify_time":"2006-08-24T15:12:30-0400","notify_count":"1","patron_name":"21034000217210 Jenkins, George","phone_notify":"229-985-3464","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-03T12:15:03-0400","pubdate":"1998","publisher":"Knopf","request_time":"2006-07-28","request_timestamp":"2006-07-28","requestor":"3","selection_depth":"0","status":"Ready for pickup","tcn":"PIN03053147 ","target":"313678","title":"Sweet water ","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1001151"},{"author":"Silva, Daniel","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:39:35-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:39:35-0400","current_copy":"33207004323517","edition":"1st ed.","email_notify":"No","expire_time":"","fulfillment_time":"","id":"448","holdable_formats":"","isbn":"0375500898 (alk. paper)","notify_time":"","notify_count":"0","patron_name":"21099000002755 Broome, Sandra","phone_notify":"706-236-4632","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-02T17:16:39-0400","pubdate":"c1999","publisher":"Random House","request_time":"2006-07-27","request_timestamp":"2006-07-27","requestor":"1000001","selection_depth":"0","status":"Ready for pickup","tcn":"ocm40444117 ","target":"77772","title":"The  marching season :  a novel","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1000846"},{"author":"Seuss","available_time":"2006-08-13","available_timestamp":"2006-08-13T20:55:02-0400","capture_time":"2006-08-13","capture_timestamp":"2006-08-13T20:55:02-0400","current_copy":"20070805","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"1697","holdable_formats":"","isbn":"039480001X :","notify_time":"","notify_count":"0","patron_name":"4545 Tripper, Jack","phone_notify":"444-333-2222","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-13T20:45:09-0400","pubdate":"1992, c1957","publisher":"Seedlings Braille Books for Children","request_time":"2006-08-13","request_timestamp":"2006-08-13","requestor":"1000000","selection_depth":"0","status":"Ready for pickup","tcn":"ocm47673093 ","target":"1534993","title":"The  cat in the hat","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1002261"},{"author":"Potter, Sally.","available_time":"2006-08-09","available_timestamp":"2006-08-09T18:06:10-0400","capture_time":"2006-08-09","capture_timestamp":"2006-08-09T18:06:10-0400","current_copy":"31001000843129","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"1004","holdable_formats":"","isbn":"0783262663","notify_time":"2006-08-10T15:24:46-0400","notify_count":"12","patron_name":"2222233333 Erickson, Bill","phone_notify":"999-999-9999","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-09T12:15:27-0400","pubdate":"c2001","publisher":"Universal Studios","request_time":"2006-08-08","request_timestamp":"2006-08-08","requestor":"3","selection_depth":"0","status":"Ready for pickup","tcn":"ocm48683123 ","target":"1572303","title":"The  man who cried","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"3"}],
-                               'bills' : [{"balance_owed":"-5.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"9","last_billing_ts":"2006-05-08 18:53","last_billing_note":"test","last_billing_type":"Miscellaneous charges","last_payment_ts":"2006-05-08 18:53","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"5.00","xact_type":"grocery","usr":"Id = 1000502"},{"balance_owed":"-5.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"11","last_billing_ts":"2006-05-08 19:11","last_billing_note":"test","last_billing_type":"Miscellaneous","last_payment_ts":"2006-05-08 19:12","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"5.00","xact_type":"grocery","usr":"Id = 1000502"},{"balance_owed":"-50.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"18","last_billing_ts":"2006-05-08 20:20","last_billing_note":"","last_billing_type":"Miscellaneous","last_payment_ts":"2006-05-08 21:27","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"50.00","xact_type":"grocery","usr":"Id = 1000502"},{"balance_owed":"1.00","xact_finish":"2006-06-14","xact_start":"2006-06-14","id":"451","last_billing_ts":"2006-06-14 16:49","last_billing_note":"SYSTEM GENERATED","last_billing_type":"Lost Materials","last_payment_ts":"2006-06-14 16:49","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"6.00","total_paid":"5.00","xact_type":"circulation","usr":"Id = 1000502"},{"balance_owed":"-1.00","xact_finish":"2006-06-17","xact_start":"2006-06-17","id":"3689","last_billing_ts":"2006-06-17 04:01","last_billing_note":"","last_billing_type":"Miscellaneous","last_payment_ts":"2006-06-17 18:51","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"10.00","total_paid":"11.00","xact_type":"grocery","usr":"Id = 1000502"},{"balance_owed":".66","xact_finish":"","xact_start":"2006-06-27","id":"5589","last_billing_ts":"2006-08-22 00:00","last_billing_note":"Overdue Fine","last_billing_type":"Overdue materials","last_payment_ts":"2006-09-04 17:31","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"5.60","total_paid":"4.94","xact_type":"circulation","usr":"Id = 1000502"},{"balance_owed":".70","xact_finish":"","xact_start":"2006-06-27","id":"5593","last_billing_ts":"2006-08-22 00:00","last_billing_note":"Overdue Fine","last_billing_type":"Overdue materials","last_payment_ts":"2006-08-16 11:01","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"5.50","total_paid":"4.80","xact_type":"circulation","usr":"Id = 1000502"},{"balance_owed":"5.00","xact_finish":"","xact_start":"2006-08-16","id":"14834","last_billing_ts":"2006-08-16 12:25","last_billing_note":"","last_billing_type":"Damaged material","last_payment_ts":"","last_payment_note":"","last_payment_type":"","total_owed":"5.00","total_paid":"0.00","xact_type":"grocery","usr":"Id = 1000502"},{"balance_owed":"10.00","xact_finish":"","xact_start":"2006-08-16","id":"14858","last_billing_ts":"2006-08-16 12:34","last_billing_note":"","last_billing_type":"Damaged material","last_payment_ts":"","last_payment_note":"","last_payment_type":"","total_owed":"10.00","total_paid":"0.00","xact_type":"grocery","usr":"Id = 1000502"}],
+                               'items' : [
+                               {"uses":"undefined","alert_message":"","author":"Annixter, Jane.","barcode":"3635300990263","call_number":"F","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:15-0400","circ_as_type":"","circ_id":"19907","circ_lib":"URRLS-SC","circ_modifier":"","circulate":"Yes","acp_id":"34","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"13","due_date":"2006-08-23","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"URRLS-SC","price":"10.00","pubdate":"1961","publisher":"Longmans","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000015 ","title":"Peace comes to Castle Oak ","xact_finish":""},
+                               {"uses":"undefined","alert_message":"","author":"Josephson, Matthew","barcode":"33207002163014","call_number":"NONFIC 330.922 JOSEPHSO","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:23-0400","circ_as_type":"","circ_id":"19908","circ_lib":"ARL-ATH","circ_modifier":"","circulate":"Yes","acp_id":"1658","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"250","due_date":"2006-09-06","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"ARL-ATH","price":"10.95","pubdate":"[c1934]","publisher":"Harcourt, Brace and company","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000311 ","title":"The  robber barons :  the great American capitalists, 1861-1901","xact_finish":""},
+                               {"uses":"undefined","alert_message":"","author":"Payne, Emmy","barcode":"33034001434539","call_number":"EJ PAYNE","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:36:54-0400","circ_as_type":"","circ_id":"19904","circ_lib":"SHRL-RM","circ_modifier":"","circulate":"Yes","acp_id":"6165596","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"1220497","due_date":"2006-09-06","edition":"Reinforced ed.","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"075872926X (BWI bdg.)","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"SHRL-RM","price":"0.00","pubdate":"1944","publisher":"Houghton Mifflin","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000377 ","title":"Katy no-pocket ","xact_finish":""},
+                               {"uses":"undefined","alert_message":"","author":"Ames, Leslie","barcode":"31039000791757","call_number":"AF AME","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:37:07-0400","circ_as_type":"","circ_id":"19906","circ_lib":"ORLS-TEL","circ_modifier":"","circulate":"Yes","acp_id":"28","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"8","due_date":"2006-09-06","edition":"","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"ORLS-TEL","price":"5.95","pubdate":"","publisher":"Lenox Hill","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000009 ","title":"King's Castle ","xact_finish":""},
+                               {"uses":"undefined","alert_message":"","author":"Payne, Emmy","barcode":"33034001434539","call_number":"EJ PAYNE","checkin_time":"   ","checkin_time_full":"","xact_start":"2006-08-23","xact_start_full":"2006-08-23T14:36:54-0400","circ_as_type":"","circ_id":"19903","circ_lib":"SHRL-RM","circ_modifier":"","circulate":"Yes","acp_id":"6165596","copy_number":"1","create_date":"2006-04-28","edit_date":"2006-08-23","deleted":"No","deposit_amount":"0.00","deposit":"No","mvr_doc_id":"1220497","due_date":"2006-09-06","edition":"Reinforced ed.","fine_level":"Low","stop_fines":"","stop_fines_time":"","holdable":"Yes","isbn":"075872926X (BWI bdg.)","loan_duration":"Short","location":"Adult","message":"   ","opac_visible":"Yes","owning_lib":"SHRL-RM","price":"0.00","pubdate":"1944","publisher":"Houghton Mifflin","ref":"No","renewal_remaining":"0","route_to":"   ","status":"Checked out","tcn":"PIN01000377 ","title":"Katy no-pocket ","xact_finish":""}],
+                               'holds' : [{"author":"Wells, H. G. ","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:14:53-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:14:53-0400","current_copy":"33207003884402","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"57","holdable_formats":"","isbn":"0192828266 :","notify_time":"","notify_count":"0","patron_name":"23500000023053 Stompro, Josh","phone_notify":"218-233-3757","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-02T16:15:11-0400","pubdate":"1995","publisher":"Oxford University Press","request_time":"2006-05-20","request_timestamp":"2006-05-20","requestor":"1000000","selection_depth":"0","status":"Ready for pickup","tcn":"PIN03002240 ","target":"131469","title":"The  war of the worlds","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1000567"},
+                               {"author":"Kramer, Kathryn.","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:32:58-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:32:58-0400","current_copy":"33207004030757","edition":"1st ed.","email_notify":"No","expire_time":"","fulfillment_time":"","id":"470","holdable_formats":"","isbn":"0375400834","notify_time":"2006-08-24T15:12:30-0400","notify_count":"1","patron_name":"21034000217210 Jenkins, George","phone_notify":"229-985-3464","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-03T12:15:03-0400","pubdate":"1998","publisher":"Knopf","request_time":"2006-07-28","request_timestamp":"2006-07-28","requestor":"3","selection_depth":"0","status":"Ready for pickup","tcn":"PIN03053147 ","target":"313678","title":"Sweet water ","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1001151"},
+                               {"author":"Silva, Daniel","available_time":"2006-08-03","available_timestamp":"2006-08-03T15:39:35-0400","capture_time":"2006-08-03","capture_timestamp":"2006-08-03T15:39:35-0400","current_copy":"33207004323517","edition":"1st ed.","email_notify":"No","expire_time":"","fulfillment_time":"","id":"448","holdable_formats":"","isbn":"0375500898 (alk. paper)","notify_time":"","notify_count":"0","patron_name":"21099000002755 Broome, Sandra","phone_notify":"706-236-4632","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-02T17:16:39-0400","pubdate":"c1999","publisher":"Random House","request_time":"2006-07-27","request_timestamp":"2006-07-27","requestor":"1000001","selection_depth":"0","status":"Ready for pickup","tcn":"ocm40444117 ","target":"77772","title":"The  marching season :  a novel","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1000846"},
+                               {"author":"Seuss","available_time":"2006-08-13","available_timestamp":"2006-08-13T20:55:02-0400","capture_time":"2006-08-13","capture_timestamp":"2006-08-13T20:55:02-0400","current_copy":"20070805","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"1697","holdable_formats":"","isbn":"039480001X :","notify_time":"","notify_count":"0","patron_name":"4545 Tripper, Jack","phone_notify":"444-333-2222","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-13T20:45:09-0400","pubdate":"1992, c1957","publisher":"Seedlings Braille Books for Children","request_time":"2006-08-13","request_timestamp":"2006-08-13","requestor":"1000000","selection_depth":"0","status":"Ready for pickup","tcn":"ocm47673093 ","target":"1534993","title":"The  cat in the hat","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"1002261"},
+                               {"author":"Potter, Sally.","available_time":"2006-08-09","available_timestamp":"2006-08-09T18:06:10-0400","capture_time":"2006-08-09","capture_timestamp":"2006-08-09T18:06:10-0400","current_copy":"31001000843129","edition":"","email_notify":"No","expire_time":"","fulfillment_time":"","id":"1004","holdable_formats":"","isbn":"0783262663","notify_time":"2006-08-10T15:24:46-0400","notify_count":"12","patron_name":"2222233333 Erickson, Bill","phone_notify":"999-999-9999","pickup_lib_shortname":"ARL-ATH","pickup_lib":"Athens-Clarke County Library","prev_check_time":"2006-08-09T12:15:27-0400","pubdate":"c2001","publisher":"Universal Studios","request_time":"2006-08-08","request_timestamp":"2006-08-08","requestor":"3","selection_depth":"0","status":"Ready for pickup","tcn":"ocm48683123 ","target":"1572303","title":"The  man who cried","transit_dest_recv_time":"","transit_dest_lib":"","transit_source":"","transit_source_send_time":"","hold_type":"T","usr":"3"}],
+                               'bills' : [{"balance_owed":"-5.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"9","last_billing_ts":"2006-05-08 18:53","last_billing_note":"test","last_billing_type":"Miscellaneous charges","last_payment_ts":"2006-05-08 18:53","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"5.00","xact_type":"grocery","usr":"Id = 1000502"},
+                               {"balance_owed":"-5.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"11","last_billing_ts":"2006-05-08 19:11","last_billing_note":"test","last_billing_type":"Miscellaneous","last_payment_ts":"2006-05-08 19:12","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"5.00","xact_type":"grocery","usr":"Id = 1000502"},
+                               {"balance_owed":"-50.00","xact_finish":"2006-05-08","xact_start":"2006-05-08","id":"18","last_billing_ts":"2006-05-08 20:20","last_billing_note":"","last_billing_type":"Miscellaneous","last_payment_ts":"2006-05-08 21:27","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"0.00","total_paid":"50.00","xact_type":"grocery","usr":"Id = 1000502"},
+                               {"balance_owed":"1.00","xact_finish":"2006-06-14","xact_start":"2006-06-14","id":"451","last_billing_ts":"2006-06-14 16:49","last_billing_note":"SYSTEM GENERATED","last_billing_type":"Lost Materials","last_payment_ts":"2006-06-14 16:49","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"6.00","total_paid":"5.00","xact_type":"circulation","usr":"Id = 1000502"},
+                               {"balance_owed":"-1.00","xact_finish":"2006-06-17","xact_start":"2006-06-17","id":"3689","last_billing_ts":"2006-06-17 04:01","last_billing_note":"","last_billing_type":"Miscellaneous","last_payment_ts":"2006-06-17 18:51","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"10.00","total_paid":"11.00","xact_type":"grocery","usr":"Id = 1000502"},
+                               {"balance_owed":".66","xact_finish":"","xact_start":"2006-06-27","id":"5589","last_billing_ts":"2006-08-22 00:00","last_billing_note":"Overdue Fine","last_billing_type":"Overdue materials","last_payment_ts":"2006-09-04 17:31","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"5.60","total_paid":"4.94","xact_type":"circulation","usr":"Id = 1000502"},
+                               {"balance_owed":".70","xact_finish":"","xact_start":"2006-06-27","id":"5593","last_billing_ts":"2006-08-22 00:00","last_billing_note":"Overdue Fine","last_billing_type":"Overdue materials","last_payment_ts":"2006-08-16 11:01","last_payment_note":"","last_payment_type":"cash_payment","total_owed":"5.50","total_paid":"4.80","xact_type":"circulation","usr":"Id = 1000502"},
+                               {"balance_owed":"5.00","xact_finish":"","xact_start":"2006-08-16","id":"14834","last_billing_ts":"2006-08-16 12:25","last_billing_note":"","last_billing_type":"Damaged material","last_payment_ts":"","last_payment_note":"","last_payment_type":"","total_owed":"5.00","total_paid":"0.00","xact_type":"grocery","usr":"Id = 1000502"},
+                               {"balance_owed":"10.00","xact_finish":"","xact_start":"2006-08-16","id":"14858","last_billing_ts":"2006-08-16 12:34","last_billing_note":"","last_billing_type":"Damaged material","last_payment_ts":"","last_payment_note":"","last_payment_type":"","total_owed":"10.00","total_paid":"0.00","xact_type":"grocery","usr":"Id = 1000502"}],
                                'payment' : [{"bill_id":5559,"payment":"-0.04","last_billing_type":"Overdue materials","last_billing_note":"Overdue Fine","title":"Hali Bote Azikaban de tao fan","barcode":"a16"},{"bill_id":5589,"payment":"0.04","last_billing_type":"Overdue materials","last_billing_note":"Overdue Fine","title":"Hali Bote Azikaban de tao fan","barcode":"a47"}],
                                'patrons' : [],
-                               'transits' : [{"transit_item_author":"Arvetis, Chris.","transit_item_barcode":"3947801748348","transit_item_callnumber":"JE ARV","transit_item_title":"Why do birds sing?","transit_target_copy":"2385751","transit_dest_lib":"PIED-WIN","transit_id":"25","transit_source":"ARL-ATH","transit_source_send_time":"2006-05-24T16:37:09-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Pine, Tillie S.","transit_item_barcode":"3635300990762","transit_item_callnumber":"F","transit_item_title":"Water all around ","transit_target_copy":"1","transit_dest_lib":"URRLS-SC","transit_id":"26","transit_source":"ARL-ATH","transit_source_send_time":"2006-05-27T22:49:40-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"","transit_item_barcode":"31057000861941","transit_item_callnumber":"CD J 781.5246 CASPE","transit_item_title":"Casper's spookiest songs and sounds  10 spooky songs plus creepy sound effects","transit_target_copy":"7923932","transit_dest_lib":"WGRL-LS","transit_id":"98","transit_source":"ARL-ATH","transit_source_send_time":"2006-06-29T16:34:38-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Davidson, MaryJanice.","transit_item_barcode":"31027005649112","transit_item_callnumber":"AC DAV","transit_item_title":"Undead and unreturnable ","transit_target_copy":"7924995","transit_dest_lib":"HCLS-LG","transit_id":"100","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-07T16:02:32-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Evanovich, Janet.","transit_item_barcode":"31001001097295","transit_item_callnumber":"813/.54","transit_item_title":"Two for the dough","transit_target_copy":"8000335","transit_dest_lib":"ARL-BOG","transit_id":"102","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-11T12:12:11-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Edwards, Anne","transit_item_barcode":"39021423853564","transit_item_callnumber":"780.92 STREISAND","transit_item_title":"Streisand a biography","transit_target_copy":"949781","transit_dest_lib":"ECGR-BKM","transit_id":"110","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-14T10:00:01-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Riese, Randall.","transit_item_barcode":"31025900460205","transit_item_callnumber":"921 STREISAND 1993","transit_item_title":"Her name is Barbra an intimate portrait of the real Barbra Streisand","transit_target_copy":"2210566","transit_dest_lib":"HALL-BPL","transit_id":"112","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-14T10:01:39-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Rowling, J. K.","transit_item_barcode":"a45","transit_item_callnumber":"JROWLING2","transit_item_title":"Hali Bote Azikaban de tao fan","transit_target_copy":"8000297","transit_dest_lib":"WGRL-LS","transit_id":"118","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-19T13:52:38-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Some Author","transit_item_barcode":"321","transit_item_callnumber":"UNCATALOGED","transit_item_title":"Big Book","transit_target_copy":"8000387","transit_dest_lib":"ROCK-NG","transit_id":"119","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-19T13:58:21-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Thomas, Joyce Carol.","transit_item_barcode":"31036000522216","transit_item_callnumber":"E THOMAS","transit_item_title":"The  gospel Cinderella","transit_target_copy":"7422951","transit_dest_lib":"NCLS-COVTN","transit_id":"200","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:20:00-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Robinson, Barbara","transit_item_barcode":"31036000545159","transit_item_callnumber":"J ROBINSON","transit_item_title":"The  best Halloween ever","transit_target_copy":"7487432","transit_dest_lib":"NCLS-COVTN","transit_id":"206","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:44-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Robinson, Barbara","transit_item_barcode":"31036000545142","transit_item_callnumber":"J ROBINSON","transit_item_title":"The  best Halloween ever","transit_target_copy":"7487431","transit_dest_lib":"NCLS-COVTN","transit_id":"207","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:49-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Grafton, Sue.","transit_item_barcode":"31036000527900","transit_item_callnumber":"F GRAFTON","transit_item_title":"\"H\" is for homicide","transit_target_copy":"7273824","transit_dest_lib":"NCLS-COVTN","transit_id":"208","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:58-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Beaumont, Karen.","transit_item_barcode":"31036000521853","transit_item_callnumber":"E BEAUMONT","transit_item_title":"I like myself!","transit_target_copy":"7387328","transit_dest_lib":"NCLS-COVTN","transit_id":"211","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:26:08-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Sandler, Martin W.","transit_item_barcode":"31036000522612","transit_item_callnumber":"J 388.42 SANDLER","transit_item_title":"Straphanging in the USA trolleys and subways in American life","transit_target_copy":"7360328","transit_dest_lib":"NCLS-COVTN","transit_id":"212","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:35:17-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},{"transit_item_author":"Bohjalian, Christopher A.","transit_item_barcode":"31036000538303","transit_item_callnumber":"F BOHJALIAN","transit_item_title":"Before you know kindness :  a novel","transit_target_copy":"7544549","transit_dest_lib":"NCLS-COVTN","transit_id":"218","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-26T10:23:20-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},],
+                               'transits' : [{"transit_item_author":"Arvetis, Chris.","transit_item_barcode":"3947801748348","transit_item_callnumber":"JE ARV","transit_item_title":"Why do birds sing?","transit_target_copy":"2385751","transit_dest_lib":"PIED-WIN","transit_id":"25","transit_source":"ARL-ATH","transit_source_send_time":"2006-05-24T16:37:09-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Pine, Tillie S.","transit_item_barcode":"3635300990762","transit_item_callnumber":"F","transit_item_title":"Water all around ","transit_target_copy":"1","transit_dest_lib":"URRLS-SC","transit_id":"26","transit_source":"ARL-ATH","transit_source_send_time":"2006-05-27T22:49:40-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"","transit_item_barcode":"31057000861941","transit_item_callnumber":"CD J 781.5246 CASPE","transit_item_title":"Casper's spookiest songs and sounds  10 spooky songs plus creepy sound effects","transit_target_copy":"7923932","transit_dest_lib":"WGRL-LS","transit_id":"98","transit_source":"ARL-ATH","transit_source_send_time":"2006-06-29T16:34:38-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Davidson, MaryJanice.","transit_item_barcode":"31027005649112","transit_item_callnumber":"AC DAV","transit_item_title":"Undead and unreturnable ","transit_target_copy":"7924995","transit_dest_lib":"HCLS-LG","transit_id":"100","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-07T16:02:32-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Evanovich, Janet.","transit_item_barcode":"31001001097295","transit_item_callnumber":"813/.54","transit_item_title":"Two for the dough","transit_target_copy":"8000335","transit_dest_lib":"ARL-BOG","transit_id":"102","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-11T12:12:11-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Edwards, Anne","transit_item_barcode":"39021423853564","transit_item_callnumber":"780.92 STREISAND","transit_item_title":"Streisand a biography","transit_target_copy":"949781","transit_dest_lib":"ECGR-BKM","transit_id":"110","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-14T10:00:01-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Riese, Randall.","transit_item_barcode":"31025900460205","transit_item_callnumber":"921 STREISAND 1993","transit_item_title":"Her name is Barbra an intimate portrait of the real Barbra Streisand","transit_target_copy":"2210566","transit_dest_lib":"HALL-BPL","transit_id":"112","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-14T10:01:39-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Rowling, J. K.","transit_item_barcode":"a45","transit_item_callnumber":"JROWLING2","transit_item_title":"Hali Bote Azikaban de tao fan","transit_target_copy":"8000297","transit_dest_lib":"WGRL-LS","transit_id":"118","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-19T13:52:38-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Some Author","transit_item_barcode":"321","transit_item_callnumber":"UNCATALOGED","transit_item_title":"Big Book","transit_target_copy":"8000387","transit_dest_lib":"ROCK-NG","transit_id":"119","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-19T13:58:21-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Thomas, Joyce Carol.","transit_item_barcode":"31036000522216","transit_item_callnumber":"E THOMAS","transit_item_title":"The  gospel Cinderella","transit_target_copy":"7422951","transit_dest_lib":"NCLS-COVTN","transit_id":"200","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:20:00-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Robinson, Barbara","transit_item_barcode":"31036000545159","transit_item_callnumber":"J ROBINSON","transit_item_title":"The  best Halloween ever","transit_target_copy":"7487432","transit_dest_lib":"NCLS-COVTN","transit_id":"206","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:44-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Robinson, Barbara","transit_item_barcode":"31036000545142","transit_item_callnumber":"J ROBINSON","transit_item_title":"The  best Halloween ever","transit_target_copy":"7487431","transit_dest_lib":"NCLS-COVTN","transit_id":"207","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:49-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Grafton, Sue.","transit_item_barcode":"31036000527900","transit_item_callnumber":"F GRAFTON","transit_item_title":"\"H\" is for homicide","transit_target_copy":"7273824","transit_dest_lib":"NCLS-COVTN","transit_id":"208","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:25:58-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Beaumont, Karen.","transit_item_barcode":"31036000521853","transit_item_callnumber":"E BEAUMONT","transit_item_title":"I like myself!","transit_target_copy":"7387328","transit_dest_lib":"NCLS-COVTN","transit_id":"211","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:26:08-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Sandler, Martin W.","transit_item_barcode":"31036000522612","transit_item_callnumber":"J 388.42 SANDLER","transit_item_title":"Straphanging in the USA trolleys and subways in American life","transit_target_copy":"7360328","transit_dest_lib":"NCLS-COVTN","transit_id":"212","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-25T15:35:17-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},
+                               {"transit_item_author":"Bohjalian, Christopher A.","transit_item_barcode":"31036000538303","transit_item_callnumber":"F BOHJALIAN","transit_item_title":"Before you know kindness :  a novel","transit_target_copy":"7544549","transit_dest_lib":"NCLS-COVTN","transit_id":"218","transit_source":"ARL-ATH","transit_source_send_time":"2006-07-26T10:23:20-0400","capture_time":"   ","capture_timestamp":"   ","expire_time":"   ","patron_name":"undefined undefined, undefined","request_time":"   ","request_timestamp":"   ","hold_type":"   "},],
                                'offline_checkout' : [],
                                'offline_checkin' : [],
                                'offline_renew' : [],
-                               'offline_inhouse_use' : [],
+                               'offline_inhouse_use' : []
                        }
 
                        obj.controller_init();
@@ -128,7 +161,7 @@ circ.print_list_template_editor.prototype = {
                                                                try {
                                                                        JSAN.use('util.functional');
                                                                        var template_type = obj.controller.view.template_type_menu.value;
-                                                                       var macros;
+                                                                       var macros = [];
                                                                        switch(template_type) {
                                                                                case 'items':
                                                                                        JSAN.use('circ.util');
@@ -148,6 +181,51 @@ circ.print_list_template_editor.prototype = {
                                                                                                }
                                                                                        );
                                                                                break;
+                                                                               case 'transits':
+                                                                                       JSAN.use('circ.util');
+                                                                                       macros = util.functional.map_list(
+                                                                                               circ.util.transit_columns( {} ),
+                                                                                               function(o) {
+                                                                                                       return '%' + o.id + '%';
+                                                                                               }
+                                                                                       );
+                                                                               break;
+                                                                               case 'offline_checkout':
+                                                                                       JSAN.use('circ.util');
+                                                                                       macros = util.functional.map_list(
+                                                                                               circ.util.offline_checkout_columns( {} ),
+                                                                                               function(o) {
+                                                                                                       return '%' + o.id + '%';
+                                                                                               }
+                                                                                       );
+                                                                               break;
+                                                                               case 'offline_checkin':
+                                                                                       JSAN.use('circ.util');
+                                                                                       macros = util.functional.map_list(
+                                                                                               circ.util.offline_checkin_columns( {} ),
+                                                                                               function(o) {
+                                                                                                       return '%' + o.id + '%';
+                                                                                               }
+                                                                                       );
+                                                                               break;
+                                                                               case 'offline_renew':
+                                                                                       JSAN.use('circ.util');
+                                                                                       macros = util.functional.map_list(
+                                                                                               circ.util.offline_renew_columns( {} ),
+                                                                                               function(o) {
+                                                                                                       return '%' + o.id + '%';
+                                                                                               }
+                                                                                       );
+                                                                               break;
+                                        case 'offline_inhouse_use':
+                                                                                       JSAN.use('circ.util');
+                                                                                       macros = util.functional.map_list(
+                                                                                               circ.util.offline_inhouse_use_columns( {} ),
+                                                                                               function(o) {
+                                                                                                       return '%' + o.id + '%';
+                                                                                               }
+                                                                                       );
+                                                                               break;
                                                                                case 'bills':
                                                                                        JSAN.use('patron.util');
                                                                                        macros = util.functional.map_list(
@@ -176,15 +254,24 @@ circ.print_list_template_editor.prototype = {
                                                                        win.open('data:text/html,'
                                                                                + window.escape(
                                                                                        '<html style="width: 600; height: 400;">'
-                                                                                       + '<head><title>Template Macros</title></head>'
+                                                                                       + '<head><title>' 
+                                                                                       + document.getElementById('circStrings').getString('staff.circ.print_list_template.window.title')
+                                                                                       + '</title></head>'
                                                                                        + '<body onload="document.getElementById(\'btn\').focus()">'
-                                                                                       + '<h1>General:</h1>'
-                                                                                       + '<p>%PINES_CODE%, %TODAY%, %STAFF_FIRSTNAME%, %STAFF_LASTNAME%, '
+                                                                                       + '<h1>' 
+                                                                                       + document.getElementById('circStrings').getString('staff.circ.print_list_template.window.heading')
+                                                                                       + '</h1>'
+                                                                                       + '<p>%SHORTNAME%, %TODAY%, %STAFF_FIRSTNAME%, %STAFF_LASTNAME%, '
                                                                                        + '%PATRON_FIRSTNAME%, %LIBRARY%</p>'
-                                                                                       + '<h1>For type: '
-                                                                                       + template_type + '</h1>'
-                                                                                       + '<p>' + macro_string + '</p>'
-                                                                                       + '<button id="btn" onclick="window.close()">Close Window</button>'
+                                                                                       + '<h1>'
+                                                                                       + document.getElementById('circStrings').getFormattedString('staff.circ.print_list_template.window.template_type', [template_type])
+                                                                                       + '</h1>'
+                                                                                       + '<p>' 
+                                                                                       + macro_string 
+                                                                                       + '</p>'
+                                                                                       + '<button id="btn" onclick="window.close()">'
+                                                                                       + document.getElementById('circStrings').getString('staff.circ.print_list_template.window.close')
+                                                                                       + '</button>'
                                                                                        + '</body></html>'
                                                                                ), 'title', 'chrome,resizable');
                                                                } catch(E) {
@@ -242,7 +329,7 @@ circ.print_list_template_editor.prototype = {
                                                                        obj.controller.view.template_type_menu = ml;
                                                                }
                                                        }
-                                               ],
+                                               ]
 
                                        }
                                }
@@ -269,13 +356,13 @@ circ.print_list_template_editor.prototype = {
                                'type' : this.controller.view.template_type_menu.value,
                                'list' : list,
                                'data' : data,
-                               'sample_frame' : this.controller.view.sample,
+                               'sample_frame' : this.controller.view.sample
                        };
                        JSAN.use('util.print'); var print = new util.print();
                        print.tree_list( params );
                } catch(E) {
-                       this.error.sdump('D_ERROR','preview: ' + E);
-                       alert('preview: ' + E);
+                       this.error.sdump('D_ERROR', document.getElementById('circStrings').getString('staff.circ.print_list_template.preview') + ' ' + E);
+                       alert(document.getElementById('circStrings').getString('staff.circ.print_list_template.preview') + ' ' + E);
                }
        },
 
@@ -289,7 +376,7 @@ circ.print_list_template_editor.prototype = {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                JSAN.use('util.file'); var file = new util.file('print_list_templates');
                file.set_object(obj.data.print_list_templates); file.close();
-               alert('Template Saved\n' + js2JSON(obj.data.print_list_templates[name]));
+               alert(document.getElementById('circStrings').getString('staff.circ.print_list_template.save') + '\n' + js2JSON(obj.data.print_list_templates[name]));
        },
 
        'export_templates' : function() {
@@ -297,10 +384,10 @@ circ.print_list_template_editor.prototype = {
                        var obj = this;
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                        JSAN.use('util.file'); var f = new util.file('');
-            f.export_file( { 'title' : 'Save Templates File As', 'data' : obj.data.print_list_templates } );
+            f.export_file( { 'title' : document.getElementById('circStrings').getString('staff.circ.print_list_template.save_as'), 'data' : obj.data.print_list_templates } );
 
                } catch(E) {
-                       this.error.standard_unexpected_error_alert('Error exporting templates',E);
+                       this.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.print_list_template.export.error'),E);
                }
        },
 
@@ -309,8 +396,8 @@ circ.print_list_template_editor.prototype = {
                        var obj = this;
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                        JSAN.use('util.file'); var f = new util.file('');
-            var temp = f.import_file( { 'title' : 'Import Templates File' } );
-            if (!temp) return;
+            var temp = f.import_file( { 'title' : document.getElementById('circStrings').getString('staff.circ.print_list_template.import') } );
+            if (!temp) { return; }
             var s = '';
             function set_t(k,v) {
                 obj.data.print_list_templates[k] = v;
@@ -318,17 +405,17 @@ circ.print_list_template_editor.prototype = {
             }
             for (var i in temp) { set_t(i,temp[i]); }
             obj.data.stash('print_list_templates');
-            alert('Imported these templates: ' + s);
+            alert(document.getElementById('circStrings').getFormattedString('staff.circ.print_list_template.import_results', [s]));
             if (xulG) { 
                 xulG.set_tab(xulG.url_prefix(urls.XUL_PRINT_LIST_TEMPLATE_EDITOR), {}, {});
             } else {
-                alert('Please reload this interface.');
+                alert(document.getElementById('circStrings').getString('staff.circ.print_list_template.reload'));
             }
        
                } catch(E) {
-                       this.error.standard_unexpected_error_alert('Error importing templates',E);
+                       this.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.print_list_template.import.error'),E);
                }
-       },
+       }
 
 }
 
index 36d2a34..6061b67 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Example Template for remote xul -->
 
@@ -11,7 +11,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -35,7 +35,9 @@
                function my_init() {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               if (typeof JSAN == 'undefined') {
+                                       throw( document.getElementById("commonStrings").getString('common.jsan.missing') );
+                               }
                                JSAN.errorLevel = "die"; // none, warn, or die
                                JSAN.addRepository('/xul/server/');
                                JSAN.use('util.error'); g.error = new util.error();
                                );
 
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Receipt Template Editor'); } catch(E) { alert(E); }
+                                       try { window.xulG.set_tab_name(document.getElementById('circStrings').getString('staff.circ.print_list_template.tab_name')); } catch(E) { alert(E); }
                                }
 
                        } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\ncirc/print_list.xul\n" + E + '\n';
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ/print_list_template_editor.xul', E]);
                                try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
                                alert(err_msg);
                        }
        ]]>
        </script>
 
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+       <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <commandset id="print_list_cmds">
                <command id="cmd_broken" />
        </commandset>
 
        <groupbox id="main" flex="1">
-               <caption label="Templates" />
+               <caption label="&staff.circ.print_list.main.label;" />
                <hbox id="top_ui">
                        <groupbox flex="1">
-                               <caption label="ID" />
+                               <caption label="&staff.circ.print_list.top_ui.label;" />
                                <hbox>
-                                       <label value="Name" accesskey="N" control="template_name_menu" />
+                                       <label value="&staff.circ.print_list.top_ui.name.label;" accesskey="&staff.circ.print_list.top_ui.name.accesskey;" control="template_name_menu" />
                                        <hbox id="template_name_menu_placeholder" flex="1"/>
                                </hbox>
                                <hbox>
-                                       <label value="Type" />
+                                       <label value="&staff.circ.print_list.top_ui.type.label;" />
                                        <hbox id="template_type_menu_placeholder" />
                                </hbox>
                        </groupbox>
                        <groupbox orient="horizontal">
-                               <caption label="Actions" />
+                               <caption label="&staff.circ.print_list.top_ui.actions.label;" />
                                <vbox>
-                                       <button id="preview" label="Preview" accesskey="P" />
-                                       <button id="macros" label="Macros" accesskey="M" />
+                                       <button id="preview" label="&staff.circ.print_list.top_ui.preview.label;" accesskey="&staff.circ.print_list.top_ui.preview.accesskey;" />
+                                       <button id="macros" label="&staff.circ.print_list.top_ui.macros.label;" accesskey="&staff.circ.print_list.top_ui.macros.accesskey;" />
                                </vbox>
                                <vbox>
-                                       <button id="default" label="Default" accesskey="D" />
-                                       <button id="save" label="Save Locally" accesskey="S" />
+                                       <button id="default" label="&staff.circ.print_list.top_ui.default.label;" accesskey="&staff.circ.print_list.top_ui.default.accesskey;" />
+                                       <button id="save" label="&staff.circ.print_list.top_ui.save.label;" accesskey="&staff.circ.print_list.top_ui.save.accesskey;" />
                                </vbox>
                                <vbox>
-                                       <description>Be sure to "Save Locally" before export</description>
-                                       <button id="export" label="Export" accesskey="E" />
-                                       <button id="import" label="Import" accesskey="I" />
+                                       <description>&staff.circ.print_list.top_ui.description;</description>
+                                       <button id="export" label="&staff.circ.print_list.top_ui.description.export.label;" accesskey="&staff.circ.print_list.top_ui.description.export.accesskey;" />
+                                       <button id="import" label="&staff.circ.print_list.top_ui.description.import.label;" accesskey="&staff.circ.print_list.top_ui.description.import.accesskey;" />
                                </vbox>
                        </groupbox>
                </hbox>
                <hbox flex="1">
                        <groupbox flex="1">
-                               <caption label="Preview" />
+                               <caption label="&staff.circ.print_list.top_ui.preview.label;" />
                                <iframe id="sample" flex="1"/>
                        </groupbox>
                        <vbox flex="1">
                                <groupbox flex="1">
-                                       <caption label="Header"/>
+                                       <caption label="&staff.circ.print_list.header.label;"/>
                                        <textbox id="header" multiline="true" flex="1"/>
                                </groupbox>
                                <groupbox flex="1">
-                                       <caption label="Line Item"/>
+                                       <caption label="&staff.circ.print_list.line_item.label;"/>
                                        <textbox id="line_item" multiline="true" flex="1"/>
                                </groupbox>
                                <groupbox flex="1">
-                                       <caption label="Footer"/>
+                                       <caption label="&staff.circ.print_list.footer.label;"/>
                                        <textbox id="footer" multiline="true" flex="1"/>
                                </groupbox>
                        </vbox>
index a785154..42b283c 100644 (file)
@@ -1,12 +1,13 @@
 dump('entering circ/util.js\n');
+// vim:noet:sw=4:ts=4:
 
-if (typeof circ == 'undefined') var circ = {};
+if (typeof circ == 'undefined') { var circ = {}; }
 circ.util = {};
 
-circ.util.EXPORT_OK    = [ 
-       'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns', 
-       'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_columns', 
-       'show_last_few_circs', 'abort_transits', 'transit_columns', 'renew_via_barcode',
+circ.util.EXPORT_OK    = [
+       'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns',
+       'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_columns',
+       'show_last_few_circs', 'abort_transits', 'transit_columns', 'renew_via_barcode'
 ];
 circ.util.EXPORT_TAGS  = { ':all' : circ.util.EXPORT_OK };
 
@@ -16,20 +17,28 @@ circ.util.abort_transits = function(selection_list) {
        JSAN.use('util.network'); obj.network = new util.network();
        JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
        JSAN.use('util.functional');
-       var msg = 'Are you sure you would like to abort transits for copies:' + util.functional.map_list( selection_list, function(o){return o.copy_id;}).join(', ') + '?';
-       var r = obj.error.yns_alert(msg,'Aborting Transits','Yes','No',null,'Check here to confirm this action');
+       var copies = util.functional.map_list( selection_list, function(o){return o.copy_id;}).join(', ');
+       var msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.abort_transits.confirm', [copies]);
+       var r = obj.error.yns_alert(
+               msg,
+               document.getElementById('circStrings').getString('staff.circ.utils.abort_transits.title'),
+               document.getElementById('circStrings').getString('staff.circ.utils.yes'),
+               document.getElementById('circStrings').getString('staff.circ.utils.no'),
+               null,
+               document.getElementById('circStrings').getString('staff.circ.confirm')
+       );
        if (r == 0) {
                try {
                        for (var i = 0; i < selection_list.length; i++) {
                                var copy_id = selection_list[i].copy_id;
                                var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'copyid' : copy_id } ]);
                                if (typeof robj.ilsevent != 'undefined') {
-                                       switch(robj.ilsevent) {
+                                       switch(Number(robj.ilsevent)) {
                                                case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
-                                                       alert('Copy Id = ' + copy_id + '\n' + robj.desc);
+                                                       alert(document.getElementById('circString').getFormattedString('staff.circ.utils.abort_transits.not_allowed', [copy_id]) + '\n' + robj.desc);
                                                break;
                                                case 1504 /* ACTION_TRANSIT_COPY_NOT_FOUND */ :
-                                                       alert('This item was no longer in transit at the time of the abort.  Perhaps this happened from a stale display?');
+                                                       alert(document.getElementById('circString').getString('staff.circ.utils.abort_transits.not_found'));
                                                break;
                                                case 5000 /* PERM_FAILURE */ :
                                                break;
@@ -40,10 +49,10 @@ circ.util.abort_transits = function(selection_list) {
                                }
                        }
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Transit not likely aborted.',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circString').getString('staff.circ.utils.abort_transits.unexpected_error'),E);
                }
        }
-}
+};
 
 circ.util.show_copy_details = function(copy_id) {
        var obj = {};
@@ -66,15 +75,15 @@ circ.util.show_copy_details = function(copy_id) {
                                        var url = urls.XUL_PATRON_DISPLAY; // + '?id=' + window.escape( patrons[j] );
                                        window.xulG.new_tab( url, {}, { 'id' : patrons[j] } );
                                } catch(E) {
-                                       obj.error.standard_unexpected_error_alert('Problem retrieving patron.',E);
+                                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_patron.failure'), E);
                                }
                        }
                }
 
        } catch(E) {
-               obj.error.standard_unexpected_error_alert('Problem retrieving copy details.',E);
+               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_copy.failure'),E);
        }
-}
+};
 
 
 circ.util.show_last_few_circs = function(selection_list,count) {
@@ -100,74 +109,93 @@ circ.util.show_last_few_circs = function(selection_list,count) {
                                                var url = urls.XUL_PATRON_DISPLAY; // + '?id=' + window.escape( patrons[j] );
                                                window.xulG.new_tab( url, {}, { 'id' : patrons[j] } );
                                        } catch(E) {
-                                               obj.error.standard_unexpected_error_alert('Problem retrieving patron.',E);
+                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_patron.failure') ,E);
                                        }
                                }
                        }
 
                } catch(E) {
-                       obj.error.standard_unexpected_error_alert('Problem retrieving circulations.',E);
+                       obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_circs.failure') ,E);
                }
        }
-}
+};
 
 circ.util.offline_checkout_columns = function(modify,params) {
        
        var c = [
-               { 
-                       'id' : 'timestamp', 
-                       'label' : 'Timestamp', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.timestamp; },
+               {
+                       'id' : 'timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.timestamp; }
                },
-               { 
-                       'id' : 'checkout_time', 
-                       'label' : 'Check Out Time', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.checkout_time; },
+               {
+                       'id' : 'checkout_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.checkout_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.checkout_time; }
                },
-               { 
-                       'id' : 'type', 
-                       'label' : 'Transaction Type', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.type; }, 
+               {
+                       'id' : 'type',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.type; }
                },
                {
                        'id' : 'noncat',
-                       'label' : 'Non-Cataloged?',
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.noncat; },
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.noncat'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.noncat; }
                },
                {
                        'id' : 'noncat_type',
-                       'label' : 'Non-Cat Type ID',
-                       'flex' : 1, 'primary' : false, 'hidden' : true,
-                       'render' : function(my) { return my.noncat_type; },
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.noncat_type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.noncat_type; }
                },
                {
                        'id' : 'noncat_count',
-                       'label' : 'Count', 'sort_type' : 'number',
-                       'flex' : 1, 'primary' : false, 'hidden' : false,
-                       'render' : function(my) { return my.noncat_count; },
-               },
-               { 
-                       'id' : 'patron_barcode', 
-                       'label' : 'Patron Barcode', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.patron_barcode; },
-               },
-               { 
-                       'id' : 'barcode', 
-                       'label' : 'Item Barcode', 
-                       'flex' : 2, 'primary' : true, 'hidden' : false, 
-                       'render' : function(my) { return my.barcode; },
-               },
-               { 
-                       'id' : 'due_date', 
-                       'label' : 'Due Date', 
-                       'flex' : 1, 'primary' : false, 'hidden' : false, 
-                       'render' : function(my) { return my.due_date; },
-               },
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.count'),
+                       'sort_type' : 'number',
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.noncat_count; }
+               },
+               {
+                       'id' : 'patron_barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.patron_barcode; }
+               },
+               {
+                       'id' : 'barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
+                       'flex' : 2,
+                       'primary' : true,
+                       'hidden' : false,
+                       'render' : function(my) { return my.barcode; }
+               },
+               {
+                       'id' : 'due_date',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.due_date'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.due_date; }
+               }
        ];
        if (modify) for (var i = 0; i < c.length; i++) {
                if (modify[ c[i].id ]) {
@@ -198,35 +226,43 @@ circ.util.offline_checkout_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
+};
 
 circ.util.offline_checkin_columns = function(modify,params) {
        
        var c = [
-               { 
-                       'id' : 'timestamp', 
-                       'label' : 'Timestamp', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.timestamp; },
-               },
-               { 
-                       'id' : 'backdate', 
-                       'label' : 'Back Date', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.backdate; },
-               },
-               { 
-                       'id' : 'type', 
-                       'label' : 'Transaction Type', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.type; },
-               },
-               { 
-                       'id' : 'barcode', 
-                       'label' : 'Item Barcode', 
-                       'flex' : 2, 'primary' : true, 'hidden' : false, 
-                       'render' : function(my) { return my.barcode; },
+               {
+                       'id' : 'timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.timestamp; }
+               },
+               {
+                       'id' : 'backdate',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.backdate'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.backdate; }
+               },
+               {
+                       'id' : 'type',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.type; }
                },
+               {
+                       'id' : 'barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
+                       'flex' : 2,
+                       'primary' : true,
+                       'hidden' : false,
+                       'render' : function(my) { return my.barcode; }
+               }
        ];
        if (modify) for (var i = 0; i < c.length; i++) {
                if (modify[ c[i].id ]) {
@@ -257,47 +293,59 @@ circ.util.offline_checkin_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
+};
 
 circ.util.offline_renew_columns = function(modify,params) {
        
        var c = [
-               { 
-                       'id' : 'timestamp', 
-                       'label' : 'Timestamp', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.timestamp; },
-               },
-               { 
-                       'id' : 'checkout_time', 
-                       'label' : 'Check Out Time', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.checkout_time; },
-               },
-               { 
-                       'id' : 'type', 
-                       'label' : 'Transaction Type', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.type; },
-               },
-               { 
-                       'id' : 'patron_barcode', 
-                       'label' : 'Patron Barcode', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.patron_barcode; },
-               },
-               { 
-                       'id' : 'barcode', 
-                       'label' : 'Item Barcode', 
-                       'flex' : 2, 'primary' : true, 'hidden' : false, 
-                       'render' : function(my) { return my.barcode; },
-               },
-               { 
-                       'id' : 'due_date', 
-                       'label' : 'Due Date', 
-                       'flex' : 1, 'primary' : false, 'hidden' : false, 
-                       'render' : function(my) { return my.due_date; },
+               {
+                       'id' : 'timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.timestamp; }
+               },
+               {
+                       'id' : 'checkout_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.checkout_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.checkout_time; }
+               },
+               {
+                       'id' : 'type',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.type; }
+               },
+               {
+                       'id' : 'patron_barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.patron_barcode; }
                },
+               {
+                       'id' : 'barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
+                       'flex' : 2,
+                       'primary' : true,
+                       'hidden' : false,
+                       'render' : function(my) { return my.barcode; }
+               },
+               {
+                       'id' : 'due_date',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.due_date'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.due_date; }
+               }
        ];
        if (modify) for (var i = 0; i < c.length; i++) {
                if (modify[ c[i].id ]) {
@@ -328,41 +376,52 @@ circ.util.offline_renew_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
+};
 
 circ.util.offline_inhouse_use_columns = function(modify,params) {
        
        var c = [
-               { 
-                       'id' : 'timestamp', 
-                       'label' : 'Timestamp', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.timestamp; },
+               {
+                       'id' : 'timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.timestamp; }
                },
-               { 
-                       'id' : 'use_time', 
-                       'label' : 'Use Time', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.use_time; },
+               {
+                       'id' : 'use_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.use_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.use_time; }
                },
-               { 
-                       'id' : 'type', 
-                       'label' : 'Transaction Type', 
-                       'flex' : 1, 'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { return my.type; },
+               {
+                       'id' : 'type',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.type; }
                },
                {
                        'id' : 'count',
-                       'label' : 'Count', 'sort_type' : 'number',
-                       'flex' : 1, 'primary' : false, 'hidden' : false,
-                       'render' : function(my) { return my.count; },
-               },
-               { 
-                       'id' : 'barcode', 
-                       'label' : 'Item Barcode', 
-                       'flex' : 2, 'primary' : true, 'hidden' : false, 
-                       'render' : function(my) { return my.barcode; },
-               },
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.count'),
+                       'sort_type' : 'number',
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.count; }
+               },
+               {
+                       'id' : 'barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
+                       'flex' : 2,
+                       'primary' : true,
+                       'hidden' : false,
+                       'render' : function(my) { return my.barcode; }
+               }
        ];
        if (modify) for (var i = 0; i < c.length; i++) {
                if (modify[ c[i].id ]) {
@@ -393,9 +452,7 @@ circ.util.offline_inhouse_use_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
-
-
+};
 
 circ.util.columns = function(modify,params) {
        
@@ -403,207 +460,637 @@ circ.util.columns = function(modify,params) {
        JSAN.use('util.network'); var network = new util.network();
        JSAN.use('util.money');
 
-       function getString(s) { return data.entities[s]; }
-
        var c = [
                {
-                       'id' : 'acp_id', 'label' : getString('staff.acp_label_id'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.id(); }, 'persist' : 'hidden width ordinal',
+                       'id' : 'acp_id',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_id'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.id(); },
+                       'persist' : 'hidden width ordinal'
                },
                {
-                       'id' : 'circ_id', 'label' : getString('staff.circ_label_id'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.id() : ( my.acp.circulations() ? my.acp.circulations()[0].id() : ""); },
-                       'persist' : 'hidden width ordinal',
+                       'id' : 'circ_id',
+                       'label' : document.getElementById('commonStrings').getString('staff.circ_label_id'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.circ ? my.circ.id() : ( my.acp.circulations() ? my.acp.circulations()[0].id() : ""); },
+                       'persist' : 'hidden width ordinal'
                },
                {
-                       'id' : 'mvr_doc_id', 'label' : getString('staff.mvr_label_doc_id'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.doc_id(); },
-                       'persist' : 'hidden width ordinal',
+                       'id' : 'mvr_doc_id',
+                       'label' : document.getElementById('commonStrings').getString('staff.mvr_label_doc_id'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.doc_id(); },
+                       'persist' : 'hidden width ordinal'
                },
-               {
-                       'id' : 'barcode', 'label' : getString('staff.acp_label_barcode'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.barcode(); },
+        {
                        'persist' : 'hidden width ordinal',
-               },
+                       'id' : 'service',
+                       'label' : 'Service',
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.service; }
+        },
                {
-                       'id' : 'call_number', 'label' : getString('staff.acp_label_call_number'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { if (my.acp && my.acp.call_number() == -1) { return "Not Cataloged"; } else { if (!my.acn) { var x = network.simple_request("FM_ACN_RETRIEVE",[ my.acp.call_number() ]); if (x.ilsevent) { return "Not Cataloged"; } else { my.acn = x; return x.label(); } } else { return my.acn.label(); } } },
-                       'persist' : 'hidden width ordinal',
+                       'id' : 'barcode',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_barcode'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.barcode(); },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'call_number',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_call_number'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.acp && my.acp.call_number() == -1) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.not_cataloged');
+                               } else if (my.acp && my.acp.call_number() == -2) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.retrieving');
+                               } else {
+                                       if (!my.acn) {
+                                               var x = network.simple_request("FM_ACN_RETRIEVE.authoritative",[ my.acp.call_number() ]);
+                                               if (x.ilsevent) {
+                                                       return document.getElementById('circStrings').getString('staff.circ.utils.not_cataloged');
+                                               } else {
+                                                       my.acn = x; return x.label();
+                                               }
+                                       } else {
+                                               return my.acn.label();
+                                       }
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'owning_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.owning_lib'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.acn.owning_lib())>=0) {
+                                       return data.hash.aou[ my.acn.owning_lib() ].shortname();
+                               } else {
+                                       return my.acn.owning_lib().shortname();
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'copy_number',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_copy_number'),
+                       'flex' : 1,
+                       'sort_type' : 'number',
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.copy_number(); },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'location',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_location'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.acp.location())>=0) {
+                                       return data.lookup("acpl", my.acp.location() ).name();
+                               } else {
+                                       return my.acp.location().name();
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'loan_duration',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_loan_duration'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               switch(Number(my.acp.loan_duration())) {
+                                       case 1:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.short');
+                                               break;
+                                       case 2:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.normal');
+                                               break;
+                                       case 3:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.long');
+                                               break;
+                               };
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'circ_lib',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_lib'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.acp.circ_lib())>=0) {
+                                       return data.hash.aou[ my.acp.circ_lib() ].shortname();
+                               } else {
+                                       return my.acp.circ_lib().shortname();
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'fine_level',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_fine_level'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               switch(Number(my.acp.fine_level())) {
+                                       case 1:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.low');
+                                               break;
+                                       case 2:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.normal');
+                                               break;
+                                       case 3:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.high');
+                                               break;
+                               };
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'circulate',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.circulate'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.circulate() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'deleted',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.deleted'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.deleted() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'holdable',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.holdable'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.holdable() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
+               },
+               {
+                       'id' : 'opac_visible',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.opac_visible'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.opac_visible() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       },
+                       'persist' : 'hidden width ordinal'
                },
                {
-                       'id' : 'owning_lib', 'label' : 'Owning Lib', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,
-                       'render' : function(my) { if (Number(my.acn.owning_lib())>=0) { return data.hash.aou[ my.acn.owning_lib() ].shortname(); } else { return my.acn.owning_lib().shortname(); } }, 
                        'persist' : 'hidden width ordinal',
+                       'id' : 'ref',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.reference'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.ref() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       }
                },
                {
-                       'id' : 'copy_number', 'label' : getString('staff.acp_label_copy_number'), 'flex' : 1, 'sort_type' : 'number',
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.copy_number(); },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'deposit',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.deposit'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool( my.acp.deposit() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       }
                },
                {
-                       'id' : 'location', 'label' : getString('staff.acp_label_location'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { if (Number(my.acp.location())>=0) return data.lookup("acpl", my.acp.location() ).name(); else return my.acp.location().name(); },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'deposit_amount',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_deposit_amount'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.acp.price() == null) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.unset');
+                               } else {
+                                       return util.money.sanitize(my.acp.deposit_amount());
+                               }
+                       },
+                       'sort_type' : 'money'
                },
                {
-                       'id' : 'loan_duration', 'label' : getString('staff.acp_label_loan_duration'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 
-                       'render' : function(my) { switch(my.acp.loan_duration()){ case 1: return "Short"; break; case 2: return "Normal"; break; case 3: return "Long"; break; }; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'price',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_price'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.acp.price() == null) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.unset');
+                               } else {
+                                       return util.money.sanitize(my.acp.price());
+                               }
+                       },
+                       'sort_type' : 'money'
                },
                {
-                       'id' : 'circ_lib', 'label' : getString('staff.acp_label_circ_lib'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { if (Number(my.acp.circ_lib())>=0) return data.hash.aou[ my.acp.circ_lib() ].shortname(); else return my.acp.circ_lib().shortname(); },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'circ_as_type',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_as_type'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.circ_as_type(); }
                },
                {
-                       'id' : 'fine_level', 'label' : getString('staff.acp_label_fine_level'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,
-                       'render' : function(my) { switch(my.acp.fine_level()){ case 1: return "Low"; break; case 2: return "Normal"; break; case 3: return "High"; break; }; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'circ_modifier',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_modifier'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.circ_modifier(); }
                },
                {
-                       'id' : 'circulate', 'label' : 'Circulate?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.circulate() ) ? "Yes" : "No"; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'checkout_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkout_lib'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return data.hash.aou[ my.circ.circ_lib() ].shortname();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return data.hash.aou[ my.acp.circulations()[0].circ_lib() ].shortname();
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'id' : 'deleted', 'label' : 'Deleted?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.deleted() ) ? "Yes" : "No"; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'xact_start_full',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkout_timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.xact_start();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].xact_start();
+                                       }
+                                       else {
+                                               return  "";
+                                       }
+                               }
+                       }
                },
                {
-                       'id' : 'holdable', 'label' : 'Holdable?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.holdable() ) ? "Yes" : "No"; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'checkin_time_full',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkin_timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.checkin_time();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].checkin_time();
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'id' : 'opac_visible', 'label' : 'OPAC Visible?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.opac_visible() ) ? "Yes" : "No"; },
                        'persist' : 'hidden width ordinal',
+                       'id' : 'xact_start',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.xact_start'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.xact_start().substr(0,10);
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].xact_start().substr(0,10);
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'ref', 'label' : 'Reference?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.ref() ) ? "Yes" : "No"; },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'deposit', 'label' : 'Deposit?', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.acp.deposit() ) ? "Yes" : "No"; },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'deposit_amount', 'label' : getString('staff.acp_label_deposit_amount'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.price() == null ? "<Unset>" : util.money.sanitize(my.acp.deposit_amount()); }, 'sort_type' : 'money',
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'price', 'label' : getString('staff.acp_label_price'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.price() == null ? "<Unset>" : util.money.sanitize(my.acp.price()); }, 'sort_type' : 'money',
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'circ_as_type', 'label' : getString('staff.acp_label_circ_as_type'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.circ_as_type(); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'circ_modifier', 'label' : getString('staff.acp_label_circ_modifier'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.circ_modifier(); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'checkout_lib', 'label' : 'Checkout Lib', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? data.hash.aou[ my.circ.circ_lib() ].shortname() : ( my.acp.circulations() ? data.hash.aou[ my.acp.circulations()[0].circ_lib() ].shortname() : ""); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_start_full', 'label' : 'Checkout Timestamp', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.xact_start() : (my.acp.circulations() ? my.acp.circulations()[0].xact_start() : ""); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'checkin_time_full', 'label' : 'Checkin Timestamp', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.checkin_time() : (my.acp.circulations() ? my.acp.circulations()[0].checkin_time() : ""); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_start', 'label' : 'Checkout Date', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.xact_start().substr(0,10) : (my.acp.circulations() ? my.acp.circulations()[0].xact_start().substr(0,10) : ""); },
-               },
-               {
-                       'persist' : 'hidden width ordinal', 'id' : 'checkin_time', 'label' : 'Checkin Date', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.checkin_time().substr(0,10) : (my.acp.circulations() ? my.acp.circulations()[0].checkin_time().substr(0,10) : ""); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'checkin_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkin_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.checkin_time().substr(0,10);
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].checkin_time().substr(0,10);
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
-
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_finish', 'label' : 'Transaction Finished', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ.xact_finish(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'xact_finish',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.xact_finish'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.circ.xact_finish(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'due_date', 'label' : getString('staff.circ_label_due_date'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.due_date().substr(0,10) : (my.acp.circulations() ? my.acp.circulations()[0].due_date().substr(0,10) : ""); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'due_date',
+                       'label' : document.getElementById('commonStrings').getString('staff.circ_label_due_date'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.due_date().substr(0,10);
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].due_date().substr(0,10);
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'create_date', 'label' : 'Date Created', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.create_date().substr(0,10); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'create_date',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.create_date'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.create_date().substr(0,10); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'edit_date', 'label' : 'Date Last Edited', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.edit_date().substr(0,10); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'edit_date',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.edit_date'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.edit_date().substr(0,10); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 2, 'sort_type' : 'title',
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { try {  return my.mvr.title(); } catch(E) { return my.acp.dummy_title(); } }
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'title',
+                       'label' : document.getElementById('commonStrings').getString('staff.mvr_label_title'),
+                       'flex' : 2,
+                       'sort_type' : 'title',
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               try {  return my.mvr.title(); }
+                               catch(E) { return my.acp.dummy_title(); }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { try { return my.mvr.author(); } catch(E) { return my.acp.dummy_author(); } }
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'author',
+                       'label' : document.getElementById('commonStrings').getString('staff.mvr_label_author'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               try { return my.mvr.author(); }
+                               catch(E) { return my.acp.dummy_author(); }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.edition(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'edition',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.edition'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.edition(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.isbn(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'isbn',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.isbn'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.isbn(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.pubdate(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'pubdate',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.pubdate'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.pubdate(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.publisher(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'publisher',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.publisher'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.publisher(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.tcn(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'tcn',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.tcn(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'renewal_remaining', 'label' : getString('staff.circ_label_renewal_remaining'), 'flex' : 0,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.renewal_remaining() : (my.acp.circulations() ? my.acp.circulations()[0].renewal_remaining() : ""); }, 'sort_type' : 'number',
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'renewal_remaining',
+                       'label' : document.getElementById('commonStrings').getString('staff.circ_label_renewal_remaining'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.renewal_remaining();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].renewal_remaining();
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       },
+                       'sort_type' : 'number'
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'stop_fines', 'label' : 'Fines Stopped', 'flex' : 0,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.stop_fines() : (my.acp.circulations() ? my.acp.circulations()[0].stop_fines() : ""); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'stop_fines',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.stop_fines'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.stop_fines();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].stop_fines();
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'stop_fines_time', 'label' : 'Fines Stopped Time', 'flex' : 0,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.circ ? my.circ.stop_fines_time() : (my.acp.circulations() ? my.acp.circulations()[0].stop_fines_time() : ""); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'stop_fines_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.stop_fines_time'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.circ) {
+                                       return my.circ.stop_fines_time();
+                               } else {
+                                       if (my.acp.circulations()) {
+                                               return my.acp.circulations()[0].stop_fines_time();
+                                       } else {
+                                               return "";
+                                       }
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'status', 'label' : getString('staff.acp_label_status'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { if (Number(my.acp.status())>=0) return data.hash.ccs[ my.acp.status() ].name(); else return my.acp.status().name(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'status',
+                       'label' : document.getElementById('commonStrings').getString('staff.acp_label_status'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.acp.status())>=0) {
+                                       return data.hash.ccs[ my.acp.status() ].name();
+                               } else {
+                                       return my.acp.status().name();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'route_to', 'label' : 'Route To', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.route_to.toString(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'route_to',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.route_to'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.route_to.toString(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'message', 'label' : 'Message', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.message.toString(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'message',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.message'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.message.toString(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'uses', 'label' : '# of Uses', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.uses; }, 'sort_type' : 'number',
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'uses',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.uses'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.uses; },
+                       'sort_type' : 'number'
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'alert_message', 'label' : 'Alert Message', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acp.alert_message(); },
-               },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'alert_message',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.alert_message'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.alert_message(); }
+               }
        ];
        for (var i = 0; i < c.length; i++) {
                if (modify[ c[i].id ]) {
@@ -633,54 +1120,120 @@ circ.util.columns = function(modify,params) {
                }
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
+};
 
 circ.util.transit_columns = function(modify,params) {
        
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
 
-       function getString(s) { return data.entities[s]; }
-
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_item_barcode', 'label' : 'Barcode', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.acp.barcode(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_item_barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.barcode'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acp.barcode(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_item_title', 'label' : 'Title', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { try { return my.mvr.title(); } catch(E) { return my.acp.dummy_title(); } },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_item_title',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.title'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               try { return my.mvr.title(); }
+                               catch(E) { return my.acp.dummy_title(); }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_item_author', 'label' : 'Author', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { try { return my.mvr.author(); } catch(E) { return my.acp.dummy_author(); } },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_item_author',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.author'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               try { return my.mvr.author(); }
+                               catch(E) { return my.acp.dummy_author(); }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_item_callnumber', 'label' : 'Call Number', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.acn.label(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_item_callnumber',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.callnumber'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acn.label(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_id', 'label' : 'Transit ID', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.atc.id(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_id',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_id'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.atc.id(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_source', 'label' : 'Transit Source', 'flex' : 1,
-                       'primary' : false, 'hidden' : false, 'render' : function(my) { return typeof my.atc.source() == "object" ? my.atc.source().shortname() : data.hash.aou[ my.atc.source() ].shortname(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_source',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) {
+                               if (typeof my.atc.source() == "object") {
+                                       return my.atc.source().shortname();
+                               } else {
+                                       return data.hash.aou[ my.atc.source() ].shortname();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_source_send_time', 'label' : 'Transitted On', 'flex' : 1,
-                       'primary' : false, 'hidden' : false, 'render' : function(my) { return my.atc.source_send_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_source_send_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source_send_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.atc.source_send_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_dest_lib', 'label' : 'Transit Destination', 'flex' : 1,
-                       'primary' : false, 'hidden' : false, 'render' : function(my) { return typeof my.atc.dest() == "object" ? my.atc.dest().shortname() : data.hash.aou[ my.atc.dest() ].shortname(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_dest_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) {
+                               if (typeof my.atc.dest() == "object") {
+                                       return my.atc.dest().shortname();
+                               } else {
+                                       return data.hash.aou[ my.atc.dest() ].shortname();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_dest_recv_time', 'label' : 'Transit Completed On', 'flex' : 1,
-                       'primary' : false, 'hidden' : false, 'render' : function(my) { return my.atc.dest_recv_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_dest_recv_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest_recv_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) { return my.atc.dest_recv_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_target_copy', 'label' : 'Transit Copy ID', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.atc.target_copy(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_target_copy',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_target_copy'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.atc.target_copy(); }
                },
        ];
        for (var i = 0; i < c.length; i++) {
@@ -712,194 +1265,501 @@ circ.util.transit_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
-
+};
 
 circ.util.hold_columns = function(modify,params) {
        
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
 
-       function getString(s) { return data.entities[s]; }
-
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'request_lib', 'label' : 'Request Lib (Full Name)', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { if (Number(my.ahr.request_lib())>=0) return data.hash.aou[ my.ahr.request_lib() ].name(); else return my.ahr.request_lib().name(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'request_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_lib'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.ahr.request_lib())>=0) {
+                                       return data.hash.aou[ my.ahr.request_lib() ].name();
+                               } else {
+                                       return my.ahr.request_lib().name();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'request_lib_shortname', 'label' : 'Request Lib', 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { if (Number(my.ahr.request_lib())>=0) return data.hash.aou[ my.ahr.request_lib() ].shortname(); else return my.ahr.request_lib().shortname(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'request_lib_shortname',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_lib_shortname'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.ahr.request_lib())>=0) {
+                                       return data.hash.aou[ my.ahr.request_lib() ].shortname();
+                               } else {
+                                       return my.ahr.request_lib().shortname();
+                               }
+                       }
                },
 
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'request_timestamp', 'label' : 'Request Timestamp', 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { return my.ahr.request_time().toString(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'request_timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_timestamp'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.request_time().toString(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'request_time', 'label' : 'Request Date', 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { return my.ahr.request_time().toString().substr(0,10); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'request_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_time'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.request_time().toString().substr(0,10); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'available_timestamp', 'label' : 'Available On (Timestamp)', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.transit() ? ( my.ahr.transit().dest_recv_time() ? my.ahr.transit().dest_recv_time().toString() : "") : ( my.ahr.capture_time() ? my.ahr.capture_time().toString() : "" ); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'available_timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.available_timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.ahr.transit() && my.ahr.transit().dest_recv_time()) {
+                                       return my.ahr.transit().dest_recv_time().toString();
+                               }
+                               if (my.ahr.capture_time()) {
+                                       return my.ahr.capture_time().toString();
+                               }
+                               return "";
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'available_time', 'label' : 'Available On', 'flex' : 1,
-                       'primary' : false, 'hidden' : false,  'render' : function(my) { return my.ahr.transit() ? ( my.ahr.transit().dest_recv_time() ? my.ahr.transit().dest_recv_time().toString().substr(0,10) : "") : ( my.ahr.capture_time() ? my.ahr.capture_time().toString().substr(0,10) : "" ); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'available_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.available_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) {
+                               if (my.ahr.transit() && my.ahr.transit().dest_recv_time()) {
+                                       return my.ahr.transit().dest_recv_time().toString().substr(0,10);
+                               }
+                               if (my.ahr.capture_time()) {
+                                       return my.ahr.capture_time().toString().substr(0,10);
+                               }
+                               return "";
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'capture_timestamp', 'label' : 'Capture Timestamp', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.capture_time() ? my.ahr.capture_time().toString() : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'capture_timestamp',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.capture_timestamp'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.capture_time() ? my.ahr.capture_time().toString() : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'capture_time', 'label' : 'Capture Date', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.capture_time() ? my.ahr.capture_time().toString().substr(0,10) : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'capture_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.capture_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.capture_time() ? my.ahr.capture_time().toString().substr(0,10) : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'status', 'label' : getString('staff.ahr_status_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : false,  'render' : function(my) { switch(my.status) { case 1: case "1": return "Waiting for copy"; break; case 2: case "2": return "Waiting for capture"; break; case 3: case "3": return "In-Transit"; break; case 4: case "4" : return "Ready for pickup"; break; default: return my.status; break;}; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'status',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_status_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : false,
+                       'render' : function(my) {
+                               switch (Number(my.status)) {
+                                       case 1:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.1');
+                                               break;
+                                       case 2:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.2');
+                                               break;
+                                       case 3:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.3');
+                                               break;
+                                       case 4:
+                                               return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.4');
+                                               break;
+                                       default:
+                                               return my.status;
+                                               break;
+                               };
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'hold_type', 'label' : getString('staff.ahr_hold_type_label'), 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.hold_type(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'hold_type',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_hold_type_label'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.hold_type(); }
                },
         {
-                       'persist' : 'hidden width ordinal', 'id' : 'frozen', 'label' : 'Frozen?', 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return get_bool( my.ahr.frozen() ) ? 'Yes' : 'No'; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'frozen',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.active'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (!get_bool( my.ahr.frozen() )) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       }
         },
         {
-                       'persist' : 'hidden width ordinal', 'id' : 'thaw_date', 'label' : 'Thaw Date', 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.thaw_date() == null ? 'No Date' : my.ahr.thaw_date().substr(0,10); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'thaw_date',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.thaw_date'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.ahr.thaw_date() == null) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.thaw_date.none');
+                               } else {
+                                       return my.ahr.thaw_date().substr(0,10);
+                               }
+                       }
         },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'pickup_lib', 'label' : 'Pickup Lib (Full Name)', 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { if (Number(my.ahr.pickup_lib())>=0) return data.hash.aou[ my.ahr.pickup_lib() ].name(); else return my.ahr.pickup_lib().name(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'pickup_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.pickup_lib'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.ahr.pickup_lib())>=0) {
+                                       return data.hash.aou[ my.ahr.pickup_lib() ].name();
+                               } else {
+                                       return my.ahr.pickup_lib().name();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'pickup_lib_shortname', 'label' : getString('staff.ahr_pickup_lib_label'), 'flex' : 0,
-                       'primary' : false, 'hidden' : true,  
-                       'render' : function(my) { if (Number(my.ahr.pickup_lib())>=0) return data.hash.aou[ my.ahr.pickup_lib() ].shortname(); else return my.ahr.pickup_lib().shortname(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'pickup_lib_shortname',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_pickup_lib_label'),
+                       'flex' : 0,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (Number(my.ahr.pickup_lib())>=0) {
+                                       return data.hash.aou[ my.ahr.pickup_lib() ].shortname();
+                               } else {
+                                       return my.ahr.pickup_lib().shortname();
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'current_copy', 'label' : getString('staff.ahr_current_copy_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.acp ? my.acp.barcode() : "No Copy"; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'current_copy',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_current_copy_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.acp) {
+                                       return my.acp.barcode();
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.current_copy.none');
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'email_notify', 'label' : getString('staff.ahr_email_notify_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return get_bool(my.ahr.email_notify()) ? "Yes" : "No"; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'email_notify',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_email_notify_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (get_bool(my.ahr.email_notify())) {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.yes');
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.no');
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'expire_time', 'label' : getString('staff.ahr_expire_time_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.expire_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'expire_time',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_expire_time_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.expire_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'fulfillment_time', 'label' : getString('staff.ahr_fulfillment_time_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.fulfillment_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'fulfillment_time',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_fulfillment_time_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.fulfillment_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'holdable_formats', 'label' : getString('staff.ahr_holdable_formats_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.holdable_formats(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'holdable_formats',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_holdable_formats_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.holdable_formats(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : getString('staff.ahr_id_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.id(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'id',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_id_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.id(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'phone_notify', 'label' : getString('staff.ahr_phone_notify_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.phone_notify(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'phone_notify',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_phone_notify_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.phone_notify(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'prev_check_time', 'label' : getString('staff.ahr_prev_check_time_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.prev_check_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'prev_check_time',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_prev_check_time_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.prev_check_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'requestor', 'label' : getString('staff.ahr_requestor_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.requestor(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'requestor',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_requestor_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.requestor(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'selection_depth', 'label' : getString('staff.ahr_selection_depth_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.selection_depth(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'selection_depth',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_selection_depth_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.selection_depth(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'target', 'label' : getString('staff.ahr_target_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.target(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'target',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_target_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.target(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'usr', 'label' : getString('staff.ahr_usr_label'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true,  'render' : function(my) { return my.ahr.usr(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'usr',
+                       'label' : document.getElementById('commonStrings').getString('staff.ahr_usr_label'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.usr(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 1, 'sort_type' : 'title',
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr ? my.mvr.title() : "No Title?"; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'title',
+                       'label' : document.getElementById('commonStrings').getString('staff.mvr_label_title'),
+                       'flex' : 1,
+                       'sort_type' : 'title',
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.mvr) {
+                                       return my.mvr.title();
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.title.none');
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr ? my.mvr.author() : "No Author?"; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'author',
+                       'label' : document.getElementById('commonStrings').getString('staff.mvr_label_author'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.mvr) {
+                                       return my.mvr.author();
+                               } else {
+                                       return document.getElementById('circStrings').getString('staff.circ.utils.author.none');
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.edition(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'edition',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.edition'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.edition(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.isbn(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'isbn',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.isbn'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.isbn(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.pubdate(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'pubdate',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.pubdate'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.pubdate(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.publisher(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'publisher',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.publisher'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.publisher(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mvr.tcn(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'tcn',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.mvr.tcn(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'notify_time', 'label' : 'Last Notify Time', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.notify_time(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'notify_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.notify_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.notify_time(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'notify_count', 'label' : 'Notices', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.notify_count(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'notify_count',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.notify_count'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.notify_count(); }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_source', 'label' : 'Transit Source', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.transit() ?  data.hash.aou[ my.ahr.transit().source() ].shortname() : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_source',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) {
+                               if (my.ahr.transit()) {
+                                       return data.hash.aou[ my.ahr.transit().source() ].shortname();
+                               } else {
+                                       return "";
+                               }
+                       }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_source_send_time', 'label' : 'Transitted On', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.transit() ?  my.ahr.transit().source_send_time() : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_source_send_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source_send_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.transit() ?  my.ahr.transit().source_send_time() : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_dest_lib', 'label' : 'Transit Destination', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.transit() ?  data.hash.aou[ my.ahr.transit().dest() ].shortname() : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_dest_lib',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.transit() ?  data.hash.aou[ my.ahr.transit().dest() ].shortname() : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'transit_dest_recv_time', 'label' : 'Transit Completed On', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.ahr.transit() ?  my.ahr.transit().dest_recv_time() : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'transit_dest_recv_time',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest_recv_time'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.ahr.transit() ?  my.ahr.transit().dest_recv_time() : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'patron_barcode', 'label' : 'Patron Barcode', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.patron_barcode ? my.patron_barcode : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'patron_barcode',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.patron_barcode ? my.patron_barcode : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'patron_family_name', 'label' : 'Patron Last Name', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.patron_family_name ? my.patron_family_name : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'patron_family_name',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.patron_family_name'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.patron_family_name ? my.patron_family_name : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'patron_first_given_name', 'label' : 'Patron First Name', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.patron_first_given_name ? my.patron_first_given_name : ""; },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'patron_first_given_name',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.patron_first_given_name'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.patron_first_given_name ? my.patron_first_given_name : ""; }
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'callnumber', 'label' : 'Call Number', 'flex' : 1,
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { return my.acn.label(); },
+                       'persist' : 'hidden width ordinal',
+                       'id' : 'callnumber',
+                       'label' : document.getElementById('circStrings').getString('staff.circ.utils.callnumber'),
+                       'flex' : 1,
+                       'primary' : false,
+                       'hidden' : true,
+                       'render' : function(my) { return my.acn.label(); }
                },
        ];
        for (var i = 0; i < c.length; i++) {
@@ -931,7 +1791,7 @@ circ.util.hold_columns = function(modify,params) {
 
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
-}
+};
 /*
 circ.util.std_map_row_to_column = function(error_value) {
        return function(row,col) {
@@ -939,7 +1799,7 @@ circ.util.std_map_row_to_column = function(error_value) {
                // col contains one of the objects listed above in columns
                
                // mimicking some of the obj in circ.checkin and circ.checkout where map_row_to_column is usually defined
-               var obj = {}; 
+               var obj = {};
                JSAN.use('util.error'); obj.error = new util.error();
                JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
                JSAN.use('util.network'); obj.network = new util.network();
@@ -947,7 +1807,7 @@ circ.util.std_map_row_to_column = function(error_value) {
 
                var my = row.my;
                var value;
-               try { 
+               try {
                        value = eval( col.render );
                } catch(E) {
                        obj.error.sdump('D_WARN','map_row_to_column: ' + E);
@@ -955,14 +1815,14 @@ circ.util.std_map_row_to_column = function(error_value) {
                }
                return value;
        }
-}
+};
 */
 circ.util.std_map_row_to_columns = function(error_value) {
        return function(row,cols) {
                // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } }
                // cols contains all of the objects listed above in columns
                
-               var obj = {}; 
+               var obj = {};
                JSAN.use('util.error'); obj.error = new util.error();
                JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
                JSAN.use('util.network'); obj.network = new util.network();
@@ -971,10 +1831,10 @@ circ.util.std_map_row_to_columns = function(error_value) {
                var my = row.my;
                var values = [];
                var cmd = '';
-               try { 
+               try {
                        for (var i = 0; i < cols.length; i++) {
                                switch (typeof cols[i].render) {
-                                       case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; dump(E+'\n'); } break;
+                                       case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; obj.error.sdump('D_COLUMN_RENDER_ERROR',E); } break;
                                        case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break;
                                        default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; ';
                                }
@@ -986,7 +1846,7 @@ circ.util.std_map_row_to_columns = function(error_value) {
                }
                return values;
        }
-}
+};
 
 circ.util.checkin_via_barcode = function(session,params,backdate,auto_print,async) {
        try {
@@ -1001,39 +1861,42 @@ circ.util.checkin_via_barcode = function(session,params,backdate,auto_print,asyn
                if (backdate) params.backdate = util.date.formatted_date(backdate + ' 00:00:00','%{iso8601}');
 
                if (typeof async == 'object') {
-                       try { async.disable_textbox(); } catch(E) { error.sdump('D_ERROR','async.disable_textbox() = ' + E); };
+                       try { async.disable_textbox(); }
+                       catch(E) { error.sdump('D_ERROR','async.disable_textbox() = ' + E); };
                }
                var check = network.request(
                        api.CHECKIN_VIA_BARCODE.app,
                        api.CHECKIN_VIA_BARCODE.method,
                        [ session, params ],
-                       async ? function(req) { 
+                       async ? function(req) {
                                try {
                                        var check = req.getResultObject();
-                                       var r = circ.util.checkin_via_barcode2(session,params,backdate,auto_print,check); 
+                                       var r = circ.util.checkin_via_barcode2(session,params,backdate,auto_print,check);
                                        if (typeof async == 'object') {
-                                               try { async.checkin_result(r); } catch(E) { error.sdump('D_ERROR','async.checkin_result() = ' + E); };
+                                               try { async.checkin_result(r); }
+                                               catch(E) { error.sdump('D_ERROR','async.checkin_result() = ' + E); };
                                        }
                                } catch(E) {
                                        JSAN.use('util.error'); var error = new util.error();
-                                       error.standard_unexpected_error_alert('Check In Failed (in circ.util.checkin): ',E);
+                                       error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedMessage('staff.circ.checkin.error', ['1']), E);
                                        if (typeof async == 'object') {
-                                               try { async.enable_textbox(); } catch(E) { error.sdump('D_ERROR','async.disable_textbox() = ' + E); };
+                                               try { async.enable_textbox(); }
+                                               catch(E) { error.sdump('D_ERROR','async.disable_textbox() = ' + E); };
                                        }
                                        return null;
                                }
                        } : null,
                        {
-                               'title' : 'Override Checkin Failure?',
-                               'overridable_events' : [ 
-                                       1203 /* COPY_BAD_STATUS */, 
+                               'title' : document.getElementById('circStrings').getString('staff.circ.utils.checkin.override'),
+                               'overridable_events' : [
+                                       1203 /* COPY_BAD_STATUS */,
                                        1213 /* PATRON_BARRED */,
                                        1217 /* PATRON_INACTIVE */,
                                        1224 /* PATRON_ACCOUNT_EXPIRED */,
                                        7009 /* CIRC_CLAIMS_RETURNED */,
-                                       7010 /* COPY_ALERT_MESSAGE */, 
-                                       7011 /* COPY_STATUS_LOST */, 
-                                       7012 /* COPY_STATUS_MISSING */, 
+                                       7010 /* COPY_ALERT_MESSAGE */,
+                                       7011 /* COPY_STATUS_LOST */,
+                                       7012 /* COPY_STATUS_MISSING */,
                                        7013 /* PATRON_EXCEEDS_FINES */,
                                ],
                                'text' : {
@@ -1043,24 +1906,24 @@ circ.util.checkin_via_barcode = function(session,params,backdate,auto_print,asyn
                                        },
                                        '7010' : function(r) {
                                                return r.payload;
-                                       },
+                                       }
                                }
                        }
                );
                if (!async) {
-                       return circ.util.checkin_via_barcode2(session,params,backdate,auto_print,check); 
+                       return circ.util.checkin_via_barcode2(session,params,backdate,auto_print,check);
                }
 
 
        } catch(E) {
                JSAN.use('util.error'); var error = new util.error();
-               error.standard_unexpected_error_alert('Check In Failed (in circ.util.checkin): ',E);
+               error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedMessage('staff.circ.checkin.error', ['2']), E);
                if (typeof async == 'object') {
                        try { async.enable_textbox(); } catch(E) { error.sdump('D_ERROR','async.disable_textbox() = ' + E); };
                }
                return null;
        }
-}
+};
 
 circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,check) {
        try {
@@ -1073,11 +1936,11 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
 
                check.message = check.textcode;
 
-               if (check.payload && check.payload.copy) check.copy = check.payload.copy;
-               if (check.payload && check.payload.record) check.record = check.payload.record;
-               if (check.payload && check.payload.circ) check.circ = check.payload.circ;
+               if (check.payload && check.payload.copy) { check.copy = check.payload.copy; }
+               if (check.payload && check.payload.record) { check.record = check.payload.record; }
+               if (check.payload && check.payload.circ) { check.circ = check.payload.circ; }
 
-               if (!check.route_to) check.route_to = '   ';
+               if (!check.route_to) { check.route_to = '   '; }
 
                if (document.getElementById('no_change_label')) {
                        document.getElementById('no_change_label').setAttribute('value','');
@@ -1085,13 +1948,13 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
                }
 
                if (check.circ) {
-                       network.simple_request('FM_MBTS_RETRIEVE',[ses(),check.circ.id()], function(req) {
+                       network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),check.circ.id()], function(req) {
                                JSAN.use('util.money');
                                var bill = req.getResultObject();
-                               if (Number(bill.balance_owed()) == 0) return;
+                               if (Number(bill.balance_owed()) == 0) { return; }
                                if (document.getElementById('no_change_label')) {
                                        var m = document.getElementById('no_change_label').getAttribute('value');
-                                       document.getElementById('no_change_label').setAttribute('value', m + 'Transaction for ' + params.barcode + ' billable $' + util.money.sanitize(bill.balance_owed()) + '  ');
+                                       document.getElementById('no_change_label').setAttribute('value', m + document.getElementById('circStrings').getFormattedString('staff.circ.utils.billable.amount', [params.barcode, util.money.sanitize(bill.balance_owed())]) + '  ');
                                        document.getElementById('no_change_label').setAttribute('hidden','false');
                                }
                        });
@@ -1100,111 +1963,169 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
                var msg = '';
 
                if (check.payload && check.payload.cancelled_hold_transit) {
-                       msg += 'Original hold for transit cancelled.\n\n';
+                       msg += document.getElementById('circStrings').getString('staff.circ.utils.transit_hold_cancelled');
+                       msg += '\n\n';
                }
 
                /* SUCCESS  /  NO_CHANGE  /  ITEM_NOT_CATALOGED */
                if (check.ilsevent == 0 || check.ilsevent == 3 || check.ilsevent == 1202) {
-                       try { check.route_to = data.lookup('acpl', check.copy.location() ).name(); } catch(E) { msg += 'Please inform your helpdesk/developers of this error:\nFIXME: ' + E + '\n'; }
+                       try { check.route_to = data.lookup('acpl', check.copy.location() ).name(); }
+                       catch(E) {
+                               msg += document.getElementById('commonStrings').getString('common.error');
+                               msg += '\nFIXME: ' + E + '\n';
+                       }
                        if (check.ilsevent == 3 /* NO_CHANGE */) {
                                //msg = 'This item is already checked in.\n';
                                if (document.getElementById('no_change_label')) {
                                        var m = document.getElementById('no_change_label').getAttribute('value');
-                                       document.getElementById('no_change_label').setAttribute('value',m + params.barcode + ' was already checked in.  ');
+                                       document.getElementById('no_change_label').setAttribute('value', m + document.getElementById('circStrings').getFormattedString('staff.circ.utils.item_checked_in', [params.barcode]) + '  ');
                                        document.getElementById('no_change_label').setAttribute('hidden','false');
                                }
                        }
                        if (check.ilsevent == 1202 /* ITEM_NOT_CATALOGED */ && check.copy.status() != 11) {
-                               msg = 'Please inform your helpdesk/developers of this error:\nFIXME -- ITEM_NOT_CATALOGED event but copy status is '
-                                       + (data.hash.ccs[ check.copy.status() ] ? data.hash.ccs[ check.copy.status() ].name() : check.copy.status().name() ) + '\n';
+                               var copy_status = (data.hash.ccs[ check.copy.status() ] ? data.hash.ccs[ check.copy.status() ].name() : check.copy.status().name() );
+                               msg = document.getElementById('commonStrings').getString('common.error');
+                               msg += '\nFIXME --';
+                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.item_not_cataloged', [copy_status]);
+                               msg + '\n';
                        }
-                       switch(check.copy.status()) {
+                       switch(Number(check.copy.status())) {
                                case 0: /* AVAILABLE */
                                case 7: /* RESHELVING */
-                                       if (msg) msg += 'This item needs to be routed to ' + check.route_to + '.\n';
+                                       if (msg) {
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
+                                               msg += '\n';
+                                       }
                                break;
                                case 8: /* ON HOLDS SHELF */
                                        check.route_to = 'HOLDS SHELF';
                                        if (check.payload.hold) {
                                                if (check.payload.hold.pickup_lib() != data.list.au[0].ws_ou()) {
-                                                       msg += 'Please inform your helpdesk/developers of this error:\nFIXME:  We should have received a ROUTE_ITEM\n';
+                                                       msg += document.getElementById('commonStrings').getString('common.error');
+                                                       msg += '\nFIXME: ';
+                                                       msg += document.getElementById('circStrings').getString('staff.circ.utils.route_item_error');
+                                                       msg += '\n';
                                                } else {
-                                                       msg += 'This item needs to be routed to ' + check.route_to + '.\n';
+                                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
+                                                       msg += '.\n';
                                                }
-                                       } else { 
-                                               msg += 'Please inform your helpdesk/developers of this error:\nFIXME: status of Holds Shelf, but no actual hold found.\n';
+                                       } else {
+                                               msg += document.getElementById('commonStrings').getString('common.error');
+                                               msg += '\nFIXME: ';
+                                               msg += document.getElementById('circStrings').getString('staff.circ.utils.route_item_status_error');
+                                               msg += '\n';
                                        }
-                                       JSAN.use('util.date'); 
+                                       JSAN.use('util.date');
                                        if (check.payload.hold) {
                                                JSAN.use('patron.util');
-                                               msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
-                                               msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
+                                               msg += '\n';
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [check.payload.copy.barcode()]);
+                                               msg += '\n';
+                                               var payload_title  = (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() );
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.title', [payload_title]);
+                                               msg += '\n';
                                                var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
-                                               msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + ' ' + au_obj.second_given_name() + '\n';
-                                               msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
-                                               if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
-                                               if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + (au_obj.email() ? au_obj.email() : '') + '\n';
-                                               msg += '\nRequest Date: ' + util.date.formatted_date(check.payload.hold.request_time(),'%F') + '\n';
+                                               msg += '\n';
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron',  [au_obj.family_name(), au_obj.first_given_name(), au_obj.second_given_name()]);
+                                               msg += '\n';
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [au_obj.card().barcode()]);
+                                               msg += '\n';
+                                               if (check.payload.hold.phone_notify()) {
+                                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.phone_notify', [check.payload.hold.phone_notify()]);
+                                                       msg += '\n';
+                                               }
+                                               if (check.payload.hold.email_notify()) {
+                                                       var payload_email = au_obj.email() ? au_obj.email() : '';
+                                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.email_notify', [payload_email]);
+                                                       msg += '\n';
+                                               }
+                                               msg += '\n';
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.request_date', [util.date.formatted_date(check.payload.hold.request_time(),'%F')]);
+                                               msg += '\n';
                                        }
                                        var rv = 0;
-                                       msg += 'Slip Date: ' + util.date.formatted_date(new Date(),'%F') + '\n';
-                                       if (!auto_print) rv = error.yns_alert_formatted(
-                                               msg,
-                                               'Hold Slip',
-                                               "Print",
-                                               "Don't Print",
-                                               null,
-                                               "Check here to confirm this message",
-                                               '/xul/server/skin/media/images/turtle.gif'
-                                       );
+                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.slip_date', [util.date.formatted_date(new Date(),'%F')]);
+                                       msg += '\n';
+                                       if (!auto_print) {
+                                               rv = error.yns_alert_formatted(
+                                                       msg,
+                                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip'),
+                                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.yes'),
+                                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.no'),
+                                                       null,
+                                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg'),
+                                                       '/xul/server/skin/media/images/turtle.gif'
+                                               );
+                                       }
                                        if (rv == 0) {
                                                try {
                                                        JSAN.use('util.print'); var print = new util.print();
                                                        msg = msg.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g,'<br/>');
                                                        print.simple( msg , { 'no_prompt' : true, 'content_type' : 'text/html' } );
                                                } catch(E) {
-                                                       dump('Please inform your helpdesk/developers of this error:\nFIXME: ' + E + '\n');
-                                                       alert('Please inform your helpdesk/developers of this error:\nFIXME: ' + E + '\n');
+                                                       var err_msg = document.getElementById('commonStrings').getString('common.error');
+                                                       err_msg += '\nFIXME: ' + E + '\n';
+                                                       dump(err_msg);
+                                                       alert(err_msg);
                                                }
                                        }
                                        msg = '';
                                        if (document.getElementById('no_change_label')) {
                                                var m = document.getElementById('no_change_label').getAttribute('value');
-                                               document.getElementById('no_change_label').setAttribute('value',m + params.barcode + ' has been captured for a hold.  ');
+                                               m += document.getElementById('circStrings').getFormattedString('staff.circ.utils.capture', [params.barcode]);
+                                               document.getElementById('no_change_label').setAttribute('value', m);
                                                document.getElementById('no_change_label').setAttribute('hidden','false');
                                        }
                                break;
                                case 6: /* IN TRANSIT */
                                        check.route_to = 'TRANSIT SHELF??';
-                                       msg += ("Please inform your helpdesk/developers of this error:\nFIXME -- I didn't think we could get here.\n");
+                                       msg += document.getElementById('commonStrings').getString('common.error');
+                                       msg += "\nFIXME -- I didn't think we could get here.\n";
                                break;
                                case 11: /* CATALOGING */
                                        check.route_to = 'CATALOGING';
                                        if (document.getElementById('do_not_alert_on_precat')) {
                                                var x = document.getElementById('do_not_alert_on_precat');
-                                               if (! x.checked) msg += 'This item needs to be routed to ' + check.route_to + '.';
+                                               if (! x.checked) {
+                                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
+                                               }
                                        } else {
-                                               msg += 'This item needs to be routed to ' + check.route_to + '.';
+                                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
                                        }
                                        if (document.getElementById('no_change_label')) {
                                                var m = document.getElementById('no_change_label').getAttribute('value');
-                                               document.getElementById('no_change_label').setAttribute('value',m + params.barcode + ' needs to be cataloged.  ');
+                                               var needs_cat = document.getElementById('circStrings').getFormattedString('staff.circ.utils.needs_cataloging', [params.barcode]);
+                                               document.getElementById('no_change_label').setAttribute('value', m + needs_cat + '  ');
                                                document.getElementById('no_change_label').setAttribute('hidden','false');
                                        }
                                break;
                                default:
-                                       msg += ('Please inform your helpdesk/developers of this error:\nFIXME -- this case "' + (data.hash.ccs[check.copy.status()] ? data.hash.ccs[check.copy.status()].name() : check.copy.status().name()) + '" is unhandled.\n');
-                                       msg += 'This item needs to be routed to ' + check.route_to + '.';
+                                       msg += document.getElementById('commonStrings').getString('common.error');
+                                       var copy_status = data.hash.ccs[check.copy.status()] ? data.hash.ccs[check.copy.status()].name() : check.copy.status().name();
+                                       msg += '\n';
+                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.copy_status.error', [copy_status]);
+                                       msg += '\n';
+                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
                                break;
                        }
-                       if (msg) error.yns_alert(msg,'Alert',null,'OK',null,"Check here to confirm this message");
-
+                       if (msg) {
+                               error.yns_alert(
+                                       msg,
+                                       document.getElementById('circStrings').getString('staff.circ.alert'),
+                                       null,
+                                       document.getElementById('circStrings').getString('staff.circ.utils.msg.ok'),
+                                       null,
+                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg')
+                               );
+                       }
                } else /* ROUTE_ITEM */ if (check.ilsevent == 7000) {
 
                        var lib = data.hash.aou[ check.org ];
                        check.route_to = lib.shortname();
-                       msg += 'Destination: ' + check.route_to + '.\n';
-                       msg += '\n' + lib.name() + '\n';
+                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.destination', [check.route_to]);
+                       msg += '\n\n';
+                       msg += lib.name();
+                       msg += '\n';
                        try {
                                if (lib.holds_address() ) {
                                        var a = network.simple_request('FM_AOA_RETRIEVE',[ lib.holds_address() ]);
@@ -1213,36 +2134,59 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
                                        if (a.street2()) msg += a.street2() + '\n';
                                        msg += (a.city() ? a.city() + ', ' : '') + (a.state() ? a.state() + ' ' : '') + (a.post_code() ? a.post_code() : '') + '\n';
                                } else {
-                                       msg += "We do not have a holds address for this library.\n";
+                                       msg += document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address');
+                                       msg += '\n';
                                }
                        } catch(E) {
-                               msg += 'Unable to retrieve mailing address.\n';
-                               error.standard_unexpected_error_alert('Unable to retrieve mailing address.',E);
+                               msg += document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address.error');
+                               msg += '\n';
+                               error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address.error'), E);
                        }
-                       msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
-                       msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
-                       msg += 'Author: ' + (check.payload.record ? check.payload.record.author() :check.payload.copy.dummy_author()  ) + '\n';
+                       msg += '\n';
+                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [check.payload.copy.barcode()]);
+                       msg += '\n';
+                       var payload_title  = (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() );
+                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.title', [payload_title]);
+                       msg += '\n';
+                       var payload_author = (check.payload.record ? check.payload.record.author() :check.payload.copy.dummy_author());
+                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.author', [payload_author]);
+                       msg += '\n';
                        JSAN.use('util.date');
                        if (check.payload.hold) {
                                JSAN.use('patron.util');
                                var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
-                               msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + ' ' + au_obj.second_given_name() + '\n';
-                               msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
-                               if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
-                               if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + (au_obj.email() ? au_obj.email() : '') + '\n';
-                               msg += '\nRequest Date: ' + util.date.formatted_date(check.payload.hold.request_time(),'%F');
+                               msg += '\n';
+                               document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron', [au_obj.family_name(), au_obj.first_given_name(), au_obj.second_given_name()]);
+                               msg += '\n';
+                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [au_obj.card().barcode()]);
+                               msg += '\n';
+                               if (check.payload.hold.phone_notify()) {
+                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.phone_notify', [check.payload.hold.phone_notify()]);
+                                       msg += '\n';
+                               }
+                               if (check.payload.hold.email_notify()) {
+                                       var payload_email = au_obj.email() ? au_obj.email() : '';
+                                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.email_notify', [payload_email]);
+                                       msg += '\n';
+                               }
+                               msg += '\n';
+                               msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.request_date', [util.date.formatted_date(check.payload.hold.request_time(),'%F')]);
+                               msg += '\n';
                        }
                        var rv = 0;
-                       msg += '\nSlip Date: ' + util.date.formatted_date(new Date(),'%F') + '\n';
-                       if (!auto_print) rv = error.yns_alert_formatted(
-                               msg,
-                               'Transit Slip',
-                               "Print",
-                               "Don't Print",
-                               null,
-                               "Check here to confirm this message",
-                               '/xul/server/skin/media/images/turtle.gif'
-                       );
+                       msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.slip_date', [util.date.formatted_date(new Date(),'%F')]);
+                       if (!auto_print) {
+                               rv = error.yns_alert_formatted(
+                                       msg,
+                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip'),
+                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.yes'),
+                                       document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.no'),
+                                       null,
+                                       document.getElementById('circStrings').getString('staff.circ.confirm.msg'),
+                                       '/xul/server/skin/media/images/turtle.gif'
+                               );
+                       }
+
                        if (rv == 0) {
                                try {
                                        JSAN.use('util.print'); var print = new util.print();
@@ -1250,46 +2194,50 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
                                        msg = msg.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g,'<br/>');
                                        print.simple( msg , { 'no_prompt' : true, 'content_type' : 'text/html' } );
                                } catch(E) {
-                                       dump('Please inform your helpdesk/developers of this error:\nFIXME: ' + E + '\n');
-                                       alert('Please inform your helpdesk/developers of this error:\nFIXME: ' + E + '\n');
+                                       var err_msg = document.getElementById('commonStrings').getString('common.error');
+                                       err_msg += '\nFIXME: ' + E + '\n';
+                                       dump(err_msg);
+                                       alert(err_msg);
                                }
                        }
                        if (document.getElementById('no_change_label')) {
                                var m = document.getElementById('no_change_label').getAttribute('value');
-                               document.getElementById('no_change_label').setAttribute('value',m + params.barcode + ' is in transit.  ');
+                               var trans_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.in_transit', [params.barcode]);
+                               document.getElementById('no_change_label').setAttribute('value', m + trans_msg + '  ');
                                document.getElementById('no_change_label').setAttribute('hidden','false');
                        }
 
                } else /* ASSET_COPY_NOT_FOUND */ if (check.ilsevent == 1502) {
 
                        check.route_to = 'CATALOGING';
+                       var mis_scan_msg = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [params.barcode]);
                        error.yns_alert(
-                               'The barcode was either mis-scanned or the item needs to be cataloged.',
-                               'Alert',
+                               mis_scan_msg,
+                               document.getElementById('circStrings').getString('staff.circ.alert'),
                                null,
-                               'OK',
+                               document.getElementById('circStrings').getString('staff.circ.utils.msg.ok'),
                                null,
-                               "Check here to confirm this message"
+                               document.getElementById('circStrings').getString('staff.circ.confirm.msg')
                        );
                        if (document.getElementById('no_change_label')) {
                                var m = document.getElementById('no_change_label').getAttribute('value');
-                               document.getElementById('no_change_label').setAttribute('value',m + params.barcode + ' is mis-scanned or not cataloged.  ');
+                               document.getElementById('no_change_label').setAttribute('value',m + mis_scan_msg + '  ');
                                document.getElementById('no_change_label').setAttribute('hidden','false');
                        }
 
                } else /* NETWORK TIMEOUT */ if (check.ilsevent == -1) {
-                       error.standard_network_error_alert('Check In Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface');
+                       error.standard_network_error_alert(document.getElementById('circStrings').getString('staff.circ.checkin.suggest_offline'));
                } else {
 
-                       switch (check.ilsevent) {
-                               case 1203 /* COPY_BAD_STATUS */ : 
+                       switch (Number(check.ilsevent)) {
+                               case 1203 /* COPY_BAD_STATUS */ :
                                case 1213 /* PATRON_BARRED */ :
                                case 1217 /* PATRON_INACTIVE */ :
                                case 1224 /* PATRON_ACCOUNT_EXPIRED */ :
                                case 7009 /* CIRC_CLAIMS_RETURNED */ :
-                               case 7010 /* COPY_ALERT_MESSAGE */ : 
-                               case 7011 /* COPY_STATUS_LOST */ : 
-                               case 7012 /* COPY_STATUS_MISSING */ : 
+                               case 7010 /* COPY_ALERT_MESSAGE */ :
+                               case 7011 /* COPY_STATUS_LOST */ :
+                               case 7012 /* COPY_STATUS_MISSING */ :
                                case 7013 /* PATRON_EXCEEDS_FINES */ :
                                        return null; /* handled */
                                break;
@@ -1302,10 +2250,10 @@ circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,che
                return check;
        } catch(E) {
                JSAN.use('util.error'); var error = new util.error();
-               error.standard_unexpected_error_alert('Check In Failed (in circ.util.checkin): ',E);
+               error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedMessage('staff.circ.checkin.error', ['3']), E);
                return null;
        }
-}
+};
 
 circ.util.renew_via_barcode = function ( barcode, patron_id, async ) {
        try {
@@ -1320,8 +2268,8 @@ circ.util.renew_via_barcode = function ( barcode, patron_id, async ) {
                        try {
                                var renew = req.getResultObject();
                                if (typeof renew.ilsevent != 'undefined') renew = [ renew ];
-                               for (var j = 0; j < renew.length; j++) { 
-                                       switch(renew[j].ilsevent) {
+                               for (var j = 0; j < renew.length; j++) {
+                                       switch(Number(renew[j].ilsevent)) {
                                                case 0 /* SUCCESS */ : break;
                                                case 5000 /* PERM_FAILURE */: break;
                                                case 1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */ : break;
@@ -1334,8 +2282,8 @@ circ.util.renew_via_barcode = function ( barcode, patron_id, async ) {
                                                case 7004 /* COPY_NOT_AVAILABLE */ : break;
                                                case 7006 /* COPY_IS_REFERENCE */ : break;
                                                case 7007 /* COPY_NEEDED_FOR_HOLD */ : break;
-                                               case 7008 /* MAX_RENEWALS_REACHED */ : break; 
-                                               case 7009 /* CIRC_CLAIMS_RETURNED */ : break; 
+                                               case 7008 /* MAX_RENEWALS_REACHED */ : break;
+                                               case 7009 /* CIRC_CLAIMS_RETURNED */ : break;
                                                case 7010 /* COPY_ALERT_MESSAGE */ : break;
                                                case 7013 /* PATRON_EXCEEDS_FINES */ : break;
                                                default:
@@ -1347,18 +2295,18 @@ circ.util.renew_via_barcode = function ( barcode, patron_id, async ) {
                                return renew;
                        } catch(E) {
                                JSAN.use('util.error'); var error = new util.error();
-                               error.standard_unexpected_error_alert('Renew Failed for ' + barcode,E);
+                               error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedMessage('staff.circ.checkin.renew_failed.error', [barcode]), E);
                                return null;
                        }
                }
 
                var renew = obj.network.simple_request(
-                       'CHECKOUT_RENEW', 
+                       'CHECKOUT_RENEW',
                        [ ses(), params ],
                        async ? renew_callback : null,
                        {
-                               'title' : 'Override Renew Failure?',
-                               'overridable_events' : [ 
+                               'title' : document.getElementById('circStrings').getMessage('staff.circ.checkin.renew_failed.override'),
+                               'overridable_events' : [
                                        1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */,
                                        1213 /* PATRON_BARRED */,
                                        1215 /* CIRC_EXCEEDS_COPY_RANGE */,
@@ -1367,40 +2315,40 @@ circ.util.renew_via_barcode = function ( barcode, patron_id, async ) {
                                        7004 /* COPY_NOT_AVAILABLE */,
                                        7006 /* COPY_IS_REFERENCE */,
                                        7007 /* COPY_NEEDED_FOR_HOLD */,
-                                       7008 /* MAX_RENEWALS_REACHED */, 
-                                       7009 /* CIRC_CLAIMS_RETURNED */, 
+                                       7008 /* MAX_RENEWALS_REACHED */,
+                                       7009 /* CIRC_CLAIMS_RETURNED */,
                                        7010 /* COPY_ALERT_MESSAGE */,
                                        7013 /* PATRON_EXCEEDS_FINES */,
                                ],
                                'text' : {
-                                       '1212' : function(r) { return 'Barcode: ' + barcode; },
-                                       '1213' : function(r) { return 'Barcode: ' + barcode; },
-                                       '1215' : function(r) { return 'Barcode: ' + barcode; },
-                                       '7002' : function(r) { return 'Barcode: ' + barcode; },
-                                       '7003' : function(r) { return 'Barcode: ' + barcode; },
+                                       '1212' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '1213' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '1215' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '7002' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '7003' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
                                        '7004' : function(r) {
-                                               return 'Barcode: ' + barcode + ' Status: ' + r.payload.status().name();
+                                               return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode.status', [barcode, r.payload.status().name()]);
                                        },
-                                       '7006' : function(r) { return 'Barcode: ' + barcode; },
-                                       '7007' : function(r) { return 'Barcode: ' + barcode; },
-                                       '7008' : function(r) { return 'Barcode: ' + barcode; },
-                                       '7009' : function(r) { return 'Barcode: ' + barcode; },
+                                       '7006' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '7007' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '7008' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
+                                       '7009' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); },
                                        '7010' : function(r) {
-                                               return 'Barcode: ' + barcode + ' Message: ' + r.payload;
+                                               return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode.msg', [barcode, r.payload]);
                                        },
-                                       '7013' : function(r) { return 'Barcode: ' + barcode; },
+                                       '7013' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [barcode]); }
                                }
                        }
                );
-               if (! async ) return renew_callback( { 'getResultObject' : function() { return renew; } } );
+               if (! async ) {
+                       return renew_callback( { 'getResultObject' : function() { return renew; } } );
+               }
 
        } catch(E) {
                JSAN.use('util.error'); var error = new util.error();
-               error.standard_unexpected_error_alert('Renew Failed for ' + barcode,E);
+               error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.renew_failed.error', [barcode]), E);
                return null;
        }
-}
-
-
+};
 
 dump('exiting circ/util.js\n');
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties b/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties
new file mode 100644 (file)
index 0000000..286252a
--- /dev/null
@@ -0,0 +1,101 @@
+staff.admin.font_settings.sound=Sound preference saved to file system.
+staff.admin.font_settings.save=Global Font saved to file system.
+staff.admin.font_settings.sound.disabled=Sound is now disabled.
+staff.admin.font_settings.sound.enabled=Sound is now enabled.
+staff.admin.font_settings.status_msg.ALL_FONTS_SMALLER=Global Font Adjust set to Smaller than Default
+staff.admin.font_settings.status_msg.ALL_FONTS_DEFAULT=Global Font Adjust set to Default
+staff.admin.font_settings.status_msg.ALL_FONTS_LARGER=Global Font Adjust set to Larger than Default
+staff.admin.font_settings.status_msg.ALL_FONTS_XX_SMALL=Global Font set to XX-Small
+staff.admin.font_settings.status_msg.ALL_FONTS_X_SMALL=Global Font set to X-Small
+staff.admin.font_settings.status_msg.ALL_FONTS_SMALL=Global Font set to Small
+staff.admin.font_settings.status_msg.ALL_FONTS_MEDIUM=Global Font set to Medium
+staff.admin.font_settings.status_msg.ALL_FONTS_LARGE=Global Font set to Large
+staff.admin.font_settings.status_msg.ALL_FONTS_X_LARGE=Global Font set to X-Large
+staff.admin.font_settings.status_msg.ALL_FONTS_XX_LARGE=Global Font set to XX-Large
+staff.admin.font_settings.status_msg.ALL_FONTS_5PT=Global Font set to 5pt
+staff.admin.font_settings.status_msg.ALL_FONTS_6PT=Global Font set to 6pt
+staff.admin.font_settings.status_msg.ALL_FONTS_7PT=Global Font set to 7pt
+staff.admin.font_settings.status_msg.ALL_FONTS_8PT=Global Font set to 8pt
+staff.admin.font_settings.status_msg.ALL_FONTS_9PT=Global Font set to 9pt
+staff.admin.font_settings.status_msg.ALL_FONTS_10PT=Global Font set to 10pt
+staff.admin.font_settings.status_msg.ALL_FONTS_11PT=Global Font set to 11pt
+staff.admin.font_settings.status_msg.ALL_FONTS_12PT=Global Font set to 12pt
+staff.admin.font_settings.status_msg.ALL_FONTS_13PT=Global Font set to 13pt
+staff.admin.font_settings.status_msg.ALL_FONTS_14PT=Global Font set to 14pt
+staff.admin.font_settings.status_msg.ALL_FONTS_15PT=Global Font set to 15pt
+staff.admin.font_settings.status_msg.ALL_FONTS_16PT=Global Font set to 16pt
+staff.admin.font_settings.status_msg.ALL_FONTS_17PT=Global Font set to 17pt
+staff.admin.font_settings.status_msg.ALL_FONTS_18PT=Global Font set to 18pt
+staff.admin.font_settings.status_msg.ALL_FONTS_DEFAULT=Global Font Adjust set to Default
+staff.admin.transit_list.missing_list=Missing library list.
+staff.admin.transit_list.no_match=No matching transits.
+staff.admin.transit_list.invalid_date=Invalid Date (%1$s), setting to Today
+staff.admin.transit_list.invalid_date_format=Invalid Date (%1$s,%2$s), setting to Today
+staff.admin.transit_list.date_processing.error=error processing date
+staff.admin.transit_list.retrieving_transit.error=error retrieving transits
+staff.admin.transit_list.preretrieving_transit.error=error pre-retrieving transits
+staff.admin.transit_list.retrieving_row.error=error retrieving row
+staff.admin.transit_list.empty_array.error=Empty array returned by hold retrieve.
+staff.admin.transit_list.retrieve_hold.error=retrieving hold id = %1$s for transit id = %2$s
+staff.admin.transit_list.transit_id.error=retrieving transit id = %1$s
+staff.admin.offline_manage_xacts.init_list.organization=Organization
+staff.admin.offline_manage_xacts.init_list.description=Description
+staff.admin.offline_manage_xacts.init_list.date_created=Date Created
+staff.admin.offline_manage_xacts.init_list.created_by=Created By
+staff.admin.offline_manage_xacts.init_list.upload_count=Upload Count
+staff.admin.offline_manage_xacts.init_list.transactions_processed=Transactions Processed
+staff.admin.offline_manage_xacts.init_list.processing=Processing?
+staff.admin.offline_manage_xacts.init_list.date_started=Date Started
+staff.admin.offline_manage_xacts.init_list.date_completed=Date Completed
+staff.admin.offline_manage_xacts.init_list.session=Session
+staff.admin.offline_manage_xacts.init_script_list.date_uploaded=Date Uploaded
+staff.admin.offline_manage_xacts.init_script_list.uploaded_by=Uploaded By
+staff.admin.offline_manage_xacts.init_script_list.time_delta=Server/Local Time Delta
+staff.admin.offline_manage_xacts.init_script_list.workstation=Workstation
+staff.admin.offline_manage_xacts.init_error_list.workstation=Workstation
+staff.admin.offline_manage_xacts.init_error_list.timestamp=Timestamp
+staff.admin.offline_manage_xacts.init_error_list.type=Type
+staff.admin.offline_manage_xacts.init_error_list.event_code=Event Code
+staff.admin.offline_manage_xacts.init_error_list.event_name=Event Name
+staff.admin.offline_manage_xacts.init_error_list.event_description=Event Description
+staff.admin.offline_manage_xacts.init_error_list.item_barcode=Item Barcode
+staff.admin.offline_manage_xacts.init_error_list.patron_barcode=Patron Barcode
+staff.admin.offline_manage_xacts.init_error_list.due_date=Due Date
+staff.admin.offline_manage_xacts.init_error_list.count=In House Use Count
+staff.admin.offline_manage_xacts.init_error_list.noncat=Non-Cataloged?
+staff.admin.offline_manage_xacts.init_error_list.noncat_type=Non-Cataloged Type
+staff.admin.offline_manage_xacts.init_error_list.noncat_count=Non-Cataloged Count
+staff.admin.offline_manage_xacts.init_error_list.backdate=Check In Backdate
+staff.admin.offline_manage_xacts.error.check_perm=Error checking permissions
+staff.admin.offline_manage_xacts.error.bad_cgi_response=Bad response from CGI component
+staff.admin.offline_manage_xacts.error.execute_error=Execute error:
+staff.admin.offline_manage_xacts.error.session_execute_error=Error executing session
+staff.admin.offline_manage_xacts.error.session_retrieval=Error retrieving session errors:
+staff.admin.offline_manage_xacts.error.non_existent_file=Can't rename a non-existent file
+staff.admin.offline_manage_xacts.error.renaming_file=Error renaming transaction file
+staff.admin.offline_manage_xacts.error.unique_file=Taking too long to find a unique filename.
+staff.admin.offline_manage_xacts.error.transaction_conflicts=Something bad happened.  New offline transactions were accumulated during our attempted upload.  Tell your system admin that the file involved is %1$s
+staff.admin.offline_manage_xacts.error.transaction_conflicts.title=Transaction conflicts
+staff.admin.offline_manage_xacts.error.transaction_conflicts.ok=Ok
+staff.admin.offline_manage_xacts.error.transaction_conflicts.confirm=Check here to confirm this message
+staff.admin.offline_manage_xacts.error.reverting_file=Error reverting transaction file
+staff.admin.offline_manage_xacts.error.archiving_file=Error archiving transaction file
+staff.admin.offline_manage_xacts.session_upload=Please select a session to upload to.
+staff.admin.offline_manage_xacts.single_session_upload=Please select a single session to upload to.
+staff.admin.offline_manage_xacts.no_transactions=No pending transactions to upload.
+staff.admin.offline_manage_xacts.error.uploading_file=There was an error:
+staff.admin.offline_manage_xacts.error.uploading_transactions=Error uploading transactions
+staff.admin.offline_manage_xacts.error.retrieving_session=Error retrieving session status
+staff.admin.offline_manage_xacts.create_session.prompt=Please enter a description:
+staff.admin.offline_manage_xacts.create_session=Create an Offline Transaction Session
+staff.admin.offline_manage_xacts.error.create_session=Error creating session
+staff.admin.offline_manage_xacts.error.create_session.alert=Error: %1$s
+staff.admin.offline_manage_xacts.error.retrieving_sessions=Error retrieving offline sessions.
+staff.admin.offline_manage_xacts.error.rendering_session=Error rendering session list
+staff.admin.offline_manage_xacts.upload_status=Uploaded Transactions for %1$s
+staff.admin.offline_manage_xacts.error.rendering_script=Error rendering script list
+staff.admin.offline_manage_xacts.error.rendering_errors=Exceptions for %1$s
+staff.admin.offline_manage_xacts.error.rendering_error_list=Error rendering error list
+staff.admin.offline_manage_xacts.completed=Completed
+staff.admin.offline_manage_xacts.no=No
+staff.admin.offline_manage_xacts.yes=Yes
index 8e61dc2..dd57a08 100644 (file)
@@ -1,2 +1,195 @@
 cat.barcode_for_item=The barcode for the item is %1$s
 cat.batch_operation_failed=The whole batch operation failed. %1$s
+cat.copy_buckets.tab=Copy Buckets
+cat.total_bucket_items_in_bucket=Contains %1$s bucket items
+cat.results_returned=Returning %1$s hits
+staff.cat.bib_brief.record_id=Record ID = %1$s
+staff.cat.bib_brief.deleted=(Deleted)
+staff.cat.bib_brief.inactive=(Inactive)
+staff.cat.bib_brief.noncat=(Not Cataloged)
+staff.cat.bib_brief.noncat.alert=Item not cataloged.
+staff.cat.copy_browser.add_item.title=Add Item
+staff.cat.copy_browser.add_item.error=copy browser -> add copies
+staff.cat.copy_browser.add_items_bucket.error=copy browser -> add copies to bucket
+staff.cat.copy_browser.replace_barcode.failed=Barcode %1$s not likely replaced.
+staff.cat.copy_browser.replace_barcode.error=copy browser -> replace barcode
+staff.cat.copy_browser.edit_items.error=Copy Browser -> Edit Items
+staff.cat.copy_browser.delete_items.confirm.plural=Are you sure you would like to delete these %1$s items?
+staff.cat.copy_browser.delete_items.confirm=Are you sure you would like to delete this item?
+staff.cat.copy_browser.delete_items.title=Delete Items?
+staff.cat.copy_browser.delete_items.delete=Delete
+staff.cat.copy_browser.delete_items.cancel=Cancel
+staff.cat.copy_browser.delete_items.override=Override Delete Failure?
+staff.cat.copy_browser.delete_items.complete=Action complete.
+staff.cat.copy_browser.delete_items.error=copy browser -> delete items
+staff.cat.copy_browser.print_spine.tab=Spine Labels
+staff.cat.copy_browser.print_spine.error=copy browser -> Spine Labels
+staff.cat.copy_browser.add_volume.permission_error=You do not have permission to add volumes to that library.
+staff.cat.copy_browser.add_volume.title=Add Volume/Item
+staff.cat.copy_browser.add_volume.error=copy browser -> add volumes
+staff.cat.copy_browser.edit_volume.permission_error=You don't have permission to edit this volume.
+staff.cat.copy_browser.edit_volume.title=Volume
+staff.cat.copy_browser.edit_volume.title.plural=Volumes
+staff.cat.copy_browser.edit_volume.failed=Edit failed:  You tried to change a volume's callnumber to one that is already in use for the given library.  You should transfer the items to the desired callnumber instead.
+staff.cat.copy_browser.edit_volume.success=Volumes modified.
+staff.cat.copy_browser.edit_volume.error=volume update error: 
+staff.cat.copy_browser.edit_volume.exception=Copy Browser -> Volume Edit
+staff.cat.copy_browser.delete_volume.prompt=Are you sure you would like to delete this volume?
+staff.cat.copy_browser.delete_volume.prompt.plural=Are you sure you would like to delete these %1$s volumes?
+staff.cat.copy_browser.delete_volume.title=Delete Volumes?
+staff.cat.copy_browser.delete_volume.delete=Delete
+staff.cat.copy_browser.delete_volume.cancel=Cancel
+staff.cat.copy_browser.delete_volume.override=Override Delete Failure?
+staff.cat.copy_browser.delete_volume.copies_remain=You must delete all the copies on the volume before you may delete the volume itself.
+staff.cat.copy_browser.delete_volume.success=Volumes deleted.
+staff.cat.copy_browser.delete_volume.exception=copy browser -> delete volumes
+staff.cat.copy_browser.mark_library.alert=Library + Record marked as Volume Transfer Destination
+staff.cat.copy_browser.mark_library.prompt=Choose just one Library to mark as Volume Transfer Destination
+staff.cat.copy_browser.mark_library.title=Limit Selection
+staff.cat.copy_browser.mark_volume.alert=Volume marked as Item Transfer Destination
+staff.cat.copy_browser.mark_volume.prompt=Choose just one Volume to mark as Item Transfer Destination
+staff.cat.copy_browser.mark_volume.title=Limit Selection
+staff.cat.copy_browser.transfer_volume.alert=Please mark a library as the destination from within holdings maintenance and then try this again.
+staff.cat.copy_browser.transfer.prompt=Transfer volumes %1$s to library %2$s on the following record?
+staff.cat.copy_browser.transfer.submit.label=Transfer
+staff.cat.copy_browser.transfer.cancel.label=Cancel
+staff.cat.copy_browser.transfer.cancel.accesskey=C
+staff.cat.copy_browser.transfer.title=Volume Transfer
+staff.cat.copy_browser.transfer.incomplete=Transfer Aborted
+staff.cat.copy_browser.transfer.override.failure=Override Volume Transfer Failure?
+staff.cat.copy_browser.transfer.ineligible_destination=That destination cannot have volumes.
+staff.cat.copy_browser.transfer.success=Volumes transferred.
+staff.cat.copy_browser.transfer.unexpected_error=All volumes not likely transferred.
+staff.cat.copy_browser.transfer_items.missing_volume=Please mark a volume as the destination from within holdings maintenance and then try this again.
+staff.cat.copy_browser.transfer_items.unexpected_error=All copies not likely transferred.
+staff.cat.copy_browser.missing_library=Missing library list.
+staff.cat.copy_browser.consortial_copy_count.error=Error retrieving consortial copy count.
+staff.cat.copy_browser.list_init.tree_location=Location/Barcode
+staff.cat.copy_browser.list_init.volume_count=Volumes
+staff.cat.copy_browser.list_init.copy_count=Copies
+staff.cat.copy_browser.actions.error=Copy Browser Actions
+staff.cat.copy_browser.refresh_list.error=Problem refreshing the volume/copy tree.
+staff.cat.copy_buckets.render_pending_copies.complete=Action completed.
+staff.cat.copy_buckets.retrieve_row.error=Error retrieving details for item with copy id = %1$s
+staff.cat.copy_buckets.menulist.render.choose_bucket=Choose a bucket...
+staff.cat.copy_buckets.menulist.render.retrieve_bucket=Retrieve shared bucket...
+staff.cat.copy_buckets.menulist.change_bucket.prompt=Enter bucket number:
+staff.cat.copy_buckets.menulist.change_bucket.undefined=Could not find a bucket with ID = %1$s
+staff.cat.copy_buckets.menulist.change_bucket.error=Error retrieving bucket.  Did you use a valid bucket id?
+staff.cat.copy_buckets.copy_buckets_add.error=Addition likely failed.
+staff.cat.copy_buckets.copy_buckets_sel_add.error=Addition likely failed.
+staff.cat.copy_buckets.copy_buckets_delete_item.error=Deletion likely failed.
+staff.cat.copy_buckets.copy_buckets_delete_item.complete=Action completed.
+staff.cat.copy_buckets.copy_buckets_delete_bucket.confirm=Delete the bucket named %1$s?
+staff.cat.copy_buckets.copy_buckets_delete_bucket.complete=Action completed.
+staff.cat.copy_buckets.copy_buckets_delete_bucket.error=Bucket deletion likely failed.
+staff.cat.copy_buckets.copy_buckets_new_bucket.prompt=What would you like to name the bucket?
+staff.cat.copy_buckets.copy_buckets_new_bucket.title=Bucket Creation
+staff.cat.copy_buckets.copy_buckets_new_bucket.container_exists=You already have a bucket with that name.
+staff.cat.copy_buckets.copy_buckets_new_bucket.success=Bucket "%1$s" created.
+staff.cat.copy_buckets.copy_buckets_new_bucket.error=Bucket creation failed.
+staff.cat.copy_buckets.batch.error=Batch Item Deletion
+staff.cat.copy_buckets.copy_buckets_transfer_to_volume.no_volume=Please mark a volume as the destination from within the copy browser and then try this again.
+staff.cat.copy_buckets.copy_buckets_transfer_to_volume.confirm=Transfer the items in bucket "%1$s" from their original volumes to the volume labelled "%2$s" for the library "%3$s" on the following record?
+staff.cat.copy_buckets.copy_buckets_transfer_to_volume.error=Items not likely transferred.
+staff.cat.copy_buckets.cmd_export_to_copy_status.error=Copy Status from Copy Buckets
+staff.cat.copy_buckets.prep_item_for_list.error=List building failed.
+staff.cat.copy_buckets_quick.bucket_prompt=Copy this item into which bucket?
+staff.cat.copy_buckets_quick.bucket_prompt.plural=Copy these %1$s items into which bucket?
+staff.cat.copy_buckets_quick.copy_buckets_new_bucket.prompt=What would you like to name the bucket?
+staff.cat.copy_buckets_quick.copy_buckets_new_bucket.title=Bucket Creation
+staff.cat.copy_buckets_quick.copy_buckets_new_bucket.error=Bucket creation failed.
+staff.cat.copy_buckets_quick.addition.error=Addition likely failed for bucket = %1$s and copy ID = %2$s.
+staff.cat.copy_editor.caption=Copy Editor
+staff.cat.copy_editor.create_copies=Create Copies
+staff.cat.copy_editor.status=Status
+staff.cat.copy_editor.retrieve_templates.error=Error retrieving templates
+staff.cat.copy_editor.apply_templates.error=Error applying template
+staff.cat.copy_editor.save_as_template.prompt=Enter template name:
+staff.cat.copy_editor.save_as_template.title=Save As Template
+staff.cat.copy_editor.save_as_template.success=Template "%1$s" saved.
+staff.cat.copy_editor.save_as_template.error=Error saving template
+staff.cat.copy_editor.delete_template.confirm=Delete template "%1$s"?
+staff.cat.copy_editor.delete_template.success=Template "%1$s" deleted.
+staff.cat.copy_editor.delete_template.error=Error deleting template
+staff.cat.copy_editor.export_templates.title=Save Templates File As
+staff.cat.copy_editor.export_templates.error=Error exporting templates
+staff.cat.copy_editor.import_templates.title=Import Templates File
+staff.cat.copy_editor.import_templates.replace.prompt=Replace the existing template with the imported template?
+staff.cat.copy_editor.import_templates.replace.title=Template %1$s already exists.
+staff.cat.copy_editor.import_templates.replace.yes=Yes
+staff.cat.copy_editor.import_templates.replace.no=No
+staff.cat.copy_editor.import_templates.replace.click_here=Click here
+staff.cat.copy_editor.import_templates.save.prompt=Save all of these imported templates permanently to this account?
+staff.cat.copy_editor.import_templates.save.title=Final warning
+staff.cat.copy_editor.import_templates.save.yes=Yes
+staff.cat.copy_editor.import_templates.save.no=No
+staff.cat.copy_editor.import_templates.save.click_here=Click here
+staff.cat.copy_editor.import_templates.save.success=All templates saved.
+staff.cat.copy_editor.import_templates.save.error=Error saving templates
+staff.cat.copy_editor.import_templates.note=Note: These imported templates will get saved along with any new template you try to create, but if that does not happen, then these templates will disappear with the next invocation of the item attribute editor.
+staff.cat.copy_editor.import_templates.error=Error importing templates
+staff.cat.copy_editor.apply_owning_lib.undefined_volume.error=Error retrieving Volume information for copy %1$s.  The owning library for this copy will not be changed.
+staff.cat.copy_editor.apply_owning_lib.call_number.error=Error changing owning library for copy %1$s.  The owning library for this copy will not be changed.
+staff.cat.copy_editor.copy_count=1 copy
+staff.cat.copy_editor.copy_count.plural=%1$s copies
+staff.cat.copy_editor.apply.label=Apply
+staff.cat.copy_editor.apply.accesskey=A
+staff.cat.copy_editor.cancel.label=Cancel
+staff.cat.copy_editor.handle_update.success=Items were added or modified.
+staff.cat.copy_editor.handle_update.error=copy update error:
+staff.cat.copy_editor.add_stat_cat.error=Error adding statistical category to display definition
+staff.cat.copy_editor.populate_stat_cat.error=Error populating statistical categories for display
+staff.cat.copy_notes.render_notes.label=Add New Note
+staff.cat.copy_notes.render_notes.accesskey=A
+staff.cat.copy_notes.widgets_apply.note_id=Note ID:
+staff.cat.copy_notes.widgets_apply.creator_id=Creator ID:
+staff.cat.copy_notes.widgets.public=Public
+staff.cat.copy_notes.widgets.private=Private
+staff.cat.copy_notes.delete_note.label=Delete This Note
+staff.cat.copy_notes.delete_note.prompt.msg=Delete the note titled "%1$s" created on %2$s?
+staff.cat.copy_notes.delete_note.prompt.title=Delete Note
+staff.cat.copy_notes.delete_note.prompt.yes=Yes
+staff.cat.copy_notes.delete_note.prompt.no=No
+staff.cat.copy_notes.delete_note.success=Note deleted.
+staff.cat.copy_notes.delete_note.close_window=Close Window
+staff.cat.copy_notes.new_note.label=New Note
+staff.cat.copy_notes.new_note.public=Public?
+staff.cat.copy_notes.new_note.title=Title
+staff.cat.copy_notes.new_note.note=Note
+staff.cat.copy_notes.new_note.cancel.label=Cancel
+staff.cat.copy_notes.new_note.cancel.accesskey=C
+staff.cat.copy_notes.new_note.add_note.label=Add Note
+staff.cat.copy_notes.new_note.add_note.accesskey=A
+staff.cat.copy_notes.new_note.success=Note added.
+staff.cat.copy_notes.new_note.error=The note was not likely created.
+staff.cat.copy_summary.copy_id=Copy ID = %1$s
+staff.cat.copy_summary.total_circs.label=Total Circs
+staff.cat.copy_summary.yes=Yes
+staff.cat.copy_summary.no=No
+staff.cat.copy_summary.unset=<Unset>
+staff.cat.copy_summary.not_cataloged=Not Cataloged
+staff.cat.marcedit.help.add_row=Add Row: CTRL+Enter
+staff.cat.marcedit.help.insert_row=Insert Row: CTRL+Shift+Enter
+staff.cat.marcedit.help.add_subfield=Add Subfield: CTRL+D
+staff.cat.marcedit.help.remove_row=Remove Row: CTRL+Del
+staff.cat.marcedit.help.remove_subfield=Remove Subfield: SHIFT+Del
+staff.cat.marcedit.help.replace_006=Create/Replace 006: CTRL+F6
+staff.cat.marcedit.help.replace_007=Create/Replace 007: CTRL+F7
+staff.cat.marcedit.help.replace_008=Create/Replace 008: CTRL+F8
+staff.cat.marcedit.save.label=Save Record
+staff.cat.marcedit.marcTag.LDR.label=MARC Leader
+staff.cat.marcedit.add_row.label=Add Row
+staff.cat.marcedit.remove_row.label=Remove Row
+staff.cat.marcedit.replace_006.label=Add/Replace 006
+staff.cat.marcedit.replace_007.label=Add/Replace 007
+staff.cat.marcedit.replace_008.label=Add/Replace 008
+staff.cat.marcedit.not_authority_field.label=Not a controlled subfield
+staff.cat.marcedit.apply_selected.label=Apply Selected
+staff.cat.marcedit.no_authority_match.label=No matching authority records found
+staff.cat.marc_new.create_record.label=Create Record
+staff.cat.marc_new.system_local.label=System Local
+staff.cat.marc_new.record_created.label=Record created.
+staff.cat.marc_new.retrieving.label=Retrieving title...
+staff.cat.marc_new.creating_record.error=Error creating MARC record.
+staff.cat.marc_new.loading_template.error=Error loading MARC template: %1$s
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties b/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
new file mode 100644 (file)
index 0000000..f72d87e
--- /dev/null
@@ -0,0 +1,336 @@
+staff.circ.alert=Alert
+staff.circ.item_no_circs=Item %1$s has never circulated.
+staff.circ.invalid_date=Invalid Date
+staff.circ.future_date=Future Date
+staff.circ.process_item=Check In / Process Item
+staff.circ.backdated_checkin=Backdated %1$s Check In
+staff.circ.backdate.exception=Problem setting backdate: %1$s
+staff.circ.unimplemented=Not Yet Implemented
+staff.circ.check_digit.bad=Bad check digit, possibly due to a bad scan.  Use this barcode ("%1$s") anyway?
+staff.circ.barcode.bad=Bad Barcode
+staff.circ.cancel=Cancel
+staff.circ.barcode.accept=Accept Barcode
+staff.circ.confirm=Check here to confirm this action
+staff.circ.confirm.msg=Check here to confirm this message.
+# If we know the name of the object, we could parameterize that as well
+staff.circ.checkin.exception=Something went wrong in circ.util.checkin: %1$s
+staff.circ.checkin2.exception=Something went wrong in circ.util.checkin2: %1$s
+staff.circ.checkin.exception.external=circ.checkin: Calling external .on_checkin()
+staff.circ.checkin2.exception.external=circ.checkin2: Calling external .on_checkin()
+staff.circ.checkin.exception.no_external=circ.checkin: Calling external .on_checkin()
+staff.circ.checkin2.exception.no_external=circ.util.checkin2: No external .on_failure()
+staff.circ.util.checkin.exception.external=circ.util.checkin: Calling external .on_checkin()
+staff.circ.util.checkin.exception.no_external=circ.util.checkin: Calling external .on_checkin()
+staff.circ.checkout.sorting.exception=error in sorting non-cataloged items: %1$s
+staff.circ.checkout.date.exception=Use this format: YYYY-MM-DD
+staff.circ.checkout.unimplemented=Not Yet Implemented
+staff.circ.checkout.cmd_checkout_submit.msg=Enter the number of %1$s circulating:
+staff.circ.checkout.cmd_checkout_submit.title=Non-cataloged Items
+staff.circ.checkout.cmd_checkout_submit.too_many.msg=You tried to circulate %1$d %2$s.  The maximum is 99 per action.
+staff.circ.checkout.cmd_checkout_submit.too_many.title=Non-cataloged Circulation
+staff.circ.checkout.ok.btn=OK
+staff.circ.checkout.cmd_checkout_submit.confirm.msg=Are you sure you want to circulate %1$d %2$s?
+staff.circ.checkout.cmd_checkout_submit.confirm.title=Non-cataloged Circulation
+staff.circ.checkout.yes.btn=Yes
+staff.circ.checkout.no.btn=No
+staff.circ.checkout.cmd_checkout_submit.non_numeric.msg=Error with non-cataloged checkout.  %1$s is not a valid number.
+staff.circ.checkout.cmd_checkout_submit.non_numeric.title=Non-cataloged Circulation
+staff.circ.checkout.disable.error=Error determining whether to disable checkout.
+staff.circ.checkout.date.too_early.error=Due date needs to be after today.
+staff.circ.checkout.barcode.failed= %1$s failed.
+staff.circ.checkout.non_cataloged.pending=Non-cataloged checkout pending...
+staff.circ.checkout.barcode.pending=%1$s checkout pending...
+staff.circ.checkout.barcode.failed.alert=Check Out Failed %1$s
+staff.circ.checkout.override.confirm=Override Checkout Failure?
+staff.circ.checkout.not_cataloged.confirm=Mis-scan or non-cataloged item.  Checkout as a pre-cataloged item?
+staff.circ.pre_cataloged=Pre-cataloged
+staff.circ.non_cataloged=Non-cataloged
+staff.circ.checkout.cancelled=Checkout cancelled
+staff.circ.checkout.card.inactive=The card used to retrieve this account is inactive and may not be used to circulate items.
+staff.circ.checkout.barcode.check_out_failed=Check Out Failed
+staff.circ.checkout.account.inactive=This account is inactive and may not circulate items.
+staff.circ.checkout.account.expired=This account has expired and may not circulate items.
+staff.circ.checkout.item_due=This item was due on %1$s.
+staff.circ.checkout.normal_checkin_then_checkout=Normal Checkin then Checkout
+staff.circ.checkout.forgiving_checkin_then_checkout=Forgiving Checkin then Checkout
+staff.circ.checkout.abort_transit_then_checkout=Abort Transit then Checkout
+staff.circ.checkout.network_failure=There was a network failure.
+staff.circ.checkout.copy_status=Copy status = %1$s
+staff.circ.checkout.alert_message=Alert Message = %1$s
+staff.circ.checkout.permission_denied=Permission Denied = %1$s
+# "Circulation" - check &staff.main.menu.circ.label; in lang.dtd
+# "Offline Interface" - check &staff.main.menu.circ.offline.label; in lang.dtd
+staff.circ.checkout.suggest_offline=Check Out Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface
+staff.circ.checkout.barcode=Barcode:
+staff.circ.circ_brief.staff_out_id=Check Out Staff ID = %1$s
+staff.circ.circ_brief.staff_in_id=Check In Staff ID = %1$s
+staff.circ.circ_brief.failure=Failure rendering circulation.
+staff.circ.copy_details.hold=Hold ID = %1$s
+staff.circ.copy_details.transit=Transit ID = %1$s
+staff.circ.copy_details.circ=Circulation ID = %1$s
+staff.circ.copy_details.last_circ=Last Circulation
+staff.circ.copy_details.current_circ=Current Circulation
+staff.circ.copy_details.no_circ=This item has yet to circulate.
+staff.circ.copy_details.not_transit=This item is not in transit.
+# Displays user info: "Family name, First name : Barcode"
+staff.circ.copy_details.user_details=%1$s, %2$s : %3$s
+staff.circ.copy_details.bad_hold_status=This item is not captured for a hold, however its status is incorrectly set to "On Holds Shelf".  Please check this item in to correct the status.
+staff.circ.copy_details.no_hold=This item is not captured for a hold.
+staff.circ.copy_status.tab_name=Item Status
+staff.circ.copy_status.action.complete=Action complete.
+staff.circ.copy_status.sel_checkin.error=Checkin did not likely happen.
+staff.circ.copy_status.cmd_replace_barcode.error=Barcode %1$s was not likely replaced.
+staff.circ.copy_status.cmd_replace_barcodes.error=Barcode replacements did not likely happen.
+staff.circ.copy_status.sel_edit.error=with copy editor
+staff.circ.copy_status.sel_renew.not_circulating=Item with barcode %1$s is not circulating.
+staff.circ.copy_status.upload_file.title=Import Barcode File
+staff.circ.copy_status.upload_file.complete=File uploaded.
+staff.circ.copy_status.upload_file.no_barcodes=No barcodes found in file.
+staff.circ.copy_status.add_items.title=Add Item for record # %1$s
+staff.circ.copy_status.del_items.confirm=Are you sure sure you want to delete these items? %1$s
+staff.circ.copy_status.del_items.title=Override Delete Failure?
+staff.circ.copy_status.del_items.success=Items Deleted
+staff.circ.copy_status.del_items.success.error=Batch Item Deletion
+staff.circ.copy_status.transfer_items.mark_destination=Please mark a volume as the destination and then try this again.
+staff.circ.copy_status.transfer_items.problem=All copies not likely transferred.
+staff.circ.copy_status.add_volumes.perm_failure=You don't have permission to add volumes to that library.
+staff.circ.copy_status.add_volumes.title=Add Volume/Item for Record # %1$s
+staff.circ.copy_status.edit_volumes.perm_failure=You don't have permission to edit this volume.
+staff.circ.copy_status.edit_volume.title=Volume for record # %1$s
+staff.circ.copy_status.edit_volumes.title=Volumes for record # %1$s
+staff.circ.copy_status.edit_volumes.duplicate=Edit failed:  You tried to change a volume's callnumber to one that is already in use for the given library.  You should transfer the items to the desired callnumber instead.
+staff.circ.copy_status.edit_volumes.success=Volumes modified.
+staff.circ.copy_status.delete_volumes.singular=Are you sure you would like to delete this volume?
+staff.circ.copy_status.delete_volumes.plural=Are you sure you would like to delete these volumes?
+staff.circ.copy_status.delete_volumes.title=Delete Volumes?
+staff.circ.copy_status.delete_volumes.delete=Delete
+staff.circ.copy_status.delete_volumes.cancel=Cancel
+staff.circ.copy_status.delete_volumes.override=Override Delete Failure?
+staff.circ.copy_status.delete_volumes.delete_copies=You must delete all the copies on the volume before you may delete the volume itself.
+staff.circ.copy_status.delete_volumes.success=Volumes deleted.
+staff.circ.copy_status.mark_volume.status=Volume marked as Item Transfer Destination
+staff.circ.copy_status.mark_volume.prompt=Choose just one Volume to mark as Item Transfer Destination
+staff.circ.copy_status.mark_volume.title=Limit Selection
+staff.circ.copy_status.ok=OK
+staff.circ.copy_status.mark_library=Library and Record marked as Volume Transfer Destination
+staff.circ.copy_status.mark_library.limit_one=Choose just one Library to mark as Volume Transfer Destination
+staff.circ.copy_status.mark_library.limit_one.title=Limit Selection
+staff.circ.copy_status.transfer_volume.none=Please mark a library as the destination from within holdings maintenance and then try this again.
+staff.circ.copy_status.transfer_volume.confirm=Transfer volumes %1$s to library %2$s on the following record?
+staff.circ.copy_status.transfer_volume.transfer.label=Transfer
+staff.circ.copy_status.transfer_volume.cancel.label=Cancel
+staff.circ.copy_status.transfer_volume.cancel.accesskey=C
+staff.circ.copy_status.transfer_volume.title=Volume Transfer
+staff.circ.copy_status.transfer_volume.aborted=Transfer Aborted
+staff.circ.copy_status.transfer_volume.override_failure=Override Volume Transfer Failure?
+staff.circ.copy_status.transfer_volume.cannot_have_vols=That destination cannot have volumes.
+staff.circ.copy_status.transfer_volume.success=Volumes transferred.
+staff.circ.copy_status.transfer_volume.error=All volumes not likely transferred.
+staff.circ.copy_status.test_barcode.prompt=Bad check digit, possibly due to a bad scan.  Use this barcode ("%1$s") anyway?
+staff.circ.copy_status.status.null_result=Something weird happened.  Result was null.
+staff.circ.copy_status.status.copy_not_found=%1$s was either mis-scanned or is not cataloged.
+staff.circ.copy_status.status.not_cataloged=Not Cataloged
+staff.circ.copy_status.status.pre_cat=Item is a pre-cataloged item.
+staff.circ.copy_status.status.hold=Item is captured for a Hold.
+staff.circ.copy_status.status.transit=Item is in Transit.
+staff.circ.copy_status.status.circ=Item is circulating.
+staff.circ.hold_capture.print.to_printer=To Printer
+# pad this with whitespace to align with the rest of the staff.circ.hold_capture.print.* entries
+staff.circ.hold_capture.print.barcode= Barcode:
+# pad this with whitespace to align with the rest of the staff.circ.hold_capture.print.* entries
+staff.circ.hold_capture.print.title=   Title:
+# pad this with whitespace to align with the rest of the staff.circ.hold_capture.print.* entries
+staff.circ.hold_capture.print.author=  Author:
+# pad this with whitespace to align with the rest of the staff.circ.hold_capture.print.* entries
+staff.circ.hold_capture.print.route_to=Route to:
+# pad this with whitespace to align with the rest of the staff.circ.hold_capture.print.* entries
+staff.circ.hold_capture.print.patron=  Patron:
+staff.circ.hold_capture.calling_external=circ.hold_capture: Calling external .on_hold_capture()
+staff.circ.hold_capture.no_external=circ.hold_capture: No external .on_hold_capture()
+staff.circ.hold_capture.capture_failed=Could not capture hold.
+staff.circ.hold_capture.error=FIXME: need special alert and error handling
+staff.circ.in_house_use.tab_name=In-House Use
+staff.circ.in_house_use.barcode=Barcode:
+staff.circ.in_house_use.noncat_sort_error=error in noncat sorting:
+staff.circ.in_house_use.noncataloged=Non-Cataloged
+staff.circ.in_house_use.items_dump=items = 
+staff.circ.in_house_use.confirm_multiple=Are you sure you want to mark %1$s as having been used %2$s times?
+staff.circ.in_house_use.confirm_multiple.title=In-House Use Verification
+staff.circ.in_house_use.yes=Yes
+staff.circ.in_house_use.no=No
+# adjust Circulation -> Offline Interface to match your translation in lang.dtd
+staff.circ.in_house_use.failed.verbose=In House Use Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface
+staff.circ.in_house_use.failed=In House Use Failed
+staff.circ.in_house_use.ok=OK
+staff.circ.in_house_use.external=circ.in_house_use: Calling external .on_in_house_use()
+staff.circ.in_house_use.no_external=circ.in_house_use: No external .on_in_house_use()
+staff.circ.in_house_use.on_failure.external=circ.in_house_use: Calling external .on_failure()
+staff.circ.in_house_use.on_failure.no_external=circ.in_house_use: No external .on_failure()
+staff.circ.print_list_template.window.title=Template Macros
+staff.circ.print_list_template.window.heading=General:
+staff.circ.print_list_template.window.template_type=For type: %1$s
+staff.circ.print_list_template.window.close=Close Window
+staff.circ.print_list_template.preview=preview: 
+staff.circ.print_list_template.save=Template Saved
+staff.circ.print_list_template.save_as=Save Templates File As
+staff.circ.print_list_template.export.error=Error exporting templates
+staff.circ.print_list_template.import=Import Templates File
+staff.circ.print_list_template.import_results=Imported these templates: %1$s
+staff.circ.print_list_template.reload=Please reload this interface.
+staff.circ.print_list_template.import.error=Error exporting templates
+staff.circ.print_list_template.tab_name=Receipt Template Editor
+staff.circ.utils.abort_transits.confirm=Are you sure you would like to abort transits for copies: %1$s?
+staff.circ.utils.abort_transits.title=Aborting Transits
+staff.circ.utils.yes=Yes
+staff.circ.utils.no=No
+staff.circ.utils.abort_transits.not_allowed=Copy Id = %1$s
+staff.circ.utils.abort_transits.not_found=This item was no longer in transit at the time of the abort.  Perhaps this happened from a stale display?
+staff.circ.utils.abort_transits.unexpected_error=Transit not likely aborted.
+staff.circ.utils.retrieve_patron.failure=Problem retrieving patron.
+staff.circ.utils.retrieve_copy.failure=Problem retrieving copy details.
+staff.circ.utils.retrieve_circs.failure=Problem retrieving circulations.
+staff.circ.utils.offline.timestamp=Timestamp
+staff.circ.utils.offline.checkout_time=Check Out Time
+staff.circ.utils.offline.type=Transaction Type
+staff.circ.utils.offline.noncat=Non-Cataloged?
+staff.circ.utils.offline.noncat_type=Non-Cataloged Type ID
+staff.circ.utils.offline.count=Count
+staff.circ.utils.offline.patron_barcode=Patron Barcode
+staff.circ.utils.offline.item_barcode=Item Barcode
+staff.circ.utils.offline.due_date=Due Date
+staff.circ.utils.offline.backdate=Back Date
+staff.circ.utils.offline.use_time=Use Time
+staff.circ.utils.not_cataloged=Not Cataloged
+staff.circ.utils.retrieving=Retrieving...
+staff.circ.utils.owning_lib=Owning Library
+staff.circ.utils.loan_duration.short=Short
+staff.circ.utils.loan_duration.normal=Normal
+staff.circ.utils.loan_duration.long=Long
+staff.circ.utils.fine_level.low=Low
+staff.circ.utils.fine_level.normal=Normal
+staff.circ.utils.fine_level.high=High
+staff.circ.utils.circulate=Circulate?
+staff.circ.utils.deleted=Deleted?
+staff.circ.utils.holdable=Holdable?
+staff.circ.utils.opac_visible=OPAC Visible?
+staff.circ.utils.reference=Reference?
+staff.circ.utils.deposit=Deposit?
+# The < and > highlight that the value is not set; translate Unset and change the delimiters as needed
+staff.circ.utils.unset=<Unset>
+staff.circ.utils.checkout_lib=Checkout Library
+staff.circ.utils.checkout_timestamp=Checkout Timestamp
+staff.circ.utils.checkin_timestamp=Checkin Timestamp
+staff.circ.utils.xact_start=Checkout Date
+staff.circ.utils.checkin_time=Checkin Date
+staff.circ.utils.xact_finish=Transaction Finished
+staff.circ.utils.create_date=Date Created
+staff.circ.utils.edit_date=Date Last Edited 
+staff.circ.utils.edition=Edition
+staff.circ.utils.isbn=ISBN
+staff.circ.utils.pubdate=Publication Date
+staff.circ.utils.publisher=Publisher
+# TCN is an acronym for Title Control Number
+staff.circ.utils.tcn=TCN
+staff.circ.utils.stop_fines=Fines Stopped
+staff.circ.utils.stop_fines_time=Fines Stopped Time
+staff.circ.utils.route_to=Route To
+staff.circ.utils.message=Message
+staff.circ.utils.uses=# of Uses
+staff.circ.utils.alert_message=Alert Message
+staff.circ.utils.barcode=Barcode
+staff.circ.utils.title=Title
+staff.circ.utils.author=Author
+staff.circ.utils.callnumber=Call Number
+staff.circ.utils.transit_id=Transit ID
+staff.circ.utils.transit_source=Transit Source
+staff.circ.utils.transit_source_send_time=Transit Send Time
+staff.circ.utils.transit_dest=Transit Destination
+staff.circ.utils.transit_dest_recv_time=Transit Completion Time
+staff.circ.utils.transit_target_copy=Transit Copy ID
+staff.circ.utils.request_lib=Request Library (Full Name)
+staff.circ.utils.request_lib_shortname=Request Library
+staff.circ.utils.request_timestamp=Request Timestamp
+staff.circ.utils.request_time=Request Date
+# Time the hold became available
+staff.circ.utils.available_timestamp=Available On (Timestamp)
+# Date the hold became available
+staff.circ.utils.available_time=Available On
+# Time the hold was captured
+staff.circ.utils.capture_timestamp=Capture Timestamp
+# Date the hold was captured
+staff.circ.utils.capture_time=Capture Date
+staff.circ.utils.hold_status.1=Waiting for copy
+staff.circ.utils.hold_status.2=Waiting for capture
+staff.circ.utils.hold_status.3=In-Transit
+staff.circ.utils.hold_status.4=Ready for pickup
+staff.circ.utils.frozen=Frozen?
+staff.circ.utils.active=Active?
+staff.circ.utils.thaw_date=Activation Date
+staff.circ.utils.thaw_date.none=No Date
+staff.circ.utils.pickup_lib=Pickup Library (Full Name)
+staff.circ.utils.current_copy.none=No Copy
+staff.circ.utils.title.none=No Title?
+staff.circ.utils.author.none=No Author?
+staff.circ.utils.notify_time=Last Notify Time
+staff.circ.utils.notify_count=Notices
+staff.circ.utils.patron_family_name=Patron Last Name
+staff.circ.utils.patron_first_given_name=Patron First Name
+staff.circ.utils.checkin.override=Override Checkin Failure?
+staff.circ.utils.billable.amount=Transaction for %1$s billable $%2$s
+staff.circ.utils.transit_hold_cancelled=Original hold for transit cancelled.
+staff.circ.utils.item_checked_in=%1$s was already checked in.
+staff.circ.utils.item_not_cataloged=ITEM_NOT_CATALOGED event but copy status is %1$s
+staff.circ.utils.route_to.msg=This item needs to be routed to %1$s
+staff.circ.utils.route_item_error=We should have received a ROUTE_ITEM
+staff.circ.utils.route_item_status_error=status of Holds Shelf, but no actual hold found.
+staff.circ.utils.payload.hold.barcode=Barcode: %1$s
+staff.circ.utils.payload.hold.title=Title: %1$s
+# Hold for patron familyName, firstName secondName
+staff.circ.utils.payload.hold.patron=Hold for patron %1$s, %2$s %3$s
+staff.circ.utils.payload.hold.phone_notify=Notify by phone: %1$s
+staff.circ.utils.payload.hold.email_notify=Notify by email: %1$s
+staff.circ.utils.payload.hold.request_date=Request Date: %1$s
+staff.circ.utils.payload.hold.slip_date=Slip Date: %1$s
+staff.circ.utils.hold_slip=Hold Slip
+staff.circ.utils.hold_slip.print.yes=Print
+staff.circ.utils.hold_slip.print.no=Do Not Print
+staff.circ.utils.capture=%1$s has been captured for a hold.
+staff.circ.utils.needs_cataloging=%1$s needs to be cataloged.
+staff.circ.utils.copy_status.error=FIXME -- this case "%1$s" is unhandled.
+staff.circ.utils.msg.ok=OK
+staff.circ.utils.route_to.destination=Destination: %1$s.
+staff.circ.utils.route_to.no_address=We do not have a holds address for this library.
+staff.circ.utils.route_to.no_address.error=Unable to retrieve mailing address.
+staff.circ.utils.payload.author=Author: %1$s
+staff.circ.utils.payload.in_transit=%1$s is in transit.
+staff.circ.checkin.hold_capture=Hold Capture
+staff.circ.checkin.check_in.tab=Item Check In
+staff.circ.checkin.error=Check In Failed (in circ.util.checkin) (%1$s): 
+# "Circulation" - check &staff.main.menu.circ.label; in lang.dtd
+# "Offline Interface" - check &staff.main.menu.circ.offline.label; in lang.dtd
+staff.circ.checkin.suggest_offline=Check In Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface
+staff.circ.checkin.renew_failed.error=Renew Failed for %1$s
+staff.circ.checkin.renew_failed.override=Override Renew Failure?
+staff.circ.renew.barcode=Barcode: %1$s
+staff.circ.renew.barcode.status=Barcode: %1$s Status: %2$s
+staff.circ.renew.barcode.msg=Barcode: %1$s Message: %2$s
+staff.circ.holds.activate.prompt=Are you sure you would like to activate hold %1$s?
+staff.circ.holds.activate.prompt.plural=Are you sure you would like to activate holds %1$s?
+staff.circ.holds.suspend.prompt=Are you sure you would like to suspend hold %1$s?
+staff.circ.holds.suspend.prompt.plural=Are you sure you would like to suspend holds %1$s?
+staff.circ.holds.activation_date.prompt=Please enter an Activation Date (or leave blank to unset) for hold %1$s.  This will also Suspend the hold.
+staff.circ.holds.activation_date.prompt.plural=Please enter an Activation Date (or leave blank to unset) for holds %1$s.  This will also Suspend the holds.
+staff.circ.holds.activation_date.too_early.error=Activation Date needs to be either unset or set to fall on a future date.
+staff.circ.holds.activation_date.invalid_date=Invalid Date
+staff.circ.holds.modifying_holds=Modifying Holds
+staff.circ.holds.modifying_holds.yes=Yes
+staff.circ.holds.modifying_holds.no=No
+staff.circ.holds.already_activated=Hold %1$s was already activated.
+staff.circ.holds.already_activated.plural=Holds %1$s were already activated.
+staff.circ.holds.already_suspended=Hold %1$s was already suspended.
+staff.circ.holds.already_suspended.plural=Holds %1$s were already suspended.
+staff.circ.holds.unexpected_error.not_likely_modified=Holds not likely modified.
+staff.circ.holds.unexpected_error.not_likely_activated=Holds not likely activated.
+staff.circ.holds.unexpected_error.not_likely_suspended=Holds not likely suspended.
+staff.circ.holds.error.may_not_edit_pickup_lib_for_hold_intransit=You may not edit the pickup library for holds that are in-transit or ready for pickup.
+
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/common.properties b/Open-ILS/xul/staff_client/server/locale/en-US/common.properties
new file mode 100644 (file)
index 0000000..dd7b89c
--- /dev/null
@@ -0,0 +1,159 @@
+common.exception=!! This software has encountered an error.  Please tell your friendly system administrator or software developer the following:\n%1$s\n%2$s\n
+common.jsan.missing=The JSAN library object is missing.
+common.error=Please inform your helpdesk or developers of this error:
+common.ok=Ok
+common.clear=Clear
+common.confirm=Check here to confirm this message.
+common.error.default=Please report that this happened.
+common.barcode.status.warning=Warning: As of %1$s, this barcode (%2$s) was flagged %3$s.
+common.barcode.status.warning.lost=Lost
+common.barcode.status.warning.expired=Expired
+common.barcode.status.warning.barred=Barred
+common.barcode.status.warning.blocked=Blocked
+common.barcode.status.warning.unknown=with an unknown code: %1$s
+common.date.invalid=Invalid Date
+# common.grouping_string = the string that should be inserted between elements of a grouped list
+common.grouping_string=, 
+common.unimplemented=Not yet implemented
+lang.version=remote v1
+openils.global_util.clear_cache.error=Problem clearing the cache: %1$s
+openils.global_util.clipboard.error=Clipboard action failed: %1$s
+openils.global_util.clipboard=Copied "%1$s" to clipboard.
+openils.global_util.content_window_jsobject.error=Error with get_contentWindow(%1$s) and wrappedJSObject: %2$s
+openils.global_util.content_window.error=Error with get_contentWindow(%1$s): %2$s
+openils.global_util.font_size.error=Error adjusting the font size: %1$s
+staff.acp_label_barcode=Barcode
+staff.acp_label_call_number=Call Number
+staff.acp_label_circ_as_type=Circ As Type
+staff.acp_label_circ_lib=Circ Lib
+staff.acp_label_circ_modifier=Circ Modifier
+staff.acp_label_copy_number=Copy Number
+staff.acp_label_deposit_amount=Deposit Amount
+staff.acp_label_fine_level=Fine Level
+staff.acp_label_id=Copy ID
+staff.acp_label_loan_duration=Loan Duration
+staff.acp_label_location=Location
+staff.acp_label_price=Price
+staff.acp_label_status=Status
+staff.ahr_current_copy_label=Current Copy
+staff.ahr_email_notify_label=Email Notify
+staff.ahr_expire_time_label=Expire Time
+staff.ahr_fulfillment_time_label=Fulfillment Time
+staff.ahr_hold_type_label=Type
+staff.ahr_holdable_formats_label=Holdable Formats
+staff.ahr_id_label=Hold Id
+staff.ahr_phone_notify_label=Phone Notify
+staff.ahr_pickup_lib_label=Pickup Lib
+staff.ahr_prev_check_time_label=Prev Check Time
+staff.ahr_requestor_label=Requestor
+staff.ahr_selection_depth_label=Selection Depth
+staff.ahr_status_label=Status
+staff.ahr_target_label=Target
+staff.ahr_usr_label=Usr
+staff.circ_label_due_date=Due Date
+staff.circ_label_id=Circ Id
+staff.circ_label_renewal_remaining=Remaining Renewals
+staff.mvr_label_author=Author
+staff.mvr_label_doc_id=Doc Id
+staff.mvr_label_title=Title
+staff.bills_xact_dates_label=Record / Dates
+staff.bills_information=Information
+staff.bills_current_payment_label=Current Payment
+staff.mbts_id_label=Bill # 
+staff.mbts_xact_start_label=Start
+staff.mbts_xact_finish_label=Finish
+staff.mbts_xact_type_label=Type
+staff.mbts_total_owed_label=Total Billed
+staff.mbts_total_paid_label=Total Paid
+staff.mbts_balance_owed_label=Balance Owed
+staff.mbts_usr_label=User
+staff.mbts_last_billing_note_label=Last Billing Note
+staff.mbts_last_billing_type_label=Last Billing Type
+staff.mbts_last_billing_timestamp_label=Last Billed
+staff.mbts_last_payment_note_label=Last Payment Note
+staff.mbts_last_payment_type_label=Last Payment Type
+staff.mbts_last_payment_timestamp_label=Last Payment
+staff.mb_billing_type_label=Billing Type
+staff.mb_xact_label=Transaction ID
+staff.mb_billing_ts_label=When
+staff.mb_void_time_label=Void Time
+staff.mb_note_label=Note
+staff.mb_amount_label=Amount
+staff.mb_voider_label=Voider
+staff.mb_voided_label=Voided
+staff.mb_id_label=Billing ID
+staff.mp_credit_card_payment_label=Credit Card Payment
+staff.mp_forgive_payment_label=Forgive Payment
+staff.mp_payment_timestamp_label=When
+staff.mp_payment_type_label=Payment Type
+staff.mp_voided_label=Voided
+staff.mp_id_label=Payment ID
+staff.mp_goods_payment_label=Goods Payment
+staff.mp_xact_label=Transaction ID
+staff.mp_credit_payment_label=Credit Payment
+staff.mp_work_payment_label=Work Payment
+staff.mp_note_label=Note
+staff.mp_cash_payment_label=Cash Payment
+staff.mp_amount_label=Amount
+staff.mp_check_payment_label=Check Payment
+staff.mp_cash_drawer_label=Workstation
+staff.mp_accepting_usr_label=Staff
+staff.card_barcode_label=Barcode
+staff.au_active_label=Active
+staff.au_usrname_label=Login Name
+staff.au_profile_label=Profile
+staff.au_barred_label=Barred
+staff.au_alert_message_label=Alert
+staff.au_claims_returned_count_label=Returns Claimed
+staff.au_create_date_label=Created On
+staff.au_expire_date_label=Expires On
+staff.au_home_library_label=Home Lib
+staff.au_home_library_fullname_label=Home Lib (Full Name)
+staff.au_credit_forward_balance_label=Credit
+staff.au_day_phone_label=Day Phone
+staff.au_evening_phone_label=Evening Phone
+staff.au_other_phone_label=Other Phone
+staff.au_email_label=Email
+staff.au_birth_date_label=Birth Date
+staff.au_ident_type_label=Ident Type
+staff.au_ident_value_label=Ident Value
+staff.au_ident_type2_label=Ident Type 2
+staff.au_ident_value2_label=Ident Value 2
+staff.au_net_access_level_label=Net Access
+staff.au_master_account_label=Group Lead
+staff.au_group_id_label=Group ID
+staff.au_id_label=User ID
+staff.au_name_prefix_label=Prefix
+staff.au_family_name_label=Family Name
+staff.au_first_given_name_label=First Name
+staff.au_second_given_name_label=Middle Name
+staff.au_name_suffix_label=Suffix
+staff.z39_50.search_class.author=Author
+staff.z39_50.search_class.isbn=ISBN
+staff.z39_50.search_class.issn=ISSN
+staff.z39_50.search_class.item_type=Item Type
+staff.z39_50.search_class.item_type.all=All Formats
+staff.z39_50.search_class.item_type.art=Papers/Articles
+staff.z39_50.search_class.item_type.bks=Books
+staff.z39_50.search_class.item_type.com=Computer files
+staff.z39_50.search_class.item_type.map=Maps
+staff.z39_50.search_class.item_type.mix=Mixed material
+staff.z39_50.search_class.item_type.rec=Sound recordings
+staff.z39_50.search_class.item_type.sco=Musical scores
+staff.z39_50.search_class.item_type.ser=Serials
+staff.z39_50.search_class.item_type.url=Internet Resources
+staff.z39_50.search_class.item_type.vis=Visual materials
+staff.z39_50.search_class.lccn=LCCN
+staff.z39_50.search_class.pubdate=PubDate
+staff.z39_50.search_class.publisher=Publisher
+staff.z39_50.search_class.tcn=Accession #
+staff.z39_50.search_class.title=Title
+staff.z39_50_import_interface_label=Z39.50 IMPORT
+staff.main.data.loaded=Data loaded.
+staff.main.gen_offline_widgets.synced=Offline interface synchronized with server.
+staff.main.gen_offline_widgets.noncat_sort.error=error in noncat sorting: 
+staff.main.gen_offline_widgets.please_wait=Please Wait
+staff.main.gen_offline_widgets.workstation_registration_denied=You do not have permission to register a workstation.
+staff.main.gen_offline_widgets.registration.override=Override Registration Failure?
+staff.main.gen_offline_widgets.registration.error=Workstation Registration error (%1$s)
+staff.main.gen_offline_widgets.registration.success=Registration successful
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/marcedit-tooltips.xml b/Open-ILS/xul/staff_client/server/locale/en-US/marcedit-tooltips.xml
new file mode 100644 (file)
index 0000000..a6a9772
--- /dev/null
@@ -0,0 +1,9185 @@
+<?xml version="1.0"?>
+<fields>
+  <field tag="001" repeatable="false">
+    <name>CONTROL NUMBER</name>
+    <description>The control number assigned by the organization creating, using, or distributing the record. The MARC code for the organization is contained in field 003 (Control Number Identifier).</description>
+  </field>
+  <field tag="003" repeatable="false">
+    <name>CONTROL NUMBER IDENTIFIER</name>
+    <description>The MARC code for the organization whose control number is contained in field 001 (Control Number).</description>
+  </field>
+  <field tag="005" repeatable="false">
+    <name>DATE AND TIME OF LATEST TRANSACTION</name>
+    <description>Sixteen characters that indicate the date and time of the latest record transaction and serve as a version identifier for the record. They are recorded according to Representation of Dates and Times (ISO 8601). The date requires 8 numeric characters in the pattern yyyymmdd. The time requires 8 numeric characters in the pattern hhmmss.f, expressed in terms of the 24-hour (00-23) clock.</description>
+  </field>
+  <field tag="006" repeatable="true">
+    <name>FIXED-LENGTH DATA ELEMENTS--ADDITIONAL MATERIAL CHARACTERISTICS--GENERAL INFORMATION</name>
+    <description>This field contains 18 character positions (00-17) that provide for coding information about special aspects of the item being cataloged that cannot be coded in field 008 (Fixed-Length Data Elements). It is used in cases when an item has multiple characteristics. It is also used to record the coded serial aspects of nontextual continuing resources.</description>
+  </field>
+  <field tag="007" repeatable="true">
+    <name>PHYSICAL DESCRIPTION FIXED FIELD--GENERAL INFORMATION</name>
+    <description>This field contains special information about the physical characteristics in a coded form. The information may represent the whole item or parts of an item such as accompanying material.</description>
+  </field>
+  <field tag="008" repeatable="false">
+    <name>FIXED-LENGTH DATA ELEMENTS--GENERAL INFORMATION</name>
+    <description>This field contains 40 character positions (00-39) that provide coded information about the record as a whole and about special bibliographic aspects of the item being cataloged. These coded data elements are potentially useful for retrieval and data management purposes.</description>
+  </field>
+  <field tag="010" repeatable="false">
+    <name>LIBRARY OF CONGRESS CONTROL NUMBER</name>
+    <description>A unique number assigned to a MARC record by the Library of Congress. Valid MARC prefixes for LC control numbers are published in MARC 21 Format for Bibliographic Data.</description>
+    <subfield code="a" repeatable="false">
+      <description>LC control number</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>NUCMC control number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid LC control number</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="013" repeatable="true">
+    <name>PATENT CONTROL INFORMATION</name>
+    <description>Information used to control patent documents. In addition to information about patents, this field may contain information relating to inventors' certificates, utility certificates, utility models, patents or certificates of addition, inventors' certificates of addition, utility certificates of addition, and published applications for any of these.</description>
+    <subfield code="a" repeatable="false">
+      <description>Number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Country</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Type of number</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Status</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Party to document</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="015" repeatable="true">
+    <name>NATIONAL BIBLIOGRAPHY NUMBER</name>
+    <description>The bibliography entry number for cataloging information that is derived from a national bibliography.</description>
+    <subfield code="a" repeatable="true">
+      <description>National bibliography number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="016" repeatable="true">
+    <name>NATIONAL BIBLIOGRAPHIC AGENCY CONTROL NUMBER</name>
+    <description>Unique numbers that have been assigned to a record by a national bibliographic agency other than the Library of Congress. The control number may also appear in field 001 (Control Number) in records distributed by the same national agency. This number is a record control number used in a national bibliographic agency system, rather than a number used for an entry in a national bibliographic, field 015 (National Bibliography Number).</description>
+    <indicator position="1" value="#">
+      <description>Library and Archives Canada</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Source specified in subfield $2 Used when the source of the control number is indicated by a code in subfield $2. See Organization Code Sources for a listing of sources used in MARC 21 records.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled or invalid record control number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="017" repeatable="true">
+    <name>COPYRIGHT OR LEGAL DEPOSIT NUMBER</name>
+    <description>The copyright registration or legal deposit number for an item that was acquired by copyright or legal deposit.</description>
+    <indicator position="2" value="#">
+      <description>Copyright or legal deposit number</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Terms of availability</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid ISBN</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="018" repeatable="false">
+    <name>COPYRIGHT ARTICLE-FEE CODE</name>
+    <description>A unique identification code for a component part of a monograph or a continuing resource.</description>
+    <subfield code="a" repeatable="false">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Terms of availability</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid ISBN</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="020" repeatable="true">
+    <name>INTERNATIONAL STANDARD BOOK NUMBER</name>
+    <description>The ISBN assigned to a monographic publication by designated agencies in each country participating in the program. The field may include terms of availability and canceled or invalid ISBNs. It may be repeated for multiple numbers associated with the item (e.g., ISBNs for the hard bound and paperback manifestations; ISBNs for a set as a whole and for the individual parts in the set).</description>
+    <subfield code="a" repeatable="false">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Terms of availability</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid ISBN</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="022" repeatable="true">
+    <name>INTERNATIONAL STANDARD SERIAL NUMBER</name>
+    <description>The ISSN, a unique identification number assigned to a continuing resource.</description>
+    <indicator position="1" value="#">
+      <description>No level specified</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Continuing resource of international interest</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Continuing resource not of international interest</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Incorrect ISSN</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled ISSN</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="024" repeatable="true">
+    <name>OTHER STANDARD IDENTIFIER</name>
+    <description>A standard number or code published on an item which cannot be accommodated in another field (e.g., field 020 (International Standard Book Number), 022 (International Standard Serial Number) , and 027 (Standard Technical Report Number)). The type of standard number or code is identified in the first indicator position or in subfield $2 (Source of number or code).</description>
+    <indicator position="1" value="0">
+      <description>International Standard Recording Code (ISRC)Number Standard: ISO 3901: International Standard Recording Code (Maintenance Agency ) For display, hyphens (-) may be generated to separate subelements of the number, e.g., NL-C01-84-13261</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Universal Product Code (UPC)</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>International Standard Music Number (ISMN)Number Standard: ISO 10957: International Standard Music Number (Maintenance Agency ) For display, hyphens (-) or spaces may be generated to separate subelements of the number.</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>International Article Number (EAN)</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Serial Item and Contribution Identifier (SICI)Number Standard: ANSI/NISO Z39.56: Serial Item and Contribution Identifier For display, hyphens (-) may be generated to separate subelements of the number, e.g., 8756-2324(198603/04)65:2L.4:QTP:1-P</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>Unspecified type of standard number or code</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>No difference</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Difference</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Standard number or code</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Terms of availability</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Additional codes following the standard number or code</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid standard number or code</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of number or code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="025" repeatable="true">
+    <name>OVERSEAS ACQUISITION NUMBER</name>
+    <description>A number assigned by the Library of Congress to an item that was acquired through one of its overseas acquisition programs.</description>
+    <subfield code="a" repeatable="false">
+      <description>Standard technical report number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="026" repeatable="true">
+    <name>FINGERPRINT IDENTIFIER</name>
+    <description>Used to assist in the identification of antiquarian books by recording information comprising groups of characters taken from specified positions on specified pages of the book, in accordance with the principles laid down in various published guidelines.</description>
+    <subfield code="a" repeatable="false">
+      <description>Standard technical report number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="027" repeatable="true">
+    <name>STANDARD TECHNICAL REPORT NUMBER</name>
+    <description>The STRN assigned to a technical report. The assignment of STRNs is coordinated by the National Technical Information Service (NTIS), which also maintains an assignment registry.</description>
+    <subfield code="a" repeatable="false">
+      <description>Standard technical report number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="028" repeatable="true">
+    <name>PUBLISHER NUMBER</name>
+    <description>The formatted number used for sound recordings, printed music, and videorecordings. Publisher's numbers that are given in an unformatted form are recorded in field 500 (General Note). A print constant identifying the kind of publisher number may be generated based on the value in the first indicator position.</description>
+    <indicator position="1" value="0">
+      <description>Issue number Assigned by the publisher to identify the issue or continuing resource designation.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Matrix number Identifies the master from which the recording was pressed.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Plate number Assigned by a publisher to a printed music publication.</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Other music number</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Videorecording number</description>
+    </indicator>
+    <indicator position="1" value="5">
+      <description>Other publisher number</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>No note, no added entry</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Note, added entry</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Note, no added entry</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>No note, added entry</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Publisher number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="030" repeatable="true">
+    <name>CODEN DESIGNATION</name>
+    <description>The CODEN designation for a bibliographic title. (The CODEN is assigned by the International CODEN Section of Chemical Abstracts Service.)</description>
+    <subfield code="a" repeatable="false">
+      <description>CODEN</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid CODEN</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="031" repeatable="true">
+    <name>MUSICAL INCIPITS INFORMATION</name>
+    <description>Coded data representing the musical incipit for music using established notation schemes that employ ordinary ASCII symbols. It is primarily used to identify music manuscripts, but can be applied to any material containing music.</description>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Number of movement</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Number of excerpt</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Caption or heading</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Role</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Clef</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Voice/instrument</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Key signature</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Time signature</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Musical notation</description>
+    </subfield>
+    <subfield code="q" repeatable="true">
+      <description>General note</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key or mode</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>Coded validity note</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Text incipit</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Link text</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>System code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="032" repeatable="true">
+    <name>POSTAL REGISTRATION NUMBER</name>
+    <description>The number assigned to a publication for which the specified postal service permits the use of a special mailing class privilege.</description>
+    <subfield code="a" repeatable="false">
+      <description>Postal registration number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="033" repeatable="true">
+    <name>DATE/TIME AND PLACE OF AN EVENT</name>
+    <description>Formatted date/time and/or coded place of creation, capture, or broadcast associated with an event or the finding of a naturally occurring object. This information in textual form is contained in field 518 (Date/Time and Place of an Event Note).</description>
+    <indicator position="1" value="#">
+      <description>No date information The field contains no subfield $a.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Single date</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Multiple single dates This value is also used for two consecutive dates.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Range of dates The creation, capture, or finding dates span more than two consecutive days and the individual dates are unknown or are too numerous to be specified.</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Capture The recording of sound, the filming of visual images, the making or producing of an item, including the creation of an item not involving recording or filming.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Broadcast The broadcasting or re-broadcasting of sound or visual images.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Finding The finding of a naturally occurring object.</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Formatted date/time</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Geographic classification area code</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Geographic classification subarea code</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="034" repeatable="true">
+    <name>CODED CARTOGRAPHIC MATHEMATICAL DATA</name>
+    <description>The coded form of the mathematical data contained in field 255 (Mathematical Data Area) of the bibliographic record.</description>
+    <indicator position="1" value="0">
+      <description>Scale indeterminable/No scale recorded No representative fraction is given in field 255.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Single scale</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Range of scales</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Not applicable</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Outer ring</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Exclusion ring</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Category of scale</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Constant ratio linear horizontal scale</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Constant ratio linear vertical scale</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Coordinates--westernmost longitude</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Coordinates--easternmost longitude</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Coordinates--northernmost latitude</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Coordinates--southernmost latitude</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Angular scale</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Declination--northern limit</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Declination--southern limit</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Right ascension--eastern limit</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Right ascension--western limit</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Equinox</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Distance from earth</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>G-ring latitude</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>G-ring longitude</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>Beginning date</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>Ending date</description>
+    </subfield>
+    <subfield code="z" repeatable="false">
+      <description>Name of extraterrestrial body</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="035" repeatable="true">
+    <name>SYSTEM CONTROL NUMBER</name>
+    <description>A control number of a system other than the one whose control number is contained in field 001 (Control Number), field 010 (Library of Congress Control Number) or field 016 (National Bibliographic Agency Control Number).</description>
+    <subfield code="a" repeatable="false">
+      <description>System control number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid control number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="036" repeatable="false">
+    <name>ORIGINAL STUDY NUMBER FOR COMPUTER DATA FILES</name>
+    <description>The original study number assigned by the producer of the computer file. The introductory phrase Original study: may be generated based on the field tag.</description>
+    <subfield code="a" repeatable="false">
+      <description>Original study number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="037" repeatable="true">
+    <name>SOURCE OF ACQUISITION</name>
+    <description>Information needed to order the item or its reproduction.</description>
+    <subfield code="a" repeatable="false">
+      <description>Stock number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Source of stock number/acquisition</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Terms of availability</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Form of issue</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Additional format characteristics</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="038" repeatable="false">
+    <name>RECORD CONTENT LICENSOR</name>
+    <description>Contains the MARC code of the organization that licenses the intellectual property rights to the data contained in the record, such as with contractual arrangements.</description>
+    <subfield code="a" repeatable="false">
+      <description>Record content licensor</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="040" repeatable="false">
+    <name>CATALOGING SOURCE</name>
+    <description>The MARC code for or the name of the organization(s) that created the original bibliographic record, assigned MARC content designation and transcribed the record into machine-readable form, or modified (except for the addition of holdings symbols) an existing MARC record. These data and the code in 008/39 (Cataloging source) specify the parties responsible for the bibliographic record.</description>
+    <subfield code="a" repeatable="false">
+      <description>Original cataloging agency</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Language of cataloging</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Transcribing agency</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Modifying agency</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Description conventions</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="041" repeatable="true">
+    <name>LANGUAGE CODE</name>
+    <description>Codes for languages associated with an item when the language code in field 008/35-37 of the record is insufficient to convey full information. This includes records for multilingual items, items that involve translation, and items where the medium of communication is a sign language. The sources of the codes are: MARC Code List for Languages or other code lists such as ISO 639-1 (Codes for the representation of names of languages - Part 1 : alpha-2 code).</description>
+    <indicator position="1" value="0">
+      <description>Item not a translation/does not include a translation</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Item is or includes a translation</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>MARC language code</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Language code of text/sound track or separate title</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Language code for summary, abstract, or subtitles</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Language code of sung or spoken text</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Language code of librettos</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Language code of table of contents</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Language code of accompanying material other than librettos</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Language code of original and/or intermediate translations of text</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="042" repeatable="false">
+    <name>AUTHENTICATION CODE</name>
+    <description>One or more codes that indicate an authentication center has reviewed a national database record. The codes are associated with specifically designated authentication agencies.</description>
+    <subfield code="a" repeatable="true">
+      <description>Time period code</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Formatted 9999 B.C. through C.E. time period</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Formatted pre-9999 B.C. time period</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="043" repeatable="false">
+    <name>GEOGRAPHIC AREA CODE</name>
+    <description>Geographic area codes associated with an item. The source of the code in subfield $a is the MARC Code List for Geographic Areas . The source of a local code in subfield $b is indicated in subfield $2. The source of codes in subfield $c is ISO 3166, Codes for the representation of names of countries and their subdivisions - Part 1 : Country codes or Part 2 : Country subdivision codes.</description>
+    <subfield code="a" repeatable="true">
+      <description>Time period code</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Formatted 9999 B.C. through C.E. time period</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Formatted pre-9999 B.C. time period</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="044" repeatable="false">
+    <name>COUNTRY OF PUBLISHING/PRODUCING ENTITY CODE</name>
+    <description>Codes for the country of producer when the code in field 008/15-17 (Place of publication, production, or execution) of the record is insufficient to convey full information for an item produced in more than one country. The source of the code is subfield $a is MARC Code List for Countries . Subfield $c may be used to include country and subentity codes from ISO 3166, Codes for the representation of names of countries and their subdivisions - Part 1 : Country codes or Part 2 : Country subdivision codes.</description>
+    <subfield code="a" repeatable="true">
+      <description>Time period code</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Formatted 9999 B.C. through C.E. time period</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Formatted pre-9999 B.C. time period</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="045" repeatable="false">
+    <name>TIME PERIOD OF CONTENT</name>
+    <description>A time period code (subfield $a) and/or a formatted time period (subfield $b and/or $c) associated with an item.</description>
+    <indicator position="1" value="#">
+      <description>Subfield $b or $c not present</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Single date/time</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Multiple single dates/times Multiple $b and/or $c subfields are present; each contains a formatted date/time.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Range of dates/times Two $b and/or $c subfields are present and together express a range of dates and/or times.</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Time period code</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Formatted 9999 B.C. through C.E. time period</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Formatted pre-9999 B.C. time period</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="046" repeatable="true">
+    <name>SPECIAL CODED DATES</name>
+    <description>The date of item information that cannot be recorded in 008/06-14 (Type of date/Publication status, Date 1, Date 2) because such information involves one or more Before Common Era (B.C.) dates, incorrect dates, dates when resources have been modified or created, and date spans when resources are valid. When field 046 is used for B.C. dates, 008/06 is set to code b (No date given; B.C. date involved) and field 008/07-10 and 008/11-14 contain blanks (####). When field 046 is used for incorrect dates, field 008/06 is coded for the type of corrected data and field 008/07-10 and 008/11-14 contain correct dates.</description>
+    <subfield code="a" repeatable="false">
+      <description>Type of date code</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Date 1</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Date 1</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date 2</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Date 2</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Date resource modified</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Beginning or single date created</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Ending date created</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Beginning of date valid</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>End of date valid</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of date</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="047" repeatable="true">
+    <name>FORM OF MUSICAL COMPOSITION CODE</name>
+    <description>Codes that indicate the form of musical composition of printed and manuscript music and musical sound recordings when character positions 18 and 19 (Form of composition) of field 008 (Fixed-Length Data Elements) for music contains the code mu for multiple forms or for non-MARC codes. MARC codes are listed under field 008 Music, /18-19 (Form of composition).</description>
+    <indicator position="2" value="#">
+      <description>MARC musical composition code</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Form of musical composition code</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of code</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="048" repeatable="true">
+    <name>NUMBER OF MUSICAL INSTRUMENTS OR VOICES CODE</name>
+    <description>A two-character code that indicates the medium of performance for a musical group. Each code may be followed by a two-digit number (01-99) that indicates the number of parts or performers (e.g., va02, a two-part composition for Voices - Soprano). The number of parts may be omitted if not applicable.</description>
+    <indicator position="2" value="#">
+      <description>MARC code</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Performer or ensemble</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Soloist</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of code</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="050" repeatable="true">
+    <name>LIBRARY OF CONGRESS CALL NUMBER</name>
+    <description>A classification or call number that is taken from Library of Congress Classification or LC Classification Additions and Changes. The brackets that customarily surround alternate class/call numbers are not carried in the MARC record; they may be generated based on the presence of repeated $a subfields.</description>
+    <indicator position="1" value="#">
+      <description>No information provided A call number assigned by an organization other than LC.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Item is in LC May be used by organizations transcribing from LC copy on which the call number is neither enclosed within brackets nor preceded by a Maltese cross.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Item is not in LC May be used by organizations transcribing from LC copy on which the call number is enclosed within brackets or is preceded by a Maltese cross. The brackets that customarily surround call numbers for items not in LC are not carried in the MARC record; they may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Assigned by LC May be used by organizations transcribing from LC copy.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Assigned by agency other than LC</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="051" repeatable="true">
+    <name>LIBRARY OF CONGRESS COPY, ISSUE, OFFPRINT STATEMENT</name>
+    <description>Information added to a bibliographic record by LC that relates to copies, issues, and/or offprints of the described item that are in its collections.</description>
+    <subfield code="a" repeatable="false">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Copy information</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="052" repeatable="true">
+    <name>GEOGRAPHIC CLASSIFICATION</name>
+    <description>A code for the main geographic area and any applicable subareas associated with the item.</description>
+    <indicator position="1" value="#">
+      <description>Library of Congress Classification</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>U.S. Dept. of Defense Classification</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Geographic classification area code</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Geographic classification subarea code</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Populated place name</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Code source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="055" repeatable="true">
+    <name>CLASSIFICATION NUMBERS ASSIGNED IN CANADA</name>
+    <description>A classification or call number that is assigned by the Library and Archives Canada or a contributing Canadian library.</description>
+    <indicator position="1" value="#">
+      <description>Information not provided A call/class number assigned by an organization other than LAC.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Work held by LAC</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Work not held by LAC</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>LC-based call number assigned by LAC</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Complete LC class number assigned by LAC</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Incomplete LC class number assigned by LAC</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>LC-based call number assigned by the contributing library</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Complete LC class number assigned by the contributing library</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Incomplete LC class number assigned by the contributing library</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>Other call number assigned by LAC</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Other class number assigned by LAC</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>Other call number assigned by the contributing library</description>
+    </indicator>
+    <indicator position="2" value="9">
+      <description>Other class number assigned by the contributing library</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of call/class number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="060" repeatable="true">
+    <name>NATIONAL LIBRARY OF MEDICINE CALL NUMBER</name>
+    <description>A classification or call number that is taken from National Library of Medicine Classification schedules QS-QZ and W or from Library of Congress Classification schedules as used by NLM for peripheral and related topics.</description>
+    <indicator position="1" value="#">
+      <description>No information provided A call number assigned by an organization other than NLM.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Item is in NLM</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Item is not in NLM</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Assigned by NLM</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Assigned by agency other than NLM</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="061" repeatable="true">
+    <name>NATIONAL LIBRARY OF MEDICINE COPY STATEMENT</name>
+    <description>Information added to a bibliographic record by NLM that relates to second copies or sets of the described item that are in its collections.</description>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Copy information</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="066" repeatable="false">
+    <name>CHARACTER SETS PRESENT</name>
+    <description>Information that indicates that the character set present in a record is other than ISO 10646 (or Unicode). A detailed description of the standard escape sequences used in MARC records is provided in MARC 21 Specifications for Record Structure, Character Sets, and Exchange Media .</description>
+    <subfield code="a" repeatable="false">
+      <description>Primary G0 character set</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Primary G1 character set</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Alternate G0 or G1 character set</description>
+    </subfield>
+  </field>
+  <field tag="070" repeatable="true">
+    <name>NATIONAL AGRICULTURAL LIBRARY CALL NUMBER</name>
+    <description>A classification or call number that is assigned by the National Agricultural Library.</description>
+    <indicator position="1" value="0">
+      <description>Item is in NAL</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Item is not in NAL</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="071" repeatable="true">
+    <name>NATIONAL AGRICULTURAL LIBRARY COPY STATEMENT</name>
+    <description>Information added to a bibliographic record by NAL that relates to second copies or sets of the described item that are in its collections.</description>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Copy information</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="072" repeatable="true">
+    <name>SUBJECT CATEGORY CODE</name>
+    <description>A code for the subject category that is associated with the described item.</description>
+    <indicator position="2" value="0">
+      <description>NAL subject category code list The subject category code is taken from AGRIS: Subject Categories that is maintained by NAL.</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Subject category code</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Subject category code subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="074" repeatable="true">
+    <name>GPO ITEM NUMBER</name>
+    <description>A number assigned by the U.S. Government Printing Office to publications to manage their distribution within its Depository Library System.</description>
+    <subfield code="a" repeatable="false">
+      <description>GPO item number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid GPO item number</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="080" repeatable="true">
+    <name>UNIVERSAL DECIMAL CLASSIFICATION NUMBER</name>
+    <description>A number taken from the Universal Decimal Classification scheme.</description>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Edition number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="082" repeatable="true">
+    <name>DEWEY DECIMAL CLASSIFICATION NUMBER</name>
+    <description>The classification number is taken from Dewey Decimal Classification and Relative Index, the Abridged Dewey Decimal Classification and Relative Index, and electronic updates to either edition. Through 1997, updates where issued in DC&amp;: Dewey Decimal Classification Additions, Notes and Decisions.</description>
+    <indicator position="1" value="0">
+      <description>Full edition</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Abridged edition</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Assigned by LC May be used by organizations transcribing from LC copy.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Assigned by agency other than LC</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Edition number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="084" repeatable="true">
+    <name>OTHER CLASSIFICATION NUMBER</name>
+    <description>A classification number from a scheme not covered by one of the other number fields. The field should not be used for classification numbers assigned from a source for which a subfield $2 source of number code would not be assigned.</description>
+    <subfield code="a" repeatable="true">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Item number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="086" repeatable="true">
+    <name>GOVERNMENT DOCUMENT CLASSIFICATION NUMBER</name>
+    <description>The classification number assigned to documents by designated agencies in countries that have a government documents classification program.</description>
+    <indicator position="1" value="#">
+      <description>Source specified in subfield $2 A classification number other than the U.S. or Canadian scheme.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Superintendent of Documents Classification System Assigned by the U.S Government Printing Office. Supt. of Docs. no.: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Government of Canada Publications: Outline of Classification</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Classification number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid classification number</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Number source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="088" repeatable="true">
+    <name>REPORT NUMBER</name>
+    <description>A report number that is not a Standard Technical Report Number (field 027)</description>
+    <subfield code="a" repeatable="false">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Canceled/invalid report number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="100" repeatable="false">
+    <name>MAIN ENTRY--PERSONAL NAME</name>
+    <description>A personal name used as a main entry in a bibliographic record.</description>
+    <indicator position="1" value="0">
+      <description>Forename The name is a forename or is a name consisting of words, initials, letters, etc., that are formatted in direct order.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Surname The name is a single or multiple surname formatted in inverted order or a single name without forenames that is known to be a surname.</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Family name The name represents a family, clan, dynasty, house, or other such group and may be formatted in direct or inverted order.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Personal name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Numeration</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Titles and other words associated with a name</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Dates associated with a name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Attribution qualifier</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Fuller form of name</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="110" repeatable="false">
+    <name>MAIN ENTRY--CORPORATE NAME</name>
+    <description>A corporate name used as a main entry in a bibliographic record.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name The corporate name begins with a personal name in inverted order.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name The entry element is a name of a jurisdiction that is also an ecclesiastical entity or is a jurisdiction name under which a corporate name or a title of a work is entered.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Corporate name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of meeting or treaty signing</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="111" repeatable="false">
+    <name>MAIN ENTRY--MEETING NAME</name>
+    <description>A meeting name used as a main entry in a bibliographic record.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name The meeting name begins with a personal name in inverted order.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name The entry element is a jurisdiction name under which a meeting name is entered.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Meeting name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of meeting</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Name of meeting following jurisdiction name entry element</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="130" repeatable="false">
+    <name>MAIN ENTRY--UNIFORM TITLE</name>
+    <description>A uniform title used as a main entry in a bibliographic record.</description>
+    <indicator position="1" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="210" repeatable="true">
+    <name>ABBREVIATED TITLE</name>
+    <description>Contains title as abbreviated for indexing or identification. An abbreviated key title is supplied by ISSN centers, based on the Key Title (Field 222). Other abbreviated titles are supplied by cataloging agencies, including abstracting and indexing services.</description>
+    <indicator position="1" value="0">
+      <description>No added entry</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Added entry</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Abbreviated key title</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Other abbreviated title</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Abbreviated title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="2" repeatable="true">
+      <description>Source</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="222" repeatable="true">
+    <name>KEY TITLE</name>
+    <description>A unique title for a continuing resource that is assigned in conjunction with an ISSN recorded in field 022 by national centers under the auspices of the ISSN Network.</description>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Key title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="240" repeatable="false">
+    <name>UNIFORM TITLE</name>
+    <description>The uniform title for an item when the bibliographic description is entered under a main entry field that contains a personal (field 100), corporate (110), or meeting (111) name.</description>
+    <indicator position="1" value="0">
+      <description>Not printed or displayed</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Printed or displayed</description>
+    </indicator>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="242" repeatable="true">
+    <name>TRANSLATION OF TITLE BY CATALOGING AGENCY</name>
+    <description>A translation of the title proper that is made by the cataloger when the translated title does not appear as a parallel title on the item. For a note, the introductory phrase Title translated: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>No added entry</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Added entry A value that indicates whether an added entry for the title is to be generated.</description>
+    </indicator>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of title</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Statement of responsibility, etc.</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>Language code of translated title</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="243" repeatable="false">
+    <name>COLLECTIVE UNIFORM TITLE</name>
+    <description>A generic title that is constructed by the cataloger to collect works by a prolific author. The brackets that customarily enclose a collective uniform title are not carried in the MARC record. They may be generated based on the field tag.</description>
+    <indicator position="1" value="0">
+      <description>Not printed or displayed</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Printed or displayed</description>
+    </indicator>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="245" repeatable="false">
+    <name>TITLE STATEMENT</name>
+    <description>The title and statement of responsibility area of the bibliographic description of a work.</description>
+    <indicator position="1" value="0">
+      <description>No added entry No title added entry is made either because no title added entry is desired or because the title added entry is not traced the same as the title in field 245.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Added entry The desired title added entry is the same as the title in field 245.</description>
+    </indicator>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of title</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Statement of responsibility, etc.</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Inclusive dates</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Bulk dates</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="246" repeatable="true">
+    <name>VARYING FORM OF TITLE</name>
+    <description>A form of the title appearing on different parts of an item or a portion of the title proper, or an alternative form of the title when the form differs significantly from the title contained in field 245.</description>
+    <indicator position="1" value="0">
+      <description>Note, no added entry</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Note, added entry</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>No note, no title added entry</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>No note, added entry</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No type specified</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Portion of title An added entry may be generated by first indicator value 1. No note is generated.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Parallel title The parallel title that is contained in subfield $b of field 245. No note is generated.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Distinctive title A special title that appears in addition to the regular title on individual issues of an item and by which the issue may be known. Distinctive title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>Other title A title that appears on the piece that is not more appropriately indicated by one of the other values. Other title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Cover title A title that is printed on the original cover of a publication or lettered or stamped on the publisher's binding and which is used when the cover is not the chief source of the bibliographic description. Cover title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Added title page title A title in another language found on a title page that is not used as the chief source of the bibliographic description. Added title page title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>Caption title A title printed at the head of the first page of text. Caption title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Running title A title printed at the top or bottom margin of each page of a publication. Running title: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>Spine title A publisher's title found on the spine of a publication. Spine title: may be generated with the note for display.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Title proper/short title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of title</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date or sequential designation</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="247" repeatable="true">
+    <name>FORMER TITLE</name>
+    <description>A former title proper when one cataloging record represents several titles associated with an entity.</description>
+    <indicator position="1" value="0">
+      <description>No added entry</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Added entry</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Display noteTitle varies: may be generated with the note for display.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Do not display note A textual note is contained in field 547 (Former Title Complexity Note).</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of title</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date or sequential designation</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="250" repeatable="false">
+    <name>EDITION STATEMENT</name>
+    <description>Information relating to the edition of a work as determined by applicable cataloging rules.</description>
+    <subfield code="a" repeatable="false">
+      <description>Edition statement</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of edition statement</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="254" repeatable="false">
+    <name>MUSICAL PRESENTATION STATEMENT</name>
+    <description>A description of the format of an edition of a work of printed or manuscript music that may differ from the format of another edition of the same work.</description>
+    <subfield code="a" repeatable="false">
+      <description>Musical presentation statement</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="255" repeatable="true">
+    <name>CARTOGRAPHIC MATHEMATICAL DATA</name>
+    <description>Mathematical data that is associated with map material, including celestial charts. This data may also be coded in field 034 (Coded Mathematical Data).</description>
+    <subfield code="a" repeatable="false">
+      <description>Statement of scale</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Statement of projection</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Statement of coordinates</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Statement of zone</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Statement of equinox</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Outer G-ring coordinate pairs</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Exclusion G-ring coordinate pairs</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="256" repeatable="false">
+    <name>COMPUTER FILE CHARACTERISTICS</name>
+    <description>Characteristics of a computer file, such as the type of file, the number of records or statements.</description>
+    <subfield code="a" repeatable="false">
+      <description>Computer file characteristics</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="257" repeatable="false">
+    <name>COUNTRY OF PRODUCING ENTITY FOR ARCHIVAL FILMS</name>
+    <description>The name or abbreviation of the name of the country where the principal offices of the producing entity of a moving image work are located.</description>
+    <subfield code="a" repeatable="false">
+      <description>Country of producing entity</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="258" repeatable="true">
+    <name>PHILATELIC ISSUE DATA</name>
+    <description>Stamps, postal stationery and all other documents created and/or used to signify pre-payment or payment due for postal services; stamps or other labels resembling the material described above, but which have no postal value; cancellations or other marks created and/or used by a postal administration to show evidence of postal usage; material bearing one or more of the items described above.</description>
+    <subfield code="a" repeatable="false">
+      <description>Issuing jurisdiction</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Denomination</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="260" repeatable="false">
+    <name>PUBLICATION, DISTRIBUTION, ETC.</name>
+    <description>Information relating to the publication, printing, distribution, issue, release, or production of a work.</description>
+    <indicator position="1" value="#">
+      <description>Not applicable/No information provided/Earliest available publisher</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Intervening publisher</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Current/latest publisher</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Place of publication, distribution, etc.</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Name of publisher, distributor, etc.</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Date of publication, distribution, etc.</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Place of manufacture</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Manufacturer</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Date of manufacture</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="263" repeatable="false">
+    <name>PROJECTED PUBLICATION DATE</name>
+    <description>The projected date of publication used in bibliographic records for works that have not yet been published.</description>
+    <subfield code="a" repeatable="true">
+      <description>Address</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>City</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>State or province</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Country</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Postal code</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Terms preceding attention name</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Attention name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Attention position</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Type of address</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Specialized telephone number</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Telephone number</description>
+    </subfield>
+    <subfield code="l" repeatable="true">
+      <description>Fax number</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Electronic mail address</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>TDD or TTY number</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Contact person</description>
+    </subfield>
+    <subfield code="q" repeatable="true">
+      <description>Title of contact person</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Hours</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="270" repeatable="true">
+    <name>ADDRESS</name>
+    <description>Contains an address (as well as electronic access data such as telephone, fax, TTY, etc. numbers) associated with a bibliographic item. Multiple addresses, such as mailing addresses and addresses corresponding to the physical location of an item or facilities, are recorded in separate occurrences of field 270.</description>
+    <indicator position="1" value="#">
+      <description>No level specified</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Primary</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Secondary</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No type specified</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Mailing</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Type specified in subfield $i</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Address</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>City</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>State or province</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Country</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Postal code</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Terms preceding attention name</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Attention name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Attention position</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Type of address</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Specialized telephone number</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Telephone number</description>
+    </subfield>
+    <subfield code="l" repeatable="true">
+      <description>Fax number</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Electronic mail address</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>TDD or TTY number</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Contact person</description>
+    </subfield>
+    <subfield code="q" repeatable="true">
+      <description>Title of contact person</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Hours</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="300" repeatable="true">
+    <name>PHYSICAL DESCRIPTION</name>
+    <description>A physical description of the described item, including its extent, dimensions, and such other physical details as a description of any accompanying materials and unit type and size.</description>
+    <subfield code="a" repeatable="true">
+      <description>Extent</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Other physical details</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Dimensions</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Accompanying material</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Type of unit</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Size of unit</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="306" repeatable="false">
+    <name>PLAYING TIME</name>
+    <description>Six numeric characters, in the pattern hhmmss, that represent the playing time for a sound recording or the stated duration of performance of printed or manuscript music. If the playing time is less than 1 hour, the hour (hh) is recorded as two zeroes; if less than a minute, the minute (mm) is also recorded as two zeroes.</description>
+    <subfield code="a" repeatable="false">
+      <description>Hours</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Additional information</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="307" repeatable="true">
+    <name>HOURS, ETC.</name>
+    <description>Chronological information identifying the days and/or times an item is available or accessible. It is used primarily in records for electronic resources.</description>
+    <indicator position="1" value="#">
+      <description>Hours</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Hours</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Additional information</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="310" repeatable="false">
+    <name>CURRENT PUBLICATION FREQUENCY</name>
+    <description>The current stated publication frequency of either an item or an update to an item. Dates are included when the beginning date of the current frequency is not the same as the beginning date of publication. These data are related to coded data in field 008/18 (Frequency) and 008/19 (Regularity).</description>
+    <subfield code="a" repeatable="false">
+      <description>Current publication frequency</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Date of current publication frequency</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="321" repeatable="true">
+    <name>FORMER PUBLICATION FREQUENCY</name>
+    <description>The former frequency of either an item or an update to an item when a current frequency is contained in field 310.</description>
+    <subfield code="a" repeatable="false">
+      <description>Former publication frequency</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Dates of former publication frequency</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="340" repeatable="true">
+    <name>PHYSICAL MEDIUM</name>
+    <description>Physical description information for an item that requires technical equipment for its use or an item that has special conservation or storage needs.</description>
+    <subfield code="a" repeatable="true">
+      <description>Material base and configuration</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Dimensions</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Materials applied to surface</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Information recording technique</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Support</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Production rate/ratio</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Location within medium</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Technical specifications of medium</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="342" repeatable="true">
+    <name>GEOSPATIAL REFERENCE DATA</name>
+    <description>A description of the frame of reference for the coordinates in a data set. To work with a data set a user must be able to identify how location accuracy has been affected through the application of a geospatial reference method, thus enabling the user to manipulate the data set to recover location accuracy.</description>
+    <indicator position="1" value="0">
+      <description>Horizontal coordinate system</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Vertical coordinate system</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Geographic</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Map projection</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Grid coordinate system</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>Local planar</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Local</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Geodetic model</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>Altitude</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Method specified in $2</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>Depth</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Coordinate or distance units</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Latitude resolution</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Longitude resolution</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Standard parallel or oblique line latitude</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Oblique line longitude</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Longitude of central meridian or projection center</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Latitude of projection origin or projection center</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>False easting</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>False northing</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Scale factor</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Height of perspective point above surface</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Azimuthal angle</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Azimuth measure point longitude or straight vertical longitude from pole</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Landsat number and path number</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Zone identifier</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Ellipsoid name</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Semi-major axis</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Denominator of flattening ratio</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Vertical resolution</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Vertical encoding method</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Local planar, local, or other projection or grid description</description>
+    </subfield>
+    <subfield code="w" repeatable="false">
+      <description>Local planar or local georeference information</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Reference method used</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="343" repeatable="true">
+    <name>PLANAR COORDINATE DATA</name>
+    <description>Information about the coordinate system developed on a planar surface. The information is provided to allow the user of a geospatial data set to identify the quantities of distances, or distances and angles. These define the position of a point on a reference plane onto which the surface of the Earth has been projected.</description>
+    <subfield code="a" repeatable="false">
+      <description>Planar coordinate encoding method</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Planar distance units</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Abscissa resolution</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Ordinate resolution</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Distance resolution</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Bearing resolution</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Bearing units</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Bearing reference direction</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Bearing reference meridian</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="351" repeatable="true">
+    <name>ORGANIZATION AND ARRANGEMENT OF MATERIALS</name>
+    <description>Describes the organization and arrangement of a collection of items.</description>
+    <subfield code="a" repeatable="true">
+      <description>Organization</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Arrangement</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Hierarchical level</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="352" repeatable="true">
+    <name>DIGITAL GRAPHIC REPRESENTATION</name>
+    <description>A description of the method of referencing and the mechanism used to represent graphic information in a data set. This information consists of the type of storage technique used, the number of items in the data set, and the format in which the data is stored.</description>
+    <subfield code="a" repeatable="false">
+      <description>Direct reference method</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Object type</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Object count</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Row count</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Column count</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Vertical count</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>VPF topology level</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Indirect reference description</description>
+    </subfield>
+    <subfield code="q" repeatable="true">
+      <description>Format of the digital image</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="355" repeatable="true">
+    <name>SECURITY CLASSIFICATION CONTROL</name>
+    <description>Specifics pertaining to the security classification associated with the document, title, abstract, contents note, and/or the author. In addition, it can contain handling instructions and external dissemination information pertaining to the dissemination of the document, title, abstract, contents note, and author. The field may also contain downgrading or declassification data, the name of the classification system, and a country of origin code. Code from: MARC Code List for Countries</description>
+    <indicator position="1" value="0">
+      <description>Document</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Title</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Abstract</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Contents note</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Author</description>
+    </indicator>
+    <indicator position="1" value="5">
+      <description>Record</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>Other element</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Security classification</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Handling instructions</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>External dissemination information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Downgrading or declassification event</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Classification system</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Country of origin code</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Downgrading date</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Declassification date</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Authorization</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="357" repeatable="false">
+    <name>ORIGINATOR DISSEMINATION CONTROL</name>
+    <description>Specifics pertaining to originator (i.e., author, producer) control of dissemination of the material in hand. Subfield $a contains a specific term denoting that the originator has control over the material.</description>
+    <subfield code="a" repeatable="false">
+      <description>Dates of publication and/or sequential designation</description>
+    </subfield>
+    <subfield code="z" repeatable="false">
+      <description>Source of information</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="362" repeatable="true">
+    <name>DATES OF PUBLICATION AND/OR SEQUENTIAL DESIGNATION</name>
+    <description>Contains the beginning/ending date(s) of an item and/or the sequential designations used on each part. Dates to be used in this field are chronological designations that identify individual issues of the continuing resource. The sequential designations are usually numeric but can be alphabetic as well. The information may be formatted or unformatted. If the date information has been obtained from a source other than the first and/or last issue of the item published, the information is given in an unformatted note and the source of the information is usually cited.</description>
+    <indicator position="1" value="0">
+      <description>Formatted style</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Unformatted note</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Dates of publication and/or sequential designation</description>
+    </subfield>
+    <subfield code="z" repeatable="false">
+      <description>Source of information</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="365" repeatable="true">
+    <name>TRADE PRICE</name>
+    <description>Contains the current price of an item or records the special export price of an item in any currency.</description>
+    <subfield code="a" repeatable="false">
+      <description>Price type code</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Price amount</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Currency code</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Unit of pricing</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Price note</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Price effective from</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Price effective until</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Tax rate 1</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Tax rate 2</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>ISO country code</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>MARC country code</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Identification of pricing entity</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of price type code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="366" repeatable="true">
+    <name>TRADE AVAILABILITY INFORMATION</name>
+    <description>Contains detailed information relating to the availability of items from publishers.</description>
+    <subfield code="a" repeatable="false">
+      <description>Publishers' compressed title identification</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Detailed date of publication</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Availability status code</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Expected next availability date</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Note</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Publishers' discount category</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Date made out of print</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>ISO country code</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>MARC country code</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Identification of agency</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of availability status code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="440" repeatable="true">
+    <name>SERIES STATEMENT/ADDED ENTRY--TITLE</name>
+    <description>A series statement consisting of a series title alone.</description>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Volume number/sequential designation</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="490" repeatable="true">
+    <name>SERIES STATEMENT</name>
+    <description>A series statement for which no series added entry is traced or for which the added entry is traced in one of the 800-830 fields in a form different from the form contained in field 490.</description>
+    <indicator position="1" value="0">
+      <description>Series not traced</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Series traced differently</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Series statement</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Library of Congress call number</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Volume number/sequential designation</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="500" repeatable="true">
+    <name>GENERAL NOTE</name>
+    <description>General information for which a specialized 5XX note field has not been defined.</description>
+    <subfield code="a" repeatable="false">
+      <description>General note</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="501" repeatable="true">
+    <name>WITH NOTE</name>
+    <description>A note that is used when more than one bibliographic work is contained in a physical item at the time of publishing, release, issue, or execution. The works usually have distinctive titles and lack a collective title.</description>
+    <subfield code="a" repeatable="false">
+      <description>With note</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="502" repeatable="true">
+    <name>DISSERTATION NOTE</name>
+    <description>The designation of an academic dissertation or thesis and the institution to which it was presented. (A note that describes the relationship of a work to a dissertation or thesis is recorded in field 500).</description>
+    <subfield code="a" repeatable="false">
+      <description>Dissertation note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="504" repeatable="true">
+    <name>BIBLIOGRAPHY, ETC. NOTE</name>
+    <description>Information on the presence of one or more bibliographies, discographies, filmographies, and/or other bibliographic references in a described item or in accompanying material.</description>
+    <subfield code="a" repeatable="false">
+      <description>Bibliography, etc. note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Number of references</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="505" repeatable="true">
+    <name>FORMATTED CONTENTS NOTE</name>
+    <description>The titles of separate works or parts of an item or the table of contents. The field may also contain statements of responsibility and volume numbers or other sequential designations.</description>
+    <indicator position="1" value="0">
+      <description>Contents</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Incomplete contents All parts of a multipart item are not listed because they were not available for analysis. Incomplete contents: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Partial contents All parts were available for analysis but only selected parts are listed. Partial contents: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Basic</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Enhanced</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Formatted contents note</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Statement of responsibility</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="506" repeatable="true">
+    <name>RESTRICTIONS ON ACCESS NOTE</name>
+    <description>Information on the restrictions that govern access to or the limited distribution of the described materials.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>No restrictions</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Restrictions apply</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Terms governing access</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Jurisdiction</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Physical access provisions</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Authorized users</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Authorization</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Standardized terminology for access restriction</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="507" repeatable="false">
+    <name>SCALE NOTE FOR GRAPHIC MATERIAL</name>
+    <description>For visual materials, this field contains the scale of architectural drawings or three-dimensional artifacts. For maps, the scale of an item is contained in this field only in pre-AACR 2 cataloging records. Scale information is contained in field 255 (Mathematical Data Area) in AACR 2 formulated records.</description>
+    <subfield code="a" repeatable="false">
+      <description>Representative fraction of scale note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Remainder of scale note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="508" repeatable="true">
+    <name>CREATION/PRODUCTION CREDITS NOTE</name>
+    <description>The names of the persons (other than members of the cast) or organizations who participated in the artistic or technical production of the work. The introductory term Credits: that customarily precedes the names is not carried in the MARC record. It may be generated based on the field tag.</description>
+    <subfield code="a" repeatable="false">
+      <description>Creation/production credits note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="510" repeatable="true">
+    <name>CITATION/REFERENCES NOTE</name>
+    <description>Citations or references to published bibliographic descriptions, reviews, abstracts, or indexes of the content of the described item.</description>
+    <indicator position="1" value="0">
+      <description>Coverage unknown The abstracting and indexing coverage is not specified. Indexed by: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Coverage complete The abstracting and indexing coverage includes references to all articles in a journal and/or all issues within each volume. Indexed in its entirety by: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Coverage is selective The abstracting and indexing coverage is selective. Indexed selectively by: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Location in source not givenReferences: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Location in source givenReferences: may be generated for display.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Name of source</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Coverage of source</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location within source</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="511" repeatable="true">
+    <name>PARTICIPANT OR PERFORMER NOTE</name>
+    <description>The names of the participants, players, narrators, presenters, or performers.</description>
+    <indicator position="1" value="0">
+      <description>No display constant generated</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>CastCast: may be generated for display.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Participant or performer note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="513" repeatable="true">
+    <name>TYPE OF REPORT AND PERIOD COVERED NOTE</name>
+    <description>Information on the type of report and the period covered by the report.</description>
+    <subfield code="a" repeatable="false">
+      <description>Type of report</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Period covered</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="514" repeatable="false">
+    <name>DATA QUALITY NOTE</name>
+    <description>Provides a general assessment of the quality of the data set constituting the item.</description>
+    <subfield code="a" repeatable="false">
+      <description>Attribute accuracy report</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Attribute accuracy value</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Attribute accuracy explanation</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Logical consistency report</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Completeness report</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Horizontal position accuracy report</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Horizontal position accuracy value</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Horizontal position accuracy explanation</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Vertical positional accuracy report</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Vertical positional accuracy value</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Vertical positional accuracy explanation</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Cloud cover</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Display note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="515" repeatable="true">
+    <name>NUMBERING PECULIARITIES NOTE</name>
+    <description>An unformatted description of irregularities and peculiarities in numbering or publishing patterns, report year coverage, revised editions, and/or issuance in parts.</description>
+    <subfield code="a" repeatable="false">
+      <description>Numbering peculiarities note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="516" repeatable="true">
+    <name>TYPE OF COMPUTER FILE OR DATA NOTE</name>
+    <description>A general descriptor that characterizes a file (e.g., text, computer program, numeric). Specific information such as the form or genre of textual material (e.g., biography, indexes) also may be included. The general type of file is coded in field 008/26 (Type of computer file).</description>
+    <indicator position="1" value="#">
+      <description>Type of file</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Type of computer file or data note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="518" repeatable="true">
+    <name>DATE/TIME AND PLACE OF AN EVENT NOTE</name>
+    <description>Textual information on the date/time and/or place of creation, capture, or broadcast associated with an event or the finding of a naturally occurring object. This information in coded form is contained in field 033 (Date/Time and Place of an Event).</description>
+    <subfield code="a" repeatable="false">
+      <description>Date/time and place of an event note</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="520" repeatable="true">
+    <name>SUMMARY, ETC.</name>
+    <description>Unformatted information that describes the scope and general contents of the materials. This could be a summary, abstract, annotation, review, or only a phrase describing the material.</description>
+    <indicator position="1" value="#">
+      <description>Summary</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Subject</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Review</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Scope and content</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Abstract</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Summary, etc. note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Expansion of summary note</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="521" repeatable="true">
+    <name>TARGET AUDIENCE NOTE</name>
+    <description>Information that identifies the specific audience or intellectual level for which the content of the described item is considered appropriate.</description>
+    <indicator position="1" value="#">
+      <description>Audience</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Reading grade level</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Interest age level</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Interest grade level</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Special audience characteristics</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Motivation interest level</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Target audience note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Source</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="522" repeatable="true">
+    <name>GEOGRAPHIC COVERAGE NOTE</name>
+    <description>Information on the geographic coverage of the described material (usually survey material). This information in coded form may be contained in field 052 (Geographic Classification Code).</description>
+    <indicator position="1" value="#">
+      <description>Geographic coverage</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Geographic coverage note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="524" repeatable="true">
+    <name>PREFERRED CITATION OF DESCRIBED MATERIALS NOTE</name>
+    <description>The format of the citation of the described materials that is preferred by the custodian.</description>
+    <indicator position="1" value="#">
+      <description>Cite as</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Preferred citation of described materials note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of schema used</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="525" repeatable="true">
+    <name>SUPPLEMENT NOTE</name>
+    <description>Information on the existence of supplements or special issues (usually unnamed) that are neither cataloged as separate records nor recorded in field 770 (Supplement/Special Issue Entry).</description>
+    <subfield code="a" repeatable="false">
+      <description>Supplement note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="526" repeatable="true">
+    <name>STUDY PROGRAM INFORMATION NOTE</name>
+    <description>A note giving the name of a study program which uses the title described in the record. Details about the study program data elements are also contained in the field. Field 526 is generally used for formal curriculum-based study or reading programs.</description>
+    <indicator position="1" value="0">
+      <description>Reading program</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Program name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Interest level</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Reading level</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Title point value</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="530" repeatable="true">
+    <name>ADDITIONAL PHYSICAL FORM AVAILABLE NOTE</name>
+    <description>Availability information concerning a different physical format in which the described item is available.</description>
+    <subfield code="a" repeatable="false">
+      <description>Additional physical form available note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Availability source</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Availability conditions</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Order number</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="533" repeatable="true">
+    <name>REPRODUCTION NOTE</name>
+    <description>Descriptive data for a reproduction of an original item when the main portion of the bibliographic record describes the original item and the data differ.</description>
+    <subfield code="a" repeatable="false">
+      <description>Type of reproduction</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Place of reproduction</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Agency responsible for reproduction</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of reproduction</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Physical description of reproduction</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Series statement of reproduction</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Dates and/or sequential designation of issues reproduced</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note about reproduction</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Fixed-length data elements of reproduction</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="534" repeatable="true">
+    <name>ORIGINAL VERSION NOTE</name>
+    <description>Descriptive data for an original item when the main portion of the bibliographic record describes a reproduction of that item and the data differ. Details relevant to the original are given in field 534.</description>
+    <subfield code="a" repeatable="false">
+      <description>Main entry of original</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition statement of original</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Publication, distribution, etc. of original</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Physical description, etc. of original</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Series statement of original</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Key title of original</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Location of original</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note about original</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Introductory phrase</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title statement of original</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="535" repeatable="true">
+    <name>LOCATION OF ORIGINALS/DUPLICATES NOTE</name>
+    <description>The name and address of the repository that has custody of the original or a duplicate copy of the described material when either is housed in a repository different from that of the material being described.</description>
+    <indicator position="1" value="1">
+      <description>Holder of originals</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Holder of duplicates</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Custodian</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Postal address</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Country</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Telecommunications address</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Repository location code</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="536" repeatable="true">
+    <name>FUNDING INFORMATION NOTE</name>
+    <description>Contract, grant, and/or project numbers when the described material is the result of a funded project. Information concerning the sponsor or funding agency also may be included.</description>
+    <subfield code="a" repeatable="false">
+      <description>Text of note</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Contract number</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Grant number</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Undifferentiated number</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Program element number</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Project number</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Task number</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Work unit number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="538" repeatable="true">
+    <name>SYSTEM DETAILS NOTE</name>
+    <description>Technical information about an item, such as the presence or absence of certain kinds of codes; or the physical characteristics of a computer file, such as recording densities, parity, blocking factors, mode of access, software programming language, computer requirements, peripheral requirements, trade name or recording systems, number of lines of resolution, and modulation frequency. For sound and videorecordings, information about the trade name or recording system(s) (e.g., VHS), modulation frequency and number of lines of resolution may be included.</description>
+    <subfield code="a" repeatable="false">
+      <description>System details note</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="540" repeatable="true">
+    <name>TERMS GOVERNING USE AND REPRODUCTION NOTE</name>
+    <description>Terms governing the use of the described materials (e.g., copyrights, film rights, trade rights) after access has been provided.</description>
+    <subfield code="a" repeatable="false">
+      <description>Terms governing use and reproduction</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Jurisdiction</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Authorization</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Authorized users</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="541" repeatable="true">
+    <name>IMMEDIATE SOURCE OF ACQUISITION NOTE</name>
+    <description>Information on the immediate source of acquisition of the described materials. The field is used primarily for original or historical items or other archival collections.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Private</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Not private</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Source of acquisition</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Address</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Method of acquisition</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of acquisition</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Accession number</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Owner</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Purchase price</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Extent</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Type of unit</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="544" repeatable="true">
+    <name>LOCATION OF OTHER ARCHIVAL MATERIALS NOTE</name>
+    <description>The name and address of the custodian of materials that, at a previous time, have been part of the same collection or record group as the described materials.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Associated materials Indicates that the other materials identified in the note have the same provenance but reside in a different repository.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Related materials Indicates that the other materials identified in the note share the sphere of activity, reside in the same repository, but have different provenance.</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Custodian</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Address</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Country</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Title</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Provenance</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="545" repeatable="true">
+    <name>BIOGRAPHICAL OR HISTORICAL DATA</name>
+    <description>Biographical information about an individual or historical information about an institution or an event used as the main entry of the bibliographic record for the described materials. When a distinction between levels of detail is required, a brief summary is given in subfield $a and a fuller annotation is given in subfield $b.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Biographical sketch</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Administrative history</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Biographical or historical note</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Expansion</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="546" repeatable="true">
+    <name>LANGUAGE NOTE</name>
+    <description>Textual information on the language of the described materials. A description of the alphabet, script, or other symbol system (e.g., arabic alphabet, ASCII, musical notation system, bar code, logarithmic graphing) may also be included. Coded language information is contained in fields 008/35-37 (Language) and/or 041 (Language code).</description>
+    <subfield code="a" repeatable="false">
+      <description>Language note</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Information code or alphabet</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="547" repeatable="true">
+    <name>FORMER TITLE COMPLEXITY NOTE</name>
+    <description>A description of the complex relationship between former titles proper whenever an intelligible note cannot be generated from the data in field 247 (Former Title).</description>
+    <subfield code="a" repeatable="false">
+      <description>Former title complexity note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="550" repeatable="true">
+    <name>ISSUING BODY NOTE</name>
+    <description>Information about the current and former issuing bodies of a continuing resource.</description>
+    <subfield code="a" repeatable="false">
+      <description>Issuing body note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="552" repeatable="true">
+    <name>ENTITY AND ATTRIBUTE INFORMATION NOTE</name>
+    <description>A description of the information content of the data set, including the entity types, their attributes, and the domains from which attribute values may be assigned.</description>
+    <subfield code="a" repeatable="false">
+      <description>Entity type label</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Entity type definition and source</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Attribute label</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Attribute definition and source</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Enumerated domain value</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Enumerated domain value definition and source</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Range domain minimum and maximum</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Codeset name and source</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Unrepresentable domain</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Attribute units of measurement and resolution</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Beginning date and ending date of attribute values</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Attribute value accuracy</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Attribute value accuracy explanation</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Attribute measurement frequency</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Entity and attribute overview</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Entity and attribute detail citation</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Display note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="555" repeatable="true">
+    <name>CUMULATIVE INDEX/FINDING AIDS NOTE</name>
+    <description>Information on the availability of cumulative indexes for continuing resources or finding aids and similar control materials for archival and manuscripts control and visual materials.</description>
+    <indicator position="1" value="#">
+      <description>IndexesIndexes: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Finding aidsFinding aids: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Cumulative index/finding aids note</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Availability source</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Degree of control</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Bibliographic reference</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="556" repeatable="true">
+    <name>INFORMATION ABOUT DOCUMENTATION NOTE</name>
+    <description>Information about the documentation of a file, e.g., codebooks that explain the content and use of the file.</description>
+    <indicator position="1" value="#">
+      <description>DocumentationDocumentation: may be generated for display.</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Information about documentation note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="561" repeatable="true">
+    <name>OWNERSHIP AND CUSTODIAL HISTORY</name>
+    <description>A copy-specific field that contains information concerning the ownership and custodial history of the described materials from the time of their creation to the time of their accessioning, including the time at which individual items or group of items were first brought together in their current arrangement or collation.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Private</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Not private</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>History</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="562" repeatable="true">
+    <name>COPY AND VERSION IDENTIFICATION NOTE</name>
+    <description>Information that distinguishes the copy or version of materials held by an archive or manuscript repository when more than one copy or version exists or could exist.</description>
+    <subfield code="a" repeatable="true">
+      <description>Identifying markings</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Copy identification</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Version identification</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Presentation format</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Number of copies</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="563" repeatable="true">
+    <name>BINDING INFORMATION</name>
+    <description>Intended primarily for use with antiquarian materials, rare books and other special collections.</description>
+    <subfield code="a" repeatable="false">
+      <description>Binding note</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="565" repeatable="true">
+    <name>CASE FILE CHARACTERISTICS NOTE</name>
+    <description>Information on the content, characteristics, and/or the number of cases or variables making up a case file or a database.</description>
+    <indicator position="1" value="#">
+      <description>File size</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Case file characteristics</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Number of cases/variables</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Name of variable</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Unit of analysis</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Universe of data</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Filing scheme or code</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="567" repeatable="true">
+    <name>METHODOLOGY NOTE</name>
+    <description>Information on significant methodological characteristics of the material, such as the algorithm, sampling procedures, or validation characteristics.</description>
+    <indicator position="1" value="#">
+      <description>Methodology</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Methodology note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="580" repeatable="true">
+    <name>LINKING ENTRY COMPLEXITY NOTE</name>
+    <description>A description of the complex relationship between the described item and other items when an intelligible note cannot be generated from data in the linking entry fields 760-787.</description>
+    <subfield code="a" repeatable="false">
+      <description>Linking entry complexity note</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="581" repeatable="true">
+    <name>PUBLICATIONS ABOUT DESCRIBED MATERIALS NOTE</name>
+    <description>A citation to or information about a publication that is a study or analysis of the described materials.</description>
+    <indicator position="1" value="#">
+      <description>Publications</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Publications about described materials note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="583" repeatable="true">
+    <name>ACTION NOTE</name>
+    <description>Contains information about processing, reference, and preservation actions.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Private</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Not private</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Action</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Action identification</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Time/date of action</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Action interval</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Contingency for action</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Authorization</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Jurisdiction</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Method of action</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Site of action</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Action agent</description>
+    </subfield>
+    <subfield code="l" repeatable="true">
+      <description>Status</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Extent</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Type of unit</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="584" repeatable="true">
+    <name>ACCUMULATION AND FREQUENCY OF USE NOTE</name>
+    <description>Information on the rates of accumulation (for continuing, open-ended accessions) and/or the rate of reference use of the described materials.</description>
+    <subfield code="a" repeatable="true">
+      <description>Accumulation</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Frequency of use</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="585" repeatable="true">
+    <name>EXHIBITIONS NOTE</name>
+    <description>A copy-specific field that contains a citation to an exhibition where the described materials have been shown.</description>
+    <subfield code="a" repeatable="false">
+      <description>Exhibitions note</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="586" repeatable="true">
+    <name>AWARDS NOTE</name>
+    <description>Information on awards associated with the described item.</description>
+    <indicator position="1" value="#">
+      <description>Awards</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Awards note</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="59X" repeatable="false">
+    <name/>
+    <description>The 590-599 fields are reserved for local use and local definition.</description>
+    <indicator position="1" value="0">
+      <description>Forename</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Surname</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Family name</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Personal name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Numeration</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Titles and other words associated with a name</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Dates associated with a name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Attribution qualifier</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Fuller form of name</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="600" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--PERSONAL NAME</name>
+    <description>A subject added entry in which the entry element is a personal name.</description>
+    <indicator position="1" value="0">
+      <description>Forename</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Surname</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Family name</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Personal name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Numeration</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Titles and other words associated with a name</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Dates associated with a name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Attribution qualifier</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Fuller form of name</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="610" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--CORPORATE NAME</name>
+    <description>A subject added entry in which the entry element is a corporate name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Corporate name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of meeting or treaty signing</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="611" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--MEETING NAME</name>
+    <description>A subject added entry in which the entry element is a meeting name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Meeting name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of meeting</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Name of meeting following jurisdiction name entry element</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="630" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--UNIFORM TITLE</name>
+    <description>A subject added entry in which the entry element is a uniform title.</description>
+    <indicator position="1" value="0-9">
+      <description>Number of nonfiling characters A value that indicates the number of character positions associated with an initial definite or indefinite article at the beginning of a uniform title field that are to be disregarded in sorting and filing processes.</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="648" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--CHRONOLOGICAL TERM</name>
+    <description>A subject added entry in which the entry element is a chronological term.</description>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Chronological term</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="650" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--TOPICAL TERM</name>
+    <description>A subject added entry in which the entry element is a topical term.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>No level specified The level of the term could be determined but is not specified.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Primary The term describes the main focus or subject content of the material.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Secondary The subject term describes a less important aspect of the content of the material.</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Topical term or geographic name entry element</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Topical term following geographic name entry element</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of event</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Active dates</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="651" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--GEOGRAPHIC NAME</name>
+    <description>A subject added entry in which the entry element is a geographic name.</description>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject added entry conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH) and the Name authority files.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject added entry conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject added entry conforms to the NLM authority files.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject added entry conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject added entry conforms to and is appropriate for use in the Canadian Subject Headings and the LAC authority files.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject added entry conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re and the LAC authority fields</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Geographic name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="653" repeatable="true">
+    <name>INDEX TERM--UNCONTROLLED</name>
+    <description>An index term added entry that is not constructed by standard subject heading/thesaurus-building conventions.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>No level specified The level of the term could be determined but is not specified.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Primary The term describes the main focus or subject content of the material.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Secondary The subject term describes a less important aspect of the content of the material.</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Uncontrolled term</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="654" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--FACETED TOPICAL TERMS</name>
+    <description>A topical subject constructed from a faceted vocabulary.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>No level specified The level of the term could be determined but is not specified.</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Primary The term describes the main focus or subject content of the material.</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Secondary The subject term describes a less important aspect of the content of the material.</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Focus term</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Non-focus term</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Facet/hierarchy designation</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="655" repeatable="true">
+    <name>INDEX TERM--GENRE/FORM</name>
+    <description>Terms indicating the genre, form, and/or physical characteristics of the materials being described. A genre term designates the style or technique of the intellectual content of textual materials or, for graphic materials, aspects such as vantage point, intended purpose, or method of representation. A form term designates historically and functionally specific kinds of materials distinguished by their physical character, the subject of their intellectual content, or the order of information within them. Physical characteristic terms designate historically and functionally specific kinds of materials as distinguished by an examination of their physical character, subject of their intellectual content, or the order of information with them.</description>
+    <indicator position="1" value="#">
+      <description>Basic</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Faceted</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Library of Congress Subject Headings The subject index term conforms to and is appropriate for use in the Library of Congress Subject Headings (LCSH).</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>LC subject headings for children's literature The subject index term conforms to the "AC Subject Headings" section of the LCSH and is appropriate for use in the LC Annotated Card Program.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Medical Subject Headings The subject index term conforms to the NLM subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>National Agricultural Library subject authority file The subject added entry conforms to the NAL subject authority file.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Source not specified The subject index term conforms to a controlled list that cannot be identified by another defined value or by a code in subfield $2.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Canadian Subject Headings The subject index term conforms to and is appropriate for use in the Canadian Subject Headings that is maintained by the National Library of Canada.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re The subject index term conforms to and is appropriate for use in the R&#xC3;&#xA9;pertoire de vedettes-mati&#xC3;&#xA8;re.</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Genre/form data or focus term</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Non-focus term</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Facet/hierarchy designation</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="656" repeatable="true">
+    <name>INDEX TERM--OCCUPATION</name>
+    <description>An index term that is descriptive of the occupation reflected in the contents of the described materials.</description>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Occupation</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Form</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="657" repeatable="true">
+    <name>INDEX TERM--FUNCTION</name>
+    <description>An index term that is descriptive of the activity or function that generated the described materials.</description>
+    <indicator position="2" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Function</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Form subdivision</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>General subdivision</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Chronological subdivision</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Geographic subdivision</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="658" repeatable="true">
+    <name>INDEX TERM--CURRICULUM OBJECTIVE</name>
+    <description>Index terms denoting curriculum or course-of-study objectives applicable to the content of the described materials. The field may also contain correlation factors indicating the degree to which the described materials meet an objective. Codes assigned to specific objectives in published lists are also recorded in this field.</description>
+    <subfield code="a" repeatable="false">
+      <description>Main curriculum objective</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Subordinate curriculum objective</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Curriculum code</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Correlation factor</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of term or code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="662" repeatable="true">
+    <name>SUBJECT ADDED ENTRY--HIERARCHICAL PLACE NAME</name>
+    <description>Contains a hierarchical form of a geographic name used as a subject added entry.</description>
+    <subfield code="a" repeatable="true">
+      <description>Country or larger entity</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>First-order political jurisdiction</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Intermediate political jurisdiction</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>City</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>City subsection</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Other nonjurisdictional geographic region and feature</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Extraterrestrial area</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="700" repeatable="true">
+    <name>ADDED ENTRY--PERSONAL NAME</name>
+    <description>An added entry in which the entry element is a personal name.</description>
+    <indicator position="1" value="0">
+      <description>Forename</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Surname</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Family name</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Analytical entry The item represented by the added entry is contained in the item described by the bibliographic record.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Personal name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Numeration</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Titles and other words associated with a name</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Dates associated with a name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Attribution qualifier</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Fuller form of name</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="710" repeatable="true">
+    <name>ADDED ENTRY--CORPORATE NAME</name>
+    <description>An added entry in which the entry element is a corporate name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Analytical entry The item represented by the added entry is contained in the item described by the bibliographic record.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Corporate name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of meeting or treaty signing</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="711" repeatable="true">
+    <name>ADDED ENTRY--MEETING NAME</name>
+    <description>An added entry in which the entry element is a meeting name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Analytical entry The item represented by the added entry is contained in the item described by the bibliographic record.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Meeting name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of meeting</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Name of meeting following jurisdiction name entry element</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="720" repeatable="true">
+    <name>ADDED ENTRY--UNCONTROLLED NAME</name>
+    <description>An added entry in which the name is not controlled in an authority file or list. It is also used for names that have not been formulated according to cataloging rules. Names may be of any type (e.g., personal, corporate, meeting).</description>
+    <indicator position="1" value="#">
+      <description>Not specified</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Personal</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Other</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="730" repeatable="true">
+    <name>ADDED ENTRY--UNIFORM TITLE</name>
+    <description>Contains a related or an analytical title that is controlled by an authority file or list.</description>
+    <indicator position="1" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Analytical entry The item represented by the added entry is contained in the item described by the bibliographic record.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="740" repeatable="true">
+    <name>ADDED ENTRY--UNCONTROLLED RELATED/ANALYTICAL TITLE</name>
+    <description>Contains related or analytical titles that are not controlled through an authority file or list. (If related or analytical titles are controlled by an authority file, use field 730 (Added entry - uniform title)).</description>
+    <indicator position="1" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Analytical entry The item represented by the added entry is contained in the item described by the bibliographic record.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uncontrolled related/analytical title</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="5" repeatable="false">
+      <description>Institution to which field applies</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="752" repeatable="true">
+    <name>ADDED ENTRY--HIERARCHICAL PLACE NAME</name>
+    <description>An added entry in which the entry element is a hierarchical form of place name that is related to a particular attribute of the described item, e.g., the place of publication for a rare book. For display, a dash (--) may be generated to separate the subelements of the place name, e.g., Canada -- British Columbia -- Vancouver.</description>
+    <subfield code="a" repeatable="true">
+      <description>Country or larger entity</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>First-order political jurisdiction</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Intermediate political jurisdiction</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>City</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>City subsection</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Other nonjurisdictional geographic region and feature</description>
+    </subfield>
+    <subfield code="h" repeatable="true">
+      <description>Extraterrestrial area</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of heading or term</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="753" repeatable="true">
+    <name>SYSTEM DETAILS ACCESS TO COMPUTER FILES</name>
+    <description>Information on the technical aspects of a computer file and any accompanying material that may be used to select and arrange the record with other records in a printed index.</description>
+    <subfield code="a" repeatable="false">
+      <description>Make and model of machine</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Programming language</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Operating system</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="754" repeatable="true">
+    <name>ADDED ENTRY--TAXONOMIC IDENTIFICATION</name>
+    <description>An added entry in which the entry element is the taxonomic name or category associated with the described item.</description>
+    <subfield code="a" repeatable="true">
+      <description>Taxonomic name</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Taxonomic category</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Common or alternative name</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Non-public note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of taxonomic identification</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="762" repeatable="true">
+    <name>SUBSERIES ENTRY</name>
+    <description>Information concerning a related subseries when the target item is a main series or a parent subseries (vertical relationship). When a note is generated from this field, the introductory phrase Has subseries: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Has subseries</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="765" repeatable="true">
+    <name>ORIGINAL LANGUAGE ENTRY</name>
+    <description>Information concerning the publication in its original language when the target item is a translation (horizontal relationship). When a note is generated from this field, the introductory phrase Translation of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Translation of</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="767" repeatable="true">
+    <name>TRANSLATION ENTRY</name>
+    <description>Information concerning the publication in some other language other than the original when the target item is in the original language or is another translation (horizontal relationship). When a note is generated from this field, the introductory phrase Translated as: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Translated as</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="770" repeatable="true">
+    <name>SUPPLEMENT/SPECIAL ISSUE ENTRY</name>
+    <description>Information concerning the supplement or special issue associated with the target item but cataloged and/or input as a separate record (vertical relationship). When a note is generated from this field, the introductory phrase Has supplement: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Has supplement</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="772" repeatable="true">
+    <name>SUPPLEMENT PARENT ENTRY</name>
+    <description>Information concerning the related parent record when the target item is a single issue, supplement or special issue (vertical relationship) of the parent item. When a note is generated from this field, the introductory phrase Supplement to: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Supplement to</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Parent</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="773" repeatable="true">
+    <name>HOST ITEM ENTRY</name>
+    <description>Information concerning the host item for the constituent unit described in the record (vertical relationship). In the case of host items that are serial or multi-volume in nature, information in subfields $g and $q is necessary to point to the exact location of the component part within the bibliographic item.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>In</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Abbreviated title</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Enumeration and first page</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="774" repeatable="true">
+    <name>CONSTITUENT UNIT ENTRY</name>
+    <description>Information concerning a constituent unit associated with a larger bibliographic unit (vertical relationship). When a note is generated from this field, the introductory term Constituent unit: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Constituent unit</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="775" repeatable="true">
+    <name>OTHER EDITION ENTRY</name>
+    <description>The entry for another available edition of the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Other editions available: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Other edition available</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="e" repeatable="false">
+      <description>Language code</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Country code</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="776" repeatable="true">
+    <name>ADDITIONAL PHYSICAL FORM ENTRY</name>
+    <description>Information concerning another available physical form of the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Available in other form: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Available in another form</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="777" repeatable="true">
+    <name>ISSUED WITH ENTRY</name>
+    <description>Information concerning the publication that is separately cataloged but that is issued with or included in the target item (horizontal relationship). When a note is generated from this field, the introductory phrase Issued with: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Issued with</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="780" repeatable="true">
+    <name>PRECEDING ENTRY</name>
+    <description>Information concerning the immediate predecessor of the target item (chronological relationship). When a note is generated from this field, the introductory term or phrase may be generated based on the value in the second indicator position for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>ContinuesContinues: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Continues in partContinues in part: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>SupersedesSupersedes: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>Supersedes in partSupersedes in part: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Formed by the union of... and ...Formed by the union:... and ... may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>AbsorbedAbsorbed: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>Absorbed in partAbsorbed in part: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Separated fromSeparated from: may be generated for display.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="785" repeatable="true">
+    <name>SUCCEEDING ENTRY</name>
+    <description>Information concerning the immediate successor to the target item (chronological relationship). When a note is generated from this field, the introductory phrase may be generated based on the value in the second indicator position for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Continued byContinued by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Continued in part byContinued in part by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Superseded bySuperseded by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="3">
+      <description>Superseded in part bySuperseded in part by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="4">
+      <description>Absorbed byAbsorbed by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="5">
+      <description>Absorbed in part byAbsorbed in part by: may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="6">
+      <description>Split into... and...Split into:... and... may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="7">
+      <description>Merged with... to form ...Merged with:... to form... may be generated for display.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>Changed back toChanged back to: may be generated for display.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="786" repeatable="true">
+    <name>DATA SOURCE ENTRY</name>
+    <description>Information pertaining to a data source to which the described item is related. It may contain information about other files, printed sources, or collection procedures.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Data source</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Period of content</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Abbreviated title</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Source Contribution</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="787" repeatable="true">
+    <name>NONSPECIFIC RELATIONSHIP ENTRY</name>
+    <description>Information concerning the work related to the target item when the relationship does not fit any of those defined in fields 760-785.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Related item</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Series data for related item</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="r" repeatable="true">
+      <description>Report number</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Standard Technical Report Number</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>International Standard Book Number</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="760" repeatable="true">
+    <name>MAIN SERIES ENTRY</name>
+    <description>Information concerning the related main series when the target item is a subseries (vertical relationship). When a note is generated from this field, the introductory phrase Main series: or Subseries of: may be generated based on the field tag for display.</description>
+    <indicator position="1" value="0">
+      <description>Display note</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Do not display note A textual note is contained in field 580 (Linking Entry Complexity Note).</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>Main series</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Main entry heading</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Edition</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Qualifying information</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Place, publisher, and date of publication</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Relationship information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Physical description</description>
+    </subfield>
+    <subfield code="i" repeatable="false">
+      <description>Display text</description>
+    </subfield>
+    <subfield code="m" repeatable="false">
+      <description>Material-specific details</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Note</description>
+    </subfield>
+    <subfield code="o" repeatable="true">
+      <description>Other item identifier</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="false">
+      <description>International Standard Serial Number</description>
+    </subfield>
+    <subfield code="y" repeatable="false">
+      <description>CODEN designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="7" repeatable="false">
+      <description>Control subfield</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="$7" repeatable="false">
+    <name>Control subfield</name>
+    <description>$8 - Field link and sequence number (R) See Control Subfields</description>
+  </field>
+  <field tag="800" repeatable="true">
+    <name>SERIES ADDED ENTRY--PERSONAL NAME</name>
+    <description>An author/title series added entry in which the author portion is a personal name.</description>
+    <indicator position="1" value="0">
+      <description>Forename</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Surname</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Family name</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Personal name</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Numeration</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Titles and other words associated with a name</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Dates associated with a name</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Attribution qualifier</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Fuller form of name</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Volume/sequential designation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="810" repeatable="true">
+    <name>SERIES ADDED ENTRY--CORPORATE NAME</name>
+    <description>An author/title series added entry in which the author portion is a corporate name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Corporate name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of meeting or treaty signing</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Volume/sequential designation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="811" repeatable="true">
+    <name>SERIES ADDED ENTRY--MEETING NAME</name>
+    <description>An author/title series added entry in which the author portion is a meeting name.</description>
+    <indicator position="1" value="0">
+      <description>Inverted name</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Jurisdiction name</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Name in direct order</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Meeting name or jurisdiction name as entry element</description>
+    </subfield>
+    <subfield code="c" repeatable="false">
+      <description>Location of meeting</description>
+    </subfield>
+    <subfield code="d" repeatable="false">
+      <description>Date of meeting</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Subordinate unit</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="j" repeatable="true">
+      <description>Relator term</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section/meeting</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Name of meeting following jurisdiction name entry element</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="u" repeatable="false">
+      <description>Affiliation</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Volume/sequential designation</description>
+    </subfield>
+    <subfield code="4" repeatable="true">
+      <description>Relator code</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="830" repeatable="true">
+    <name>SERIES ADDED ENTRY--UNIFORM TITLE</name>
+    <description>A series added entry consisting of a series title alone.</description>
+    <indicator position="2" value="0-9">
+      <description>Number of nonfiling characters</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Uniform title</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Date of treaty signing</description>
+    </subfield>
+    <subfield code="f" repeatable="false">
+      <description>Date of a work</description>
+    </subfield>
+    <subfield code="g" repeatable="false">
+      <description>Miscellaneous information</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Medium</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Form subheading</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Language of a work</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Medium of performance for music</description>
+    </subfield>
+    <subfield code="n" repeatable="true">
+      <description>Number of part/section of a work</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Arranged statement for music</description>
+    </subfield>
+    <subfield code="p" repeatable="true">
+      <description>Name of part/section of a work</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Key for music</description>
+    </subfield>
+    <subfield code="s" repeatable="false">
+      <description>Version</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Title of a work</description>
+    </subfield>
+    <subfield code="v" repeatable="false">
+      <description>Volume/sequential designation</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="841" repeatable="false">
+    <name>HOLDINGS CODED DATA VALUES</name>
+    <description>[Described in full under field 841 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="842" repeatable="false">
+    <name>TEXTUAL PHYSICAL FORM DESIGNATOR</name>
+    <description>[Described in full under field 842 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="843" repeatable="true">
+    <name>REPRODUCTION NOTE</name>
+    <description>[Described in full under field 843 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="844" repeatable="false">
+    <name>NAME OF UNIT</name>
+    <description>[Described in full under field 844 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="845" repeatable="true">
+    <name>TERMS GOVERNING USE AND REPRODUCTION NOTE</name>
+    <description>[Described in full under field 845 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="850" repeatable="true">
+    <name>HOLDING INSTITUTION</name>
+    <description>Information concerning holdings of the described item by the specified institution.</description>
+    <subfield code="a" repeatable="true">
+      <description>Holding institution</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="852" repeatable="true">
+    <name>LOCATION</name>
+    <description>Identifies the organization holding the item or from which it is available. May also contain detailed information about how to locate the item in a collection.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Library of Congress classification</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Dewey Decimal classification</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>National Library of Medicine classification</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Superintendent of Documents classification</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>Shelving control number</description>
+    </indicator>
+    <indicator position="1" value="5">
+      <description>Title Indicates that the item is shelved by a title. If necessary, this title is contained in subfield $l (Shelving form of title).</description>
+    </indicator>
+    <indicator position="1" value="6">
+      <description>Shelved separately</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Source specified in subfield $2</description>
+    </indicator>
+    <indicator position="1" value="8">
+      <description>Other scheme</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Not enumeration</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Primary enumeration This value is also used when only one numbering scheme is applicable.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Alternative enumeration Item carries two numbering schemes and is shelved by the secondary scheme.</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Location</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Sublocation or collection</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Shelving location</description>
+    </subfield>
+    <subfield code="e" repeatable="true">
+      <description>Address</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Coded location qualifier</description>
+    </subfield>
+    <subfield code="g" repeatable="true">
+      <description>Non-coded location qualifier</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Classification part</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Item part</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Shelving control number</description>
+    </subfield>
+    <subfield code="k" repeatable="true">
+      <description>Call number prefix</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Shelving form of title</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Call number suffix</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Country code</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Piece designation</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Piece physical condition</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>Copyright article-fee code</description>
+    </subfield>
+    <subfield code="t" repeatable="false">
+      <description>Copy number</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of classification or shelving scheme</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="false">
+      <description>Sequence number</description>
+    </subfield>
+  </field>
+  <field tag="853" repeatable="true">
+    <name>CAPTIONS AND PATTERN--BASIC BIBLIOGRAPHIC UNIT</name>
+    <description>[Described in full under field 853 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Email Access to the electronic resource is through electronic mail (email).</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>FTP</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Remote login (Telnet)</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Dial-up Indicates that access to the electronic resource is through a conventional telephone line.</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>HTTP Indicates that access to the electronic resource is through the Hypertext Transfer Protocol.</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Method specified in subfield $2</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Resource Indicates that the electronic location in field 856 is for the same resource described by the record as a whole. In this case, the item represented by the bibliographic record is an electronic resource. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Version of resource Indicates that the location in field 856 is for an electronic version of the resource described by the record. In this case, the item represented by the bibliographic record is not electronic but an electronic version is available. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Related resource Indicates that the location in field 856 is for an electronic resource that is related to the item described by the record. In this case, the item represented by the bibliographic record is not the electronic resource itself. Subfield $3 can be used to further characterize the relationship between the electronic item identified in field 856 and the item represented by the bibliographic record as a whole.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Host name</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Access number</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Compression information</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Path</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Electronic name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Processor of request</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Instruction</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Bits per second</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Password</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Logon</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Contact for access assistance</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Name of location of host</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Operating system</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Port</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Electronic format type</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Settings</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>File size</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Terminal emulation</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Hours access method available</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Link text</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Access method</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="854" repeatable="true">
+    <name>CAPTIONS AND PATTERN--SUPPLEMENTARY MATERIAL</name>
+    <description>[Described in full under field 854 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Email Access to the electronic resource is through electronic mail (email).</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>FTP</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Remote login (Telnet)</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Dial-up Indicates that access to the electronic resource is through a conventional telephone line.</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>HTTP Indicates that access to the electronic resource is through the Hypertext Transfer Protocol.</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Method specified in subfield $2</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Resource Indicates that the electronic location in field 856 is for the same resource described by the record as a whole. In this case, the item represented by the bibliographic record is an electronic resource. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Version of resource Indicates that the location in field 856 is for an electronic version of the resource described by the record. In this case, the item represented by the bibliographic record is not electronic but an electronic version is available. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Related resource Indicates that the location in field 856 is for an electronic resource that is related to the item described by the record. In this case, the item represented by the bibliographic record is not the electronic resource itself. Subfield $3 can be used to further characterize the relationship between the electronic item identified in field 856 and the item represented by the bibliographic record as a whole.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Host name</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Access number</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Compression information</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Path</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Electronic name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Processor of request</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Instruction</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Bits per second</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Password</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Logon</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Contact for access assistance</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Name of location of host</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Operating system</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Port</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Electronic format type</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Settings</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>File size</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Terminal emulation</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Hours access method available</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Link text</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Access method</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="855" repeatable="true">
+    <name>CAPTIONS AND PATTERN--INDEXES</name>
+    <description>[Described in full under field 855 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Email Access to the electronic resource is through electronic mail (email).</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>FTP</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Remote login (Telnet)</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Dial-up Indicates that access to the electronic resource is through a conventional telephone line.</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>HTTP Indicates that access to the electronic resource is through the Hypertext Transfer Protocol.</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Method specified in subfield $2</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Resource Indicates that the electronic location in field 856 is for the same resource described by the record as a whole. In this case, the item represented by the bibliographic record is an electronic resource. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Version of resource Indicates that the location in field 856 is for an electronic version of the resource described by the record. In this case, the item represented by the bibliographic record is not electronic but an electronic version is available. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Related resource Indicates that the location in field 856 is for an electronic resource that is related to the item described by the record. In this case, the item represented by the bibliographic record is not the electronic resource itself. Subfield $3 can be used to further characterize the relationship between the electronic item identified in field 856 and the item represented by the bibliographic record as a whole.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Host name</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Access number</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Compression information</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Path</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Electronic name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Processor of request</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Instruction</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Bits per second</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Password</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Logon</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Contact for access assistance</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Name of location of host</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Operating system</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Port</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Electronic format type</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Settings</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>File size</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Terminal emulation</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Hours access method available</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Link text</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Access method</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="856" repeatable="true">
+    <name>ELECTRONIC LOCATION AND ACCESS</name>
+    <description>The information needed to locate and access an electronic resource. The field may be used in a bibliographic record for a resource when that resource or a subset of it is available electronically. In addition, it may be used to locate and access an electronic version of a non-electronic resource described in the bibliographic record or a related electronic resource.</description>
+    <indicator position="1" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="1" value="0">
+      <description>Email Access to the electronic resource is through electronic mail (email).</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>FTP</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Remote login (Telnet)</description>
+    </indicator>
+    <indicator position="1" value="3">
+      <description>Dial-up Indicates that access to the electronic resource is through a conventional telephone line.</description>
+    </indicator>
+    <indicator position="1" value="4">
+      <description>HTTP Indicates that access to the electronic resource is through the Hypertext Transfer Protocol.</description>
+    </indicator>
+    <indicator position="1" value="7">
+      <description>Method specified in subfield $2</description>
+    </indicator>
+    <indicator position="2" value="#">
+      <description>No information provided</description>
+    </indicator>
+    <indicator position="2" value="0">
+      <description>Resource Indicates that the electronic location in field 856 is for the same resource described by the record as a whole. In this case, the item represented by the bibliographic record is an electronic resource. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="1">
+      <description>Version of resource Indicates that the location in field 856 is for an electronic version of the resource described by the record. In this case, the item represented by the bibliographic record is not electronic but an electronic version is available. If the data in field 856 relates to a constituent unit of the resource represented by the record, subfield $3 is used to specify the portion(s) to which the field applies.</description>
+    </indicator>
+    <indicator position="2" value="2">
+      <description>Related resource Indicates that the location in field 856 is for an electronic resource that is related to the item described by the record. In this case, the item represented by the bibliographic record is not the electronic resource itself. Subfield $3 can be used to further characterize the relationship between the electronic item identified in field 856 and the item represented by the bibliographic record as a whole.</description>
+    </indicator>
+    <indicator position="2" value="8">
+      <description>No display constant generated</description>
+    </indicator>
+    <subfield code="a" repeatable="true">
+      <description>Host name</description>
+    </subfield>
+    <subfield code="b" repeatable="true">
+      <description>Access number</description>
+    </subfield>
+    <subfield code="c" repeatable="true">
+      <description>Compression information</description>
+    </subfield>
+    <subfield code="d" repeatable="true">
+      <description>Path</description>
+    </subfield>
+    <subfield code="f" repeatable="true">
+      <description>Electronic name</description>
+    </subfield>
+    <subfield code="h" repeatable="false">
+      <description>Processor of request</description>
+    </subfield>
+    <subfield code="i" repeatable="true">
+      <description>Instruction</description>
+    </subfield>
+    <subfield code="j" repeatable="false">
+      <description>Bits per second</description>
+    </subfield>
+    <subfield code="k" repeatable="false">
+      <description>Password</description>
+    </subfield>
+    <subfield code="l" repeatable="false">
+      <description>Logon</description>
+    </subfield>
+    <subfield code="m" repeatable="true">
+      <description>Contact for access assistance</description>
+    </subfield>
+    <subfield code="n" repeatable="false">
+      <description>Name of location of host</description>
+    </subfield>
+    <subfield code="o" repeatable="false">
+      <description>Operating system</description>
+    </subfield>
+    <subfield code="p" repeatable="false">
+      <description>Port</description>
+    </subfield>
+    <subfield code="q" repeatable="false">
+      <description>Electronic format type</description>
+    </subfield>
+    <subfield code="r" repeatable="false">
+      <description>Settings</description>
+    </subfield>
+    <subfield code="s" repeatable="true">
+      <description>File size</description>
+    </subfield>
+    <subfield code="t" repeatable="true">
+      <description>Terminal emulation</description>
+    </subfield>
+    <subfield code="u" repeatable="true">
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+    <subfield code="v" repeatable="true">
+      <description>Hours access method available</description>
+    </subfield>
+    <subfield code="w" repeatable="true">
+      <description>Record control number</description>
+    </subfield>
+    <subfield code="x" repeatable="true">
+      <description>Nonpublic note</description>
+    </subfield>
+    <subfield code="y" repeatable="true">
+      <description>Link text</description>
+    </subfield>
+    <subfield code="z" repeatable="true">
+      <description>Public note</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Access method</description>
+    </subfield>
+    <subfield code="3" repeatable="false">
+      <description>Materials specified</description>
+    </subfield>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="8" repeatable="true">
+      <description>Field link and sequence number</description>
+    </subfield>
+  </field>
+  <field tag="863" repeatable="true">
+    <name>ENUMERATION AND CHRONOLOGY--BASIC BIBLIOGRAPHIC UNIT</name>
+    <description>[Described in full under field 863 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="864" repeatable="true">
+    <name>ENUMERATION AND CHRONOLOGY--SUPPLEMENTARY MATERIAL</name>
+    <description>[Described in full under field 864 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="865" repeatable="true">
+    <name>ENUMERATION AND CHRONOLOGY--INDEXES</name>
+    <description>[Described in full under field 865 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="866" repeatable="true">
+    <name>TEXTUAL HOLDINGS--BASIC BIBLIOGRAPHIC UNIT</name>
+    <description>[Described in full under field 866 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="867" repeatable="true">
+    <name>TEXTUAL HOLDINGS--SUPPLEMENTARY MATERIAL</name>
+    <description>[Described in full under field 867 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="868" repeatable="true">
+    <name>TEXTUAL HOLDINGS--INDEXES</name>
+    <description>[Described in full under field 868 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="876" repeatable="true">
+    <name>ITEM INFORMATION--BASIC BIBLIOGRAPHIC UNIT</name>
+    <description>[Described in full under field 876 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="877" repeatable="true">
+    <name>ITEM INFORMATION--SUPPLEMENTARY MATERIAL</name>
+    <description>[Described in full under field 877 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="878" repeatable="true">
+    <name>ITEM INFORMATION--INDEXES</name>
+    <description>[Described in full under field 878 in the MARC 21 Concise Format for Holdings Data.]</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="880" repeatable="true">
+    <name>ALTERNATE GRAPHIC REPRESENTATION</name>
+    <description>The fully content-designated representation, in a different script, of another field in the same record. Field 880 is linked to the associated regular field by subfield $6 (Linkage). The first and second indicator positions in field 880 have the same definition and values as the indicators in the associated field. The subfield codes in field 880 are the same as those defined in the associated field except for subfield $6. The data in field 880 may be in more than one script.</description>
+    <subfield code="6" repeatable="false">
+      <description>Linkage</description>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+    <subfield code="" repeatable="false">
+      <description/>
+    </subfield>
+  </field>
+  <field tag="886" repeatable="true">
+    <name>FOREIGN MARC INFORMATION FIELD</name>
+    <description>Used when converting foreign MARC records into the MARC format. Contains data from a foreign MARC record for which there is no corresponding MARC field.</description>
+    <indicator position="1" value="0">
+      <description>Leader</description>
+    </indicator>
+    <indicator position="1" value="1">
+      <description>Variable control fields (002-009)</description>
+    </indicator>
+    <indicator position="1" value="2">
+      <description>Variable data fields (010-999)</description>
+    </indicator>
+    <subfield code="a" repeatable="false">
+      <description>Tag of the foreign MARC field</description>
+    </subfield>
+    <subfield code="b" repeatable="false">
+      <description>Content of the foreign MARC field</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of data</description>
+    </subfield>
+    <subfield code="a" repeatable="true">
+      <description>Foreign MARC subfield</description>
+    </subfield>
+    <subfield code="0" repeatable="true">
+      <description>Foreign MARC subfield</description>
+    </subfield>
+  </field>
+  <field tag="887" repeatable="true">
+    <name>NON-MARC INFORMATION FIELD</name>
+    <description>Contains data from non-MARC records for which there are no corresponding MARC 21 fields. Used when converting non-MARC records into the MARC 21 format.</description>
+    <subfield code="a" repeatable="false">
+      <description>Content of non-MARC field</description>
+    </subfield>
+    <subfield code="2" repeatable="false">
+      <description>Source of data</description>
+    </subfield>
+  </field>
+</fields>
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/multiclass_search_help.html b/Open-ILS/xul/staff_client/server/locale/en-US/multiclass_search_help.html
new file mode 100644 (file)
index 0000000..98d8aaa
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title>Multiclass Search Help</title></head>
+<body onload="window.focus()">
+    <h1>Multiclass Search Help</h1>
+<p>
+Recognized search keys include:
+</p>
+<table border='1'>
+<thead>
+    <tr><th>Search key</th><th>Definition</th></tr>
+</thead>
+<tfoot>
+    <tr><td colspan="2">
+            <strong>keyword</strong>, <strong>title</strong>,
+            <strong>author</strong>, <strong>subject</strong>, and
+            <strong>series</strong> support additional search subclasses,
+            specified with a <kbd>|</kbd>. For example:
+            <kbd>title|proper:gone with the wind</kbd>
+        </td>
+    </tr>
+</tfoot>
+<tbody>
+    <tr><td>keyword/kw</td><td>search keyword(s)</td></tr>
+    <tr><td>author/au/name</td><td>search author(s)</td></tr>
+    <tr><td>title/ti</td><td>search title</td></tr>
+    <tr><td>subject/su</td><td>search subject</td></tr>
+    <tr><td>series/se</td><td>search series</td></tr>
+    <tr><td>lang</td><td>limit by language (specifiy multiple langs with lang:l1 lang:l2 ...)</td></tr>
+    <tr><td>site</td><td>search at specified org unit, corresponds to actor.org_unit.shortname</td></tr>
+    <tr><td>sort</td><td>sort type (title, author, pubdate)</td></tr>
+    <tr><td>dir</td><td>sort direction (asc, desc)</td></tr>
+    <tr><td>available</td><td>if set to anything other than "false" or "0", limits to available items</td></tr>
+</tbody>
+</table>
+</body>
+</html>
diff --git a/Open-ILS/xul/staff_client/server/locale/fr-CA/marcedit-tooltips.xml b/Open-ILS/xul/staff_client/server/locale/fr-CA/marcedit-tooltips.xml
new file mode 100644 (file)
index 0000000..f83b854
--- /dev/null
@@ -0,0 +1,9444 @@
+<?xml version='1.0' encoding='utf-8'?>
+<fields>
+  <field repeatable='false' tag='001'>
+    <name>Numéro de contrôle</name>
+    <description>Cette zone contient le numéro de contrôle attribué par l'organisme qui a créé, utilisé ou distribué la notice. On trouve le code MARC qui identifie le numéro de contrôle du système dans la zone 001 et le numéro de contrôle, dans la zone 003 (Identité du numéro de contrôle).</description>
+  </field>
+  <field repeatable='false' tag='003'>
+    <name>Identité du numéro de contrôle</name>
+    <description>Cette zone contient le code MARC de l'organisme dont le numéro de contrôle de système est inscrit dans la zone 001 (Numéro de contrôle).</description>
+  </field>
+  <field repeatable='false' tag='005'>
+    <name>Date/heure de la dernière transaction</name>
+    <description>Cette zone comporte 16 caractères indiquant la date et l'heure de la dernière transaction portant sur une notice. La date et l'heure servent d'identificateur de version de la notice. On enregistre la date conformément à la Représentation de la date et de l'heure (ISO 8601). La date comprend huit caractères numériques disposés selon le format aaaammjj(soit quatre pour l'année, deux pour le mois et deux pour le jour). L'heure comprend huit caractères numériques disposés selon le format hhmmss.f, (soit deux pour l'heure, deux pour les minutes, deux pour les secondes et deux pour la fraction décimale des secondes, y compris le point décimal). On utilise l'horloge de 24 heures (00-23).</description>
+  </field>
+  <field repeatable='true' tag='006'>
+    <name>Éléments de commées de longueur fixe -- caractéristiques matérielles additionnelles--renseignements généraux</name>
+    <description>Cette zone comporte 18 positions de caractère (00-17) qui permet d'entrer des données de codage concernant des aspects particuliers du document que l'on catalogue qui ne peuvent pas être codés et entrés dans la zone 008 (Éléments de données de longueur fixe). On utilise cette zone lorsqu'un document possède des caractéristiques multiples (p.&#160;ex., des documents imprimés accompagnés d'une cassette ou une carte publiée en publication en série). Elle sert aussi à entrer les aspects codés d'un fichier d'ordinateur dans le Guide/06 comme un document représenté par un code autre que «&#160;m&#160;».</description>
+  </field>
+  <field repeatable='true' tag='007'>
+    <name>Zone fixe de description matérielle - rensengements généraux&#160;</name>
+    <description>La présente zone renferme des renseignements particuliers sous forme codée sur les caractéristiques matérielles. Les renseignements peuvent représenter le document en entier ou en partie, notamment le matériel d'accompagnement.</description>
+  </field>
+  <field repeatable='false' tag='008'>
+    <name>Éléments de longueur fixe--Renseignements généraux &#160;&#160;</name>
+    <description>Cette zone comprend 40 positions de caractères (00-39) qui fournissent des données codées sur la notice dans l'ensemble et sur des aspects bibliographiques particuliers du document qui fait l'objet de catalogage. Ces éléments de données codés peuvent être utiles aux fins de récupération et de gestion.</description>
+  </field>
+  <field repeatable='false' tag='010'>
+    <name>Numéro de contrôle de la Library of Congress</name>
+    <description>Cette zone contient des numéros uniques attribués à une notice bibliographique par la Library of Congress. Le numéro de contrôle des notices MARC distribuées par la LC est le numéro de contrôle de la LC (LCCN).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de contrôle de la LC</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Numéro de contrôle du NUCMC</description>
+    </subfield>
+
+    <subfield code='z' repeatable='true'>
+      <description>Numéro de contrôle  annulé/invalide (R)</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='013'>
+    <name>Données de contrôle des brevets</name>
+    <description>Cette zone renferme les données nécessaires au contrôle des documents de brevets. Elle comprend aussi les données sur les certificats d'inventeur, les certificats d'utilité, les modèles d'utilité, les brevets ou certificats d'addition, les certificats d'addition d'inventeur, les certificats d'addition d'utilité et les demandes publiées concernant les documents précédents. À tous ces documents de brevets, on assigne des numéros et des dates correspondant au processus de demande et d'acceptation des droits légaux permettant de bénéficier d'une invention ou d'une découverte. On se sert aussi de cette zone pour identifier le statut d'un document de brevet et le pays de provenance.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Pays  Ce code provient du document intitulé Codes de pays MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Genre de numéro  Le genre d'identificateur de document de brevet</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date  La sous-zone $d contient la date, normalement assignée par l'autorité compétente (habituellement un bureau de brevets), à laquelle un brevet ou certificat similaire, ou une demande pour un tel document, a été accepté par cette autorité. La date de demande est normalement la date de réception par l'organisme. On inscrit aussi dans cette sous-zone d'autres dates, telles que les dates d'entrée en vigueur, les dates d'exposition, etc. On entre la date conformément au document intitulé Éléments de données et formats d'échange -- Échange d'information -- Représentation de la date et de l'heure (ISO 8601). La date comprend 8 chiffres disposés selon le format aaaammjj (4 pour l'année, 2 pour le mois et 2 pour le jour).</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Statut  La sous-zone $e renferme du texte précisant ou expliquant le statut du document de brevet décrit dans cette zone. Ce statut concerne généralement l'examen d'une demande ou l'octroi ou la publication d'un brevet.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Parties associées au document  La sous-zone $f identifie le pays ou l'institution associé au document. On trouve les codes de pays dans le document intitulé Codes de pays MARC . Quant aux codes des organismes, ils sont inscrits dans le document intitulé Sources des codes des organismes, aussi mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='015'>
+    <name>Numéro de bibliographie nationale</name>
+    <description>Cette zone contient un ou plusieurs numéros de bibliographie nationale (NBN).</description>
+    <subfield code='a' repeatable='false'>
+      <description>Numéro de bibliographie nationale</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source  La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='016'>
+    <name>Numéro de bibliographie nationale</name>
+    <description>Cette zone renferme des numéros uniques qu'une agence bibliographique nationale autre que la Library of Congress assigne à une notice. Le numéro de contrôle peut aussi se retrouver à la zone 001 (Numéro de contrôle) dans les notices distribuées par le même organisme national. En utilisant cette notice, une autre institution peut remplacer dans la zone 001 le numéro de contrôle de l'agence bibliographique nationale par le numéro de contrôle de son propre système. Le numéro décrit dans cette zone représente un numéro de contrôle utilisé dans le système de l'agence bibliographique nationale et non pas un numéro d'entrée dans une bibliographie nationale, tel que décrit dans la zone 015 (Numéro de bibliographie nationale).</description>
+    <indicator position='1' value='#'>
+      <description>Bibliothèque et Archives Canada</description>
+    </indicator>
+
+    <indicator position='1' value='7'>
+      <description>On assigne la valeur «&#160;7&#160;» lorsque la source du numéro de contrôle est codée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro de contrôle annulé ou invalide</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='017'>
+    <name>Numéro d'enregistrement de droit d'auteur ou dépôt légal</name>
+    <description>Cette zone renferme un numéro d'enregistrement de droit d'auteur ou un numéro de dépôt légal lorsque l'ouvrage est acquis par dépôt aux fins de l'enregistrement du droit d'auteur ou par dépôt légal. L'organisme qui a assigné le numéro est toujours présent avec le numéro de droit d'auteur ou de dépôt légal.</description>
+    <indicator position='2' value='#'>
+      <description>Numéro d'enregistrement de droit d'auteur ou dépôt légal</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Numéro d'enregistrement de droit d'auteur ou dépôt légal</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Organisme qui attribue le numéro</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source  La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='018'>
+    <name>Code pour les frais de droit d'auteur d'un article</name>
+    <description>Cette zone contient un code d'identification unique pour les parties composantes de monographies et de publications en série.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Code pour les frais de droit d'auteur d'un article</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='020'>
+    <name>Numéro international normalisé des livres</name>
+    <description>Cette zone contient le Numéro international normalisé des livres (ISBN) ainsi que les modalités d'acquisition du document. Peuvent aussi y figurer les ISBN annulés par l'éditeur et ceux qui sont structurellement invalides (p.&#160;ex., les ISBN dont les chiffres de contrôle sont invalides) ou incorrects pour une ressource particulière (p.&#160;ex. l'ISBN ne s'applique pas au document catalogué). Chaque zone 020 inclut toute l'information se rapportant à un ISBN ou, en l'absence d'ISBN, au document catalogué. La zone 020 est répétée en cas d'ISBN multiples pour le document (p.&#160;ex. des ISBN distincts pour l'édition reliée et l'édition brochée; également des ISBN distincts pour la série perçue comme un tout et pour chacune des parties qui la composent).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro international normalisé des livres  La sous-zone $a contient un ISBN valide pour le document. Les observations entre parenthèses, tels que l'éditeur ou le distributeur, le format ou la reliure et les numéros de volume ne sont pas codés dans des sous-zones distinctes.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Modalités d'acquisition&#160; La sous-zone $c contient le prix ou une brève mention de disponibilité et, entre parenthèses, toute observation concernant le document.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='true'>
+      <description>ISBN annulé/invalide&#160;(R) La sous-zone $z contient un ISBN annulé ou invalide et toute observation donnée entre parenthèses. On place chaque ISBN annulé ou invalide dans une sous-zone $z distincte.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='022'>
+    <name>Numéro international normalisé des publications en série</name>
+    <description>Cette zone renferme le Numéro international normalisé des publications en série (ISSN), un numéro d'identification unique attribué au titre d'une ressource continue et/ou les ISSN incorrects ou annulés.</description>
+    <indicator position='1' value='0'>
+      <description>Ressource continue d'intérêt international</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ressource continue sans intérêt international</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  La sous-zone $a contient un ISSN valide pour la ressource continue.</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>ISSN (annulé)  Une constante d'affichage pourrait être générée.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>ISSN (annulé)  Une constante d'affichage pourrait être générée.</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source  La source du code est la liste du Centres nationaux ISSN en ligne à&#160;: www.issn.org, Centres nationaux.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='024'>
+    <name>Autre numéro ou code normalisé</name>
+    <description>Cette zone renferme un numéro ou un code normalisé paraissant sur un document et qui ne peut trouver place dans aucune autre zone (p.&#160;ex., la zone 020 (Numéro international normalisé des livres), 022 (Numéro international normalisé des publications en série), 027 (Numéro normalisé de rapport technique), etc.). On identifie le genre du numéro ou du code normalisé dans la position du premier indicateur ou dans la sous-zone $2 (Source du numéro ou du code).</description>
+    <indicator position='1' value='0'>
+      <description>Code international normalisé d'enregistrement (ISRC) Pour l'affichage, les sous-éléments peut être séparont par un traite d'union ou un espace.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Code universel des produits (CUP)</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Numéro international normalisé de la musique (ISMN) Pour l'affichage, les sous-éléments peut être séparont par un traite d'union ou un espace.</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Numéro international des articles (EAN)</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Serial Item and Contribution Identifier (SICI) Pour l'affichage, les sous-éléments peut être séparont par un traite d'union ou un espace.</description>
+    </indicator>
+
+    <indicator position='1' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Aucune différence</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Différence</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Numéro ou code normalisé</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Modalités d'acquisition</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Autres codes suivant le numéro ou code normalisé</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro ou code normalisé annulé ou invalide</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du numéro ou du code  La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='025'>
+    <name>Numéro d'acquisition étrangère</name>
+    <description>Cette zone contient des numéros attribués par la Library of Congress aux ouvrages acquis par l'entremise de ses divers programmes d'acquisition à l'étranger. Elle sert à enregistrer la source d'acquisition du document et à identifier certains programmes d'acquisition de matériel.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Numéro d'acquisition étrangère</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='026'>
+    <name>Identificateur d'empreintes</name>
+    <description>On utilise cette zone pour faciliter l'identification des livres anciens en enregistrant des renseignements qui comportent des groupes de caractères provenant d'emplacements particuliers, sur des pages particulières du livre en question, selon les principes établis dans diverses directives publiées.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Premier et deuxième groupes de caractères</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Troisième et quatrième groupes de caractères</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Date</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Nombre de volumes ou de pièces</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Empreintes non analysées</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source  La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='5' repeatable='false'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='027'>
+    <name>Numéro normalisé de rapport technique</name>
+    <description>Cette zone contient un Numéro international normalisé des rapports (ISRN) ou un Numéro normalisé de rapport technique (STRN) formulé conformément aux normes Numéro international normalisé des rapports (ISRN), ISO 10444, Standard Technical Report Number Format and Creation, ANSI/NISO Z39.23?1997 ou Standard Technical Report Number (STRN), Format and Creation, ANSI Z39.23?1983, qui est attribué à un rapport technique. Le numéro de rapport technique constitue le principal moyen d'identification d'un rapport technique en particulier.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro annulé/invalide</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='028'>
+    <name>Numéro d'éditeur</name>
+    <description>Cette zone renferme les numéros d'éditeur structurés pour les enregistrements sonores, les enregistrements vidéo, la musique imprimée et les autres documents musicaux. Les numéros d'éditeur présents dans la notice bibliographique sous une forme non structurée sont inscrits à la zone 500 (Note générale). Une constante d'affichage pourrait-être générée afin d'identifier le type de numero d'éditeur à partir des valeurs du premier indicateur.</description>
+    <indicator position='1' value='0'>
+      <description>Numéro de tirage Ce numéro donne l'indication de parution ou l'indication sérielle attribuée par l'éditeur à un enregistrement sonore donné, à un côté d'enregistrement sonore, à une œuvre particulière sur un enregistrement sonore ou à un groupe d'enregistrements sonores publiés comme un ensemble. Le numéro de tirage se retrouve sur l'étiquette de l'enregistrement, ou dans le cas de certains groupes d'enregistrements sonores, sur l'emballage de ces enregistrements.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Numéro de matrice Ce numéro identifie la matrice à partir de laquelle un enregistrement sonore a été pressé.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Cotage La valeur «&#160;2&#160;» identifie le cotage attribué par l'éditeur à un imprimé musical en particulier.</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Autre numéro d'éditeur pour la musique</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Numéro d'enregistrement vidéo</description>
+    </indicator>
+
+    <indicator position='1' value='5'>
+      <description>Autre numéro d'éditeur</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Pas de note, pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Note et vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Note, pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Pas de note, vedette secondaire</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Numéro d'éditeur</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='030'>
+    <name>Abréviation CODEN</name>
+    <description>Cette zone contient l'abréviation CODEN, un identificateur unique pour les titres de périodiques scientifiques et techniques.</description>
+    <subfield code='a' repeatable='true'>
+      <description>CODEN  La sous-zone $a renferme une abréviation CODEN valide.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>CODEN annulé ou invalide</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='031'>
+    <name>Information relative aux incipits musicaux</name>
+    <description>Cette zone sert à contenir des données codées représentant l'incipit musical dans le cas des œuvres utilisant des schémas de notation établis qui font appel aux symboles ASCII réguliers. La zone est principalement utilisée pour identifier des manuscrits musicaux, mais peut servir pour tout matériel contenant de la musique.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de l'œuvre</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro du mouvement</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Numéro de l'extrait</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Titre ou en-tête</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Rôle</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Clé</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Voix ou instrument</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Armature</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Indication de la mesure</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Notation musicale</description>
+    </subfield>
+
+    <subfield code='q' repeatable='false'>
+      <description>Note générale</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité ou mode</description>
+    </subfield>
+
+    <subfield code='s' repeatable='false'>
+      <description>Note codée concernant la validité</description>
+    </subfield>
+
+    <subfield code='t' repeatable='false'>
+      <description>Incipit du texte</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Texte du lien</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Système d'encodage</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='true'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='032'>
+    <name>Numéro d'enregistrement postal</name>
+    <description>Cette zone contient un numéro d'enregistrement du service des postes obligatoire dans certains pays pour des classes de courrier privilégiées.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro d'enregistrement postal  Le numéro du U.S. Postal Service (USPS) se compose de six chiffres justifiés à droite; les positions vides contiennent des zéros. Le trait d'union qui peut se retrouver le troisième et le quatrième chiffre sur les documents imprimés n'apparaît pas dans la notice MARC. Le système peut le générer sous forme de constante d'affichage à partir du contenu de la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source (organisme qui attribue le numéro)</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='033'>
+    <name>Date/heure et lieu d'un événement</name>
+    <description>Cette zone indique, sous forme de codage, la date, l'heure et/ou le lieu de création, d'enregistrement ou de diffusion associés à un événement. On peut aussi consigner, sous forme de note, l'information contenue dans cette zone dans la zone 518 (Note sur la date/l'heure et le lieu d'un événement).</description>
+    <indicator position='1' value='#'>
+      <description>Aucune date enregistrée La valeur «&#160;#&#160;» indique qu'aucune donnée sur la date n'est présente et que, par conséquent, la zone ne contient pas de sous-zone $a.</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Date unique</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Plusieurs dates uniques La valeur «&#160;1&#160;» indique qu'il s'agit de plus d'une date unique. Deux dates consécutives sont considérées comme de multiples dates uniques.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Intervalle des dates La valeur «2&#160;» indique que les dates définissent un intervalle de temps. Par exemple, on l'utilise lorsque la période d'exécution, de création, etc. a duré plus de deux jours consécutifs et que les dates exactes sont inconnues ou trop nombreuses pour être notées.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie provided</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Enregistration/création La valeur «&#160;0&#160;» indique qu'il s'agit de la date/l'heure et/ou du lieu associés à l'enregistrement de sons, au tournage d'un film, à la création ou à la production d'un objet, ou à la création d'un objet qui n'implique pas l'enregistrement ou le tournage.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Radiodiffusion La valeur «&#160;1&#160;» indique qu'il s'agit de la date/l'heure et/ou du lieu associés à la diffusion (i.e. la transmission) de sons ou d'images par le biais de la radio ou de la télévision, et aussi à la rediffusion de ces données.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Découverte La valeur «&#160;2&#160;» indique qu'il s'agit de la date/l'heure et/ou du lieu de découverte d'un objet naturel.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Date/heure structurée  La sous-zone $a contient la date/l'heure exacte ou approximative d'enregistrement/création, de découverte ou de diffusion. La date/l'heure est enregistrée selon le format aaaammjjhhmm�hhmm. Les huit premiers chiffres, aaaammjj (4 pour l'année, 2 pour le mois et 2 pour le jour) représentent la date et sont obligatoires si on utilise la sous-zone. S'il y a des chiffres inconnus parmi ces huit chiffres, on les remplace par un trait d'union (-). Les quatre chiffres suivants, hhmm (2 pour l'heure et 2 pour la minute) représentent l'heure exprimée en heure et en minute.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Code de classification d'aire géographique  La sous-zone $b contient un code numérique de quatre à six chiffres représentant l'aire géographique principale associée à un document. Le code consiste en un indice de classification approprié choisi parmi les indices G3190 à G9980 tirés du document intitulé Library of Congress Classification - Class G; mis à jour par la Library of Congress; la lettre G est omise. On peut répéter la sous-zone $b lorsque plus d'un endroit est associé à une entité.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Code de classification de la subdivision d'aire géographique  La sous-zone $c contient un chiffre Cutter alphanumérique désignant une subdivision géographique du code d'aire géographique inscrit à la sous-zone $b. Ce code est tiré du document intitulé Library of Congress Classification - Class G et des listes élargies de chiffres Cutter pour les noms de lieu. Les chiffres Cutter pour les noms de lieu aux Etats-Unis sont aussi publiés dans Geographic Cutters. La Library of Congress met à jour la Library of Congress Classification - Class G, les Geographic Cutters et les listes de chiffres Cutter.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='034'>
+    <name>Données mathématiques codées sur les documents cartographiques</name>
+    <description>La zone 034 est basée sur l'information contenue dans la zone 255 (Données mathématiques sur les documents cartographiques). Pour chaque zone 255 présente dans la notice, on devrait retrouver une zone 034 correspondante.</description>
+    <indicator position='1' value='0'>
+      <description>Échelle indéterminable/aucune échelle enregistrée La valeur «&#160;0&#160;» indique qu'aucune information sur l'échelle n'est fournie. On l'attribue lorsqu'il n'y a pas de fraction dans la zone 255.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Échelle unique</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Intervalle d'échelles</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Sans objet</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Anneau d'inclusion</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Anneau d'exclusion</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Catégorie d'échelle  La sous-zone $a contient un code alphabétique à un caractère indiquant la catégorie d'échelle utilisée sur le document.  a - Échelle linéaire b - Échelle angulaire Le code «&#160;b&#160;» indique une échelle angulaire; on l'assigne aux cartes célestes. z - Autre catégorie d'échelle</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Échelle graphique linéaire des longueurs, à rapport constant  La sous-zone $b contient le dénominateur de la fraction représentant l'échelle des longueurs. L'échelle la plus grande (le plus petit nombre) est généralement entrée la première.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Échelle graphique linéaire des hauteurs, à rapport constant</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Coordonnées - longitude la plus à l'ouest</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Coordonnées - longitude la plus à l'est</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Coordonnées - latitude la plus au nord</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Coordonnées - latitude la plus au sud  Les sous-zones $d, $e, $f et $g identifient séparément les quatre coordonnées du document. La sous-zone $d représente la longitude la plus à l'ouest inscrite sur le document, la sous-zone $e, la longitude la plus à l'est, la sous-zone $f, la latitude la plus au nord et la sous-zone $g, la latitude la plus au sud. Ces quatre sous-zones doivent toujours se retrouver ensemble. On inscrit les coordonnées sous la forme hdddmmss (hémisphère-degrés-minutes-secondes), mais on permet d'autres formats, par ex. degréees decimales. Chacun des sous-éléments de, est justifié à droite et les positions vides contiennent des zéros.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Échelle angulaire  La sous-zone $h identifie l'échelle des cartes célestes, si elle est connue.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Déclinaison - limite septentrionale</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Déclinaison - limite méridionale  On entre la déclinaison dans les sous-zones $j et $k sous la forme hdddmmss (hémisphère-degrés-minutes-secondes). Chacun des éléments, degré, minute et seconde, est justifié à droite et les positions vides contiennent des zéros. (Si la déclinaison centrale est connue, on la répète dans les deux sous-zones.)</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Ascension droite - limites orientales</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Ascension droite - limites occidentales  Pour les cartes célestes ou les atlas contenant des cartes célestes, on entre l'ascension droite dans les sous-zones $m et $n sous la forme hhmmss (heure-minute-secondes). Chacun des éléments, heure, minute, secondes, est justifié à droite et les positions vides contiennent des zéros.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Équinoxe  La sous-zone $p identifie l'équinoxe ou l'époque pour une carte céleste. On l'entre habituellement sous la forme aaaa (année) d'après le calendrier grégorien; elle peut aussi inclure un nombre décimal désignant le mois sous la forme aaaa.mm (année-mois).</description>
+    </subfield>
+
+    <subfield code='s' repeatable='false'>
+      <description>Latitude sur l'anneau G</description>
+    </subfield>
+
+    <subfield code='t' repeatable='false'>
+      <description>Longitude sur l'anneau G</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='035'>
+    <name>Numéro de contrôle de système</name>
+    <description>Cette zone contient un numéro de contrôle provenant d'un système autre que celui qui fournit le numéro de contrôle dans la zone 001 (Numéro de contrôle), dans la zone 010 (Numéro de contrôle de la Library of Congress) ou dans la zone 016 (Numéro de contrôle de l'agence bibliographique nationale).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de contrôle de système  Voir Sources des codes des organismes pour les données bibliographiques des sources relatives aux codes des organismes utilisés dans les notices MARC&#160;21.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro de contrôle annulé/invalide</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='036'>
+    <name>Numéro original d'étude pour les données informatiques</name>
+    <description>Cette zone contient le numéro original d'étude assigné à un fichier par le producteur. Ce numéro d'identité est souvent attribué au moment de la création du fichier et il fait partie des données enregistrées dans ce dernier. On entre dans la zone 037 (Source d'acquisition) l'identification d'archives ou les numéros de commandes assignés par le diffuseur.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro original d'étude</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source (organisme qui attribue le numéro)</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='037'>
+    <name>Source d'acquisition</name>
+    <description>Cette zone contient de l'information sur la source d'acquisition du document en main ou de sa reproduction.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro d'inventaire  La sous-zone $a contient un numéro d'inventaire ou un autre numéro qui sert à commander un document ou sa reproduction (y compris les numéros de distributeur, d'éditeur ou de fournisseur).</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source d'acquisition et du numéro d'inventaire</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Modalité d'acquisition</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Forme de la livraison</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Autres caractéristiques de format</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='038'>
+    <name>Concédant de licence liée au contenu de la notice</name>
+    <description>La sous-zone $a contient le code MARC de l'organisme qui cède les droits de proprété intellectuelle en ce qui concerne les données contenues dans la notice.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Concédant de licence liée au contenu de la notice</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='040'>
+    <name>Source du catalogage</name>
+    <description>Cette zone comprend le code MARC ou le nom de l'organisme ou des organismes qui ont créé la notice originale, assigné la désignation du contenu MARC et transcrit la notice dans un format lisible par machine, ou modifié la notice MARC existante. Les codes MARC inscrits dans la zone 040, et le code dans les zones 008/39 (Source du catalogage) précisent les parties responsables du contenu, de la désignation du contenu, et de la transcription d'une notice bibliographique.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Organisme qui a effectué le catalogage original</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Code de la langue utilisée dans le catalogage  La sous-zone $b contient le code MARC de la langue du catalogage. La source du code est dans le document intitulé Liste des langues</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Organisme qui a effectué la transcription</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Organisme qui a effectué la modification</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Nom des règles de description  Lorsque la zone 008/18 (Règles de catalogage descriptif) ne réflète pas suffisamenet les règles de catalogage descriptif utilisées, la sous-zone $e de la zone 040 constitute un moyen d'identifier davantage les règles utilisées. La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='041'>
+    <name>Code de langue</name>
+    <description>Cette zone contient les codes de langues associés à un ouvrage lorsque le code de langue dans la zone 008/35-37 (Langue) ne représente pas adéquatement un ouvrage multilingue, une traduction ou une ouvrage qui comprend des représentations de l'alphabet en langage par signes. La source des codes est le document intitulé Liste des langues mis à jour par la Library of Congress ou des autres listes de codes, comme ISO 639-1 (Codes pour la représentation de noms de langues - Partie 1&#160;: code alpha-2).</description>
+    <indicator position='1' value='0'>
+      <description>L'ouvrage n'est pas ou n'inclut pas une traduction</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>L'ouvrage est ou inclut une traduction</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Code de langue MARC</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Code de langue du texte/de la piste sonore ou du titre distinct  Le code dans la permière occurrence de la sous-zone $a est également inscrit dans la zone 008/35-37, sauf si la zone 008/35-37 renferme des caractères espaces « ### » ou le code « zxx » (Aucun contenu linguistique).</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Code de langue du sommaire,  (R) La sous-zone $b contient les codes de langue des sommaires, des résumés analytiques des sous-titres (codés ou visibles, prévu pour l'usage des personnes malentendants) ou lorsque la langue de ces derniers diffère de celle du texte.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Code de langue du texte chanté ou parlé  La sous-zone $d contient le ou les codes de langue de la partie audible d'un document, soit habituellement le contenu chanté ou parlé d'un enregistrement sonore ou d'un fichier d'ordinateur. Le code de langue qui apparaît le premier dans la sous-zone $d, s'il n'y a pas de sous-zone $a, peut également être entrer dans la zone 008/35-37.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Code de langue des livrets  Pour la musique, la sous-zone $e contient le ou les codes de langue du texte imprimé lorsque le document renferme le contenu vocal ou textuel de l'œuvre ou des œuvres imprimées comme un texte, que ce soit comme matériel d'accompagnement ou qu'il soit imprimé avec le document.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Code de langue de la table des matières  La sous-zone $f contient le ou les codes de langue de la table des matières lorsqu'elle n'est pas dans la même langue que le texte.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Code de langue du matériel d'accompagnement, sauf des livrets  La sous-zone $g renferme le ou les codes de langue du matériel d'accompagnement, sauf ceux des résumés «sous-zone $b» et des livrets «sous-zone $e».</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Code de langue de traductions de texte original et/ou intermédiaire  La sous-zone $h contient le ou les codes de langue de l'œuvre originale ou des traductions intermédiaires de cette œuvre. On inscrit les codes des traductions intermédiaires avant les codes de langue de l'œuvre originale.</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du code</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='042'>
+    <name>Code d'authenticité</name>
+    <description>Cette zone contient au moins un code d'authentification qui indique si la notice, qui se trouve dans une base de données nationale, a été revue d'une façon particulière. La zone 042 est réservée à l'usage des organismes qui attribuent les éléments de données. Elle est utilisée pour inscrire les codes d'authentification associés à des organismes d'authentification explicitement autorisés.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Code d'authenticité  Pour une ressource continue, authentifiée par un des Centres ISSN, dont le lieu de publication change, le centre du Réseau de l'ISSN dans le nouveau pays de publication doit assumer la responsabilité des éléments de données du Réseau ISSN et ajouter son code d'authentification à la zone 042. La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='043'>
+    <name>Code d'aire géographique</name>
+    <description>Cette zone renferme des codes MARC représentant les aires géographiques associées à une notice bibliographique. La source des codes dans la sous-zone $a est le document intitulé Codes d'aires géographiques . La source d'un code local dans la sous-zone $b est indiquée dans la sous-zone $2. La source des codes dans la sous-zone $c est ISO 3166, Codes pour la représentation des noms de pays et de leurs subdivisions - Partie 1&#160;: Code pays.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Code d'aire géographique</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Code d'aire géographique local</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Code ISO</description>
+    </subfield>
+
+    <subfield code='2' repeatable='false'>
+      <description>Source du code local</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='044'>
+    <name>Code du pays de publication ou de production</name>
+    <description>Cette zone renferme un code MARC à deux ou à trois caractères pour indiquer le pays où l'entité a été publiée ou produite dans les cas où les positions 008/15-17 (Lieu de publication, production ou d'exécution) ne suffisent pas à fournir tous les renseignements concernant un document publié ou produit dans plusieurs pays. La source du code dans la sous-zone $a est le document intitulé Codes de pays MARC . On peut se servir de la sous-zone $c pour ajouter des codes de sous-entités puisés dans le document intitulé Codes pour la représentation des noms de pays et de leurs subdivisions - Partie 1&#160;: Code pays ou Partie 2&#160;: Code pour les subdivisions des pays (ISO 3166).</description>
+    <subfield code='a' repeatable='false'>
+      <description>Code de pays MARC  Le code du pays apparaissant dans les positions 008/15-17 se trouve inscrit dans la première sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Code de sous-entité local</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Code ISO du pays</description>
+    </subfield>
+
+    <subfield code='2' repeatable='false'>
+      <description>Source du code de sous-entité local  La sous-zone $2 renferme le code d'identification de la source dont on s'est servi pour attribuer le code local. La source du code est le document intitulé Codes de relations, de sources et de conventions de description .</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='045'>
+    <name>Période de temps associée au contenu</name>
+    <description>Cette zone enregistre un code sur la période de temps (sous-zone $a), et/ou une période de temps structurée (sous-zones $b et/ou $c), associée au contenu de l'ouvrage décrit dans la notice bibliographique.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune sous-zone $b ou $c</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Date/heure unique La valeur «&#160;1&#160;» indique la présence de multiple sous-zone $b et/ou sous-zone $c renfermant chacune une date/heure unique.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Plusieurs dates/heures uniques</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Intervalle des dates/heures La valeur «&#160;2&#160;» indique la présence de deux sous-zones $b et/ou de sous-zones $c qui renferment un intervalle de dates/heures.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Code de la période de temps  La sous-zone $a contient un code de quatre caractères alphanumériques établie d'après le tableau des codes de périodes de temps pour les périodes av. J.-C. et apr. J.-C. Chaque code de période de temps associé à une vedette se trouve dans une sous-zone $a distincte. Le tableau se trouve sous la description de zone 045 dans le Format MARC&#160;21 pour les données bibliographiques.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Période de temps structurée: de 9999 avant J.-C. et après J.-C. La sous-zone $b contient une période de temps précise selon le format aaaammjjhh , précédée d'un code pour indiquer l'ère («&#160;c&#160;» pour av. J.-C.; «&#160;d&#160;» pour apr. J.-C.).</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Période de temps structurée: antérieure à 9999 avant J.-C.  La sous-zone $c contient une période dont la structure se compose d'autant de caractères numériques dont on a besoin pour représenter le nombre d'années avant Jésus-Christ. Les valeurs des positions «&#160;0-2&#160;» du premier indicateur précisent si la période dans la sous-zone $c comprend une date unique, des dates multiples ou un intervalle de dates. Chaque période antérieure à 9999 av. J.-C. associée à la vedette est indiquée dans une sous-zone $c distincte.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='046'>
+    <name>Dates spéciales en code</name>
+    <description>Cette zone contient des données sur la date du document qui ne peuvent être entrées dans la zone 008/06-14 (Type de date/statut de publication, Date 1, Date 2) parce que ces données comprennent une date ou plusieurs dates avant Jésus-Christ (av. J.-C.), des dates erronées, les dates où les ressources ont été modifiées ou créées et les dates de validité des ressources. Lorsque l'on utilise la zone 046 pour entrer des dates av. J.-C., la zone 008/06 renferme le code «&#160;b&#160;» (Aucune date fournie; date av. J.-C. incluse) et les zones 008/07-10 et 008/11-14 contiennent des blancs (###). Lorsque l'on utilise la zone 046 pour indiquer la présence de dates erronées, la zone 008/06 renferme le code qui indique le type de date corrigée, et les zones 008/07-10 et 008/11-14 renferment les dates exactes.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Code de la période de temps   i - Dates extrêmes représentées par une collection k - Étendue de la collection m - Dates multiples n - Date inconnue p - Date de diffusion/de lancement/d'édition et date de production/de séance d'enregistrement q - Date incertaine r - Date de réimpression et date originale s - Date unique de publication connue ou probable t - Dates de l'édition actuelle et date de droit d'auteur x - Dates erronées</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Date 1 (av. J.-C.)</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Date 1 (apr. J.-C.)</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date 2 (av. J.-C.)  La zone doit contenir une sous-zone $b.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Date 2 (apr. J.-C.)  La zone doit contenir une sous-zone $c.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Date de modification d'une ressource</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Date initiale de la période de création</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Date terminale de la période de création</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Début de la période de validité</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Fin de la période de validité</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de date  La source du code est le document intitulé Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='047'>
+    <name>Code de forme musicale&#160;</name>
+    <description>Cette zone renferme des codes composés de deux caractères alphabétiques représentant la forme d'une composition musicale. Elle est utilisée lorsque les positions de caractères 18 et 19 (Forme musicale) à la zone 008 (Éléments de données de longueur fixe) pour la musique contiennent le code «&#160;mu&#160;» pour des formes multiples.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Code de forme musicale  On décrit les codes utilisés ici dans la zone 008 Musique /18-19 (Forme musicale).</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='048'>
+    <name>Code relatif au nombre d'instruments et de voix</name>
+    <description>Cette zone renferme, sous forme de codage, la distribution d'exécution d'une composition musicale. On trouvera ci-dessous les codes des divers types de combinaisons instrumentales et vocales. On indique aussi le nombre de parties, lorsqu'il est spécifié dans l'œuvre, au moyen de deux chiffres (p.&#160;ex., va02, une composition à deux voix pour Voix - Soprano) immédiatement après le code d'instrument ou de voix. On peut omettre le nombre de parties si on ne le connaît pas.</description>
+    <indicator position='2' value='#'>
+      <description>Code MARC</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Interprète ou ensemble  La sous-zone $a renferme un code pour l'interprète ou l'ensemble et, s'il y a lieu, un nombre de deux chiffres spécifiant le nombre de parties.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Soliste  La sous-zone $b contient un code à deux caractères pour le soliste et, s'il y a lieu, un nombre de deux chiffres spécifiant le nombre de parties</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='050'>
+    <name>Cote de la Library of Congress</name>
+    <description>Cette zone contient une cote complète de la Library of Congress (LC) ou un indice de classification attribué par la Library of Congress ou par d'autres organismes utilisant la Library of Congress Classification ou les LC Classification-Additions and Changes. Les valeurs du second indicateur permettent de savoir si le contenu a été attribué par la Library of Congress ou par un autre organisme. Les crochets qui entourent habituellement les cotes des ouvrages ne faisant pas partie des collections de la LC ou des cotes/indices alternatifs n'apparaissent pas dans une notice MARC. Ils peuvent être générés par le système comme constante d'affichage selon la valeur «&#160;1&#160;» du premier indicateur ou les sous-zones $a additionnelles.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie Cette valeur est utilisée pour toutes les cotes attribuées par des organismes autres que la Library of Congress.</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>L'ouvrage est conservé à la LC La valeur «&#160;0&#160;» indique que le document se trouve dans les collections de la LC sous la cote donnée dans cette zone. D'autres organismes devraient utiliser cette valeur lorsque le catalogage est dérivé d'une notice de la LC, sauf dans les cas ci-dessous.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>L'ouvrage n'est pas conservé à la LC Les autres organismes devraient utiliser cette valeur lorsque le catalogage est dérivé d'une notice de la LC dans laquelle la cote est inscrite entre crochets ou précédée d'une croix de malte.Les crochets qui entourent habituellement les cotes des ouvrages ne faisant pas partie des collections de la LC ou des cotes/indices alternatifs n'apparaissent pas dans une notice MARC.</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Attribué par la LC</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Attribué par un organisme autre que la LC</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document  Il se peut que les organismes utilisant le Cutter-Sanborn Three-Figure Author Table se conforment à la méthode du numéro de document de la Library of Congress en se servant des conventions du Subject Cataloging Manual: Shelflisting.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='051'>
+    <name>Mention d'exemplaire, de fascicule, de tiré à part de la Library of Congress</name>
+    <description>Cette zone contient des renseignements ajoutés à une notice bibliographique inscrits par la Library of Congress concernant des exemplaires, des numéros ou des tirés à part additionnels de l'ouvrage en question se trouvant dans ses collections.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Renseignements sur l'exemplaire</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='052'>
+    <name>Code de classification géographique</name>
+    <description>Cette zone contient le code de classification géographique qui représente l'aire géographique et, s'il y a lieu, la subdivision d'aire géographique ainsi que le nom de lieu habité sur lequel porte un document.</description>
+    <indicator position='1' value='#'>
+      <description>Library of Congress Classification</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>U.S. Dept. of Defense Classification</description>
+    </indicator>
+
+    <indicator position='1' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Code d'aire de classification géographique  La sous-zone $a contient un code numérique ou alphanumérique qui représente l'aire géographique principale sur laquelle porte un document. Si la position du premier indicateur renferme la valeur «&#160;#&#160;», le code consiste en un indice de classification approprié de quatre à six chiffres dans le séquence G3190-G9980 tirée de la Library of Congress Classification - Class G; la lettre G est omise.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Code de classification de la subdivision d'aire géographique (R) La sous-zone $b contient un code de subdivision d'aire géographique associé au code d'aire géographique précisé dans la sous-zone $a. .</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Nom de lieu habité  May contain the name of the geographic area</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du code</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='055'>
+    <name>Indices de classification attribués au Canada</name>
+    <description>Cette zone renferme soit une cote complète ou un indice de classification attribué par Bibliothèque et Archives Canada (BAC) ou par une bibliothèque participante à BAC, mais ne comprend pas les cotes ou les indices de classification attribués par le système de classification de la National Library of Medicine, la Classification décimale universelle et la Classification décimale Dewey.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie La valeur «&#160;#&#160;» indique qu'aucune information n'est fournie. Tout établissement autre que BAC utilise la valeur «&#160;#&#160;» pour la saisie de leurs notices</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>L'ouvrage est conservé à BAC</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>L'ouvrage n'est pas conservé à BAC</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la cote/de l'indice de classification  La sous-zone $2 comprend un code qui identifie la liste de base ou le système qui a servi à attribuer la cote ou l'indice de classification. On utilise cette sous-zone seulement lorsque le second indicateur contient les valeurs «&#160;6&#160;» (Autre cote attribuée par BAC), «&#160;7&#160;» (Autre indice de classification attribué par BAC), «&#160;8&#160;» (Autre cote attribuée par une bibliothèque participante) ou «&#160;9&#160;» (Autre indice de classification attribué par une bibliothèque participante). Les codes qui doivent être inscrits dans la sous-zone sont énumérés dans le document intitulé Codes de relations, de sources et de conventions de description .</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='060'>
+    <name>Cote de la National Library of Medicine</name>
+    <description>Les cotes contenues dans cette zone et attribuées par la NLM peuvent provenir des tables QS-QZ (sciences précliniques) et W-WZ (médecine et sujets connexes) de la National Library of Medicine Classification, ou des tables de la Library of Congress Classification pour des sujets qui ne sont pas couverts par les tables de la NLM, ou être un numéro d'acquisition.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>L'ouvrage est conservé à la NLM</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>L'ouvrage n'est pas conservé à la NLM</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Attribué par la NLM</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Attribué par un organisme autre que la NLM</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document  La sous-zone $b contient le segment représentant le numéro de document de la cote attribuée par la NLM. En règle générale, la NLM utilise la Cutter-Sanborn Three-Figure Author Table pour créer des numéros de document. Le plan spécial de numérotation utilisé dans les classes W1 et W3 est décrit dans la National Library of Medicine Classification. Cette sous-zone peut également renfermer un numéro d'exemplaire.</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='061'>
+    <name>Mention d'exemplaire de la National Library of Medicine</name>
+    <description>Cette zone contient de l'information ajoutée à une notice bibliographique par la National Library of Medicine qui indique la présence d'exemplaires ou d'ensembles en double du matériel décrit dans sa collection.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Renseignement sur l'exemplaire</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='066'>
+    <name>Jeux de caractères présents</name>
+    <description>On utilise cette zone dans les notices codées à l'aide de caractères provenant de jeux autres que ISO 10646 (ou Unicode) pour préciser les jeux de caractères du contenu de données que l'on retrouve dans la notice. Les caractères qui composent les séquences d'échappement, de même que d'autres détails sur le codage des caractères dans les notices MARC sont décrits dans les MARC&#160;21 Specifications for Record Structure, Character Sets, and Exchange Media .</description>
+    <subfield code='a' repeatable='true'>
+      <description>Jeu de caractères primaire G0  Le code est formé des caractères intermédiaire et final de la séquence d'échappement qui désigne et appelle le jeu de caractères G0 implicite.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Jeu de caractères primaire G1  Le code est formé des caractères intermédiaire et final de la séquence d'échappement qui désigne et appelle le jeu de caractères G1 implicite.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Jeu de caractères alternatif G0 ou G1  Le code est composé des carredactères intermédiaire et final de chaque séquence d'échappement qui sera utilisé pour désigner le jeu de caractères graphique alternatif utilisé dans la notice.Le ou les caractères intermédiaires indique si le jeu comporte des caractères composé d'un seul octet ou d'octets multiples et s'il est désigné comme étant un jeu G0 ou G1.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='070'>
+    <name>Cote de la National Agricultural Library</name>
+    <description>Cette zone contient une cote complète de la National Agricultural Library (NAL) ou un indice de classification de la NAL.</description>
+    <indicator position='1' value='0'>
+      <description>L'ouvrage est conservé à la NAL</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>L'ouvrage n'est pas conservé à la NLM</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='071'>
+    <name>Mention d'exemplaire de la National Agricultural Library</name>
+    <description>Cette zone contient la cote et d'autres renseignements relatifs aux deuxièmes exemplaires ou ensembles attribués par la National Agricultural Library.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Renseignement sur l'exemplaire</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='072'>
+    <name>Code de catégorie de sujets</name>
+    <description>Cette zone contient un code indiquant la catégorie de sujets qui est associée au document.</description>
+    <indicator position='2' value='0'>
+      <description>Liste des codes de catégorie de sujets de la NAL La valeur «&#160;0&#160;» précise que la source du code de la catégorie de sujets est l'AGRICOLA Subject Category Codes with Scope Notes mis à jour par la U.S. National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Code de catégorie de sujets  La sous-zone $a renferme le code de la catégorie de sujets.</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision de code de catégorie de sujets  La sous-zone $x contient un code qui indique le niveau de précision dans la catégorie plus étendue représentée par le code dans la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source  La sous-zone $2 renferme un code MARC qui identifie le thésaurus utilisé pour attribuer le code de la catégorie de sujets lorsque la position du second indicateur dans cette zone contient la valeur «&#160;7&#160;». La source du code MARC est dans le document intitulé Codes de relations, de sources et de conventions de description .</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='074'>
+    <name>Numéro de document GPO</name>
+    <description>Cette zone renferme un numéro de document attribué par le U.S. Government Printing Office (GPO). Le numéro de document sert à gérer la diffusion des publications aux bibliothèques au sein du Depository Library System du GPO (système de bibliothèques de dépôt du GPO).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de document GPO  La sous-zone $a contient le numéro de document GPO ainsi que des qualificatifs tels que «&#160;MF&#160;» pour «&#160;microfilm&#160;».</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro de document annulé/invalide du GPO</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='080'>
+    <name>Indice de la Classification décimale universelle</name>
+    <description>Cette zone contient un indice de la Classification décimale universelle (CDU).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Indice de la Classification décimale universelle</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision auxiliaire ordinaire  La sous-zone $x renferme une subdivision auxiliaire ordinaire, soit un numéro qui qualifie le concept représenté par l'indice principal de la Classification décimale universelle.</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Identificateur de l'édition</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='082'>
+    <name>Indice de Classification décimale Dewey</name>
+    <description>Cette zone renferme un indice de classification complet attribué par la Library of Congress ou par d'autres organismes à partir d'éditions des tables générales de la Classification décimale Dewey. Les valeurs du second indicateur permettent de déterminer si le contenu a été attribué par la Library of Congress ou par un organisme autre que la LC.</description>
+    <indicator position='1' value='0'>
+      <description>Édition complète</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Édition abrégée</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Attribué par la LC La valeur «&#160;0&#160;» précise que la Library of Congress est la source de l'indice de classification.</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Attribué par une agence autre que la LC</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Numéro d'édition</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='084'>
+    <name>Autre indice de classification</name>
+    <description>Cette zone comprend un indice de classification qui ont été attribués par un organisme de catalogage utilisant un système autre que la Library of Congress Classification, les systèmes de classification de Bibliothèque et Archives Canada, de la National Library of Medicine, de la National Agricultural Library, du U.S. Government Printing Office, de la Classification décimale universelle, ou de la Classification décimale Dewey. On ne doit pas utiliser la zone pour entrer des numéros de classification attribués par une source pour laquelle on n'entrerait pas, dans la sous-zone $2, une source du numéro de code.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numéro de document</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du numéro  La source du code MARC est la Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='086'>
+    <name>Indice de classification du document officiel</name>
+    <description>Cette zone renferme un indice de classification assigné à un document officiel par un organisme gouvernemental de tout niveau: p.&#160;ex., provincial, état, national, international.L'indice de classification de document officiel est un élément de donnée attribué par un organisme. Il est attribué par des organismes autorisés possédant un programme de classification de documents officiels.</description>
+    <indicator position='1' value='#'>
+      <description>Source indiquée dans la sous-zone $2 La source du numéro est tirée d'un système de classification autre que les systèmes du Canada et du U.S. Superintendent of Documents.</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Superintendent of Documents Classification System La valeur «&#160;0&#160;» indique que la source du numéro est le U.S. Superintendent of Documents Classification System. Les numéros de ce système sont attribués seulement par le U.S. Government Printing Office (GPO).</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Publications du gouvernement du Canada: exposé de la classification</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Indice de classification</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Indice de classification annulé/invalide</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du numéro  La sous-zone $2 comprend un code MARC s'appliquant à un système ou plan de classification de publications officielles, à l'exception des systèmes du Canada et du U.S. Superintendent of Documents, qui identifie le système ou le plan de classification de publications officielles d'où provient l'indice de classification attribué. Lorsqu'il y a une sous-zone $2, la position du premier indicateur renferme la valeur «&#160;#&#160;». La source du code MARC est la Codes de relations, de sources et de conventions de description .</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='088'>
+    <name>Numéro de rapport</name>
+    <description>Cette zone renferme un numéro de rapport qui n'est pas un Numéro normalisé de rapport technique (STRN). On entre les STRNs dans la zone 027 (Numéro normalisé de rapport technique (STRN).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro de rapport annulé/invalide</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='100'>
+    <name>100 - Vedette principale--nom de personne</name>
+    <description>La vedette principale est accordée à la personne principalement responsable de l'ouvrage.</description>
+    <indicator position='1' value='0'>
+      <description>Prénom La valeur 0 indique que la vedette commence par un prénom ou représente un nom composé de mots, de phrases, d'initiales, de lettres séparées ou de chiffres présentés en ordre direct.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de famille La valeur 1 indique que la vedette est un nom de famille présenté dans l'ordre inversé (nom de famille, prénom) ou un nom sans prénom qui est établi comme un nom de famille.</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Nom d'une famille La valeur indique que la vedette est le nom d'une famille, d'un clan, d'une dynastie, d'une maison ou d'un groupe similaire. Le nom peut être présenté dans l'ordre direct ou inversé.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de personne  Le nom peut être un nom de famille et/ou un prénom; des lettres, des initiales, des abréviations, des expressions ou des numéros utilisés à la place d'un nom ou d'un nom de famille.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numérotation  La sous-zone $b contient un chiffre romain ou un chiffre romain et une partie subséquente d'un prénom. Elle est utilisée seulement pour des vedettes de prénoms (premier indicateur, valeur 0).</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Titres et autres qualificatifs associés au nom</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Dates associées au nom  Cette zone comprend les dates de naissance, de décès, dates de prospérité ou toute autre date utilisée avec un nom.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation  Contient une désignation de fonction qui décrit la relation entre le nom et l'ouvrage.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document  Renferme une date de publication contenue dans la portion du titre d'une vedette nom-titre.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers  Contient des données qui ne peuvent être ajoutées dans une autre sous-zone définie.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Qualificatif d'attribution  Renferme des renseignements relatifs au qualificatif d'attribution de noms dont la responsabilité est inconnue, incertaine, fictive ou pseudonyme.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document  Inclut un terme représentant la langue, tel polyglotte utilisé dans un titre uniforme d'un ouvrage figurant dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document  Contient une désignation numéro pour une partie ou section d'un document utilisé avec un titre dans une zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document  Contient une indication du nom d'une partie/section d'une œuvre utilisée dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Forme complète du nom  Contient une forme plus complète de la partie du nom qui se trouve dans la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document  Contient un titre uniforme, un titre de la page titre d'un ouvrage ou un titre d'une collection utilisé dans une zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation  Précise l'affiliation ou l'adresse du nom.</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation  contient un code MARC qui indique la relation entre un nom et un ouvrage. On peut ajouter plus d'un code de relation si la personne a plus d'une fonction. Voir&#160;: Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='110'>
+    <name>110 - Vedette principale--nom de collectivité</name>
+    <description>La vedette principale sous le nom d'une collectivité est attribuée aux ouvrages qui représentent la pensée collective d'une organisation.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé Le nom de la collectivité commence par un nom de personne présenté dans l'ordre inversé.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu La vedette représente un nom de lieu qui est également une entité ecclésiastique ou un nom de lieu sous lequel un nom de collectivité ou le titre d'un document est entré.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de la collectivité ou nom de lieu comme élément de classement  Le nom de la collectivité ou de la première entité lorsque des unités subordonnées sont présentes, un nom de lieu sous lequel une collectivité, un quartier de ville, ou un titre de document est entré ou un nom de lieu représentant également une entité ecclésiastique.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Collectivité subordonnée  Le nom d'une unité subordonnée à une collectivité, d'un quartier de ville ou d'un nom de réunion mis en vedette sous le nom d'une collectivité ou d'un nom de lieu.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion  Le nom du lieu ou le nom de l'organisme où la réunion a eu lieu.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de réunion ou de signature du traité  La date de la réunion, ou, ans la zone nom/titre, la date de la signature du traité.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation  Une désignation de fonction qui décrit la liaison entre un nom et un ouvrage.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document  La date du document contenue dans la portion du titre d'une vedette nom/titre</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers  Le nom de l'autre signataire d'un traité dans la zone nom-titre, un sous-élément qui ne peut être accommodé par les sous-zones $c, $d ou $n, ou des données qui ne peuvent être reçues par une autre sous-zone définie dans tout autre type de zone de nom de collectivité.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document  Le nom ou les noms des langues d'un document apparaissant dans la zone nom/titre</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion  Le numéro d'une réunion qui est entré sous un nom de collectivité ou pour une partie ou section d'un ouvrage utilisé avec un titre dans une zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document  Une indication du nom de parties ou de sections d'une œuvre utilisée dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document  Un titre uniforme, un titre de la page titre d'un document ou un titre d'une publication en série utilisé dans une zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation  L'affiliation ou l'adresse du nom.</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation  Un code MARC spécifiant la relation existant entre un nom et un ouvrage. Voir&#160;: Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='111'>
+    <name>111 - Vedette principale--nom de réunion</name>
+    <description>Cette zone contient un nom de réunion ou de conférence désigné comme vedette principale.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé Le nom de la réunion commence par un nom propre présenté dans l'ordre inversé (nom de famille, prénom).</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu Indique que le nom de réunion est entré sous un nom de lieu.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de réunion ou nom de lieu comme élément de classement  Le nom d'une réunion ou le nom de lieu sous lequel une réunion est entrée. A name of a meeting, or the first entity when subordinate units are present; or a jurisdiction name under which a meeting name is entered.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion  Un nom de lieu ou le nom d'une institution où la réunion a eu lieu.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date de réunion</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Collectivité subordonnée  Le nom d'une entité subordonnée à la réunion.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document  La date de publication d'un ouvrage utilisée avec le titre de l'ouvrage dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers  Tout élément de donnée additionnel qui ne peut trouver place dans aucune autre sous-zone.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document  Le nom ou les noms des langues utilisées dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion  Le numéro d'une réunion; contient également une indication de numéro pour une partie ou section d'un ouvrage.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document  Un nom de partie ou de section d'une œuvre dans la zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Nom de la réunion suivant le nom de lieu comme élément de classement  Un nom de réunion qui est entré sous un nom de juridiction contenu dans la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document  Un titre uniforme, un titre de la page de titre d'un ouvrage ou un titre d'une collection utilisé dans une zone nom/titre.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation  Précise l'affiliation ou l'adresse du nom.</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation  Un code MARC qui indique la relation entre un nom et un document. Voir&#160;: Codes de relations, de sources et de conventions de description</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='130'>
+    <name>130 - Vedette principale--titre uniforme</name>
+    <description>Cette zone contient un titre uniforme désigné comme vedette principale.</description>
+    <indicator position='1' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document  La date du document contenue dans la portion du titre d'une vedette nom/titre</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Une indication du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document  Le titre de la page de titre d'un document.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='210'>
+    <name>Titre abrégé</name>
+    <description>Cette zone renferme un titre du document qui a été abrégé pour fins d'indexation ou d'identification. Les centres de l'ISSN y entrent un titre-clé abrégé, basé sur le Titre-clé (zone 222). Les organismes de catalogage, y compris les services d'indexation et de résumés analytiques, peuvent y entrer d'autres titres abrégés. Le titre abrégé peut être créé par l'organisme qui ajoute la zone ou être transcrit à partir du document en main.</description>
+    <indicator position='1' value='0'>
+      <description>Pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Titre-clé abrégé</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Autre titre abrégé</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre abrégé</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='2' repeatable='false'>
+      <description>Source  La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='222'>
+    <name>Titre-clé</name>
+    <description>Cette zone renferme un titre unique assigné à une ressource continue conjointement avec le Numéro international normalisé des publications en série (ISSN) entré à la zone 022 (ISSN).</description>
+    <indicator position='2' value='1-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre-clé</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Éléments additionnels  La sous-zone $b contient les données additionnelles permettant de rendre le titre unique. Le contenu de la sous-zone $b est toujours entre parenthèses.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='240'>
+    <name>Titre uniforme</name>
+    <description>Cette zone contient le titre uniforme d'un ouvrage lorsqu'une zone 100 (Vedette principale-Nom de personne), une zone 110 (Vedette principale-Nom de collectivité), ou une zone 111 (Vedette principale- Nom de réunion) figure aussi dans la notice bibliographique.</description>
+    <indicator position='1' value='0'>
+      <description>Non imprimé ou affiché</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Imprimé ou affiché</description>
+    </indicator>
+
+    <indicator position='2' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers  La sous-zone $g comprend tout élément de donnée additionnel qui ne peut trouver place dans aucune autre sous-zone.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Le sous-zone $h contient une indication du genre de document utilisée dans une zone de titre uniforme.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='242'>
+    <name>Traduction du titre par l'organisme de catalogage</name>
+    <description>Cette zone contient un titre consistant en la traduction du titre propre. Cette traduction est effectuée par l'organisme de catalogage. On ne se sert de cette zone que si le titre traduit n'apparaît pas sur le document en main comme titre parallèle, lequel est entré dans la zone 245 (Mention du titre). L'expression Titre traduit: qui précède normalement la traduction du titre n'apparaît pas dans la notice MARC. Le système peut la générer comme constante d'affichage associée à l'étiquette de la zone.</description>
+    <indicator position='1' value='0'>
+      <description>Pas de vedette secondaire La valeur «&#160;0&#160;» indique qu'aucune vedette secondaire de titre n'est générée.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Vedette secondaire La valeur «&#160;1&#160;» indique qu'il faut générer une vedette secondaire de titre.</description>
+    </indicator>
+
+    <indicator position='2' value='1-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre  La sous-zone $a contient le titre propre; on y exclut le numéro, le nom de la partie ou le titre alternatif.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste du titre  La sous-zone $b contient le reste des données sur le titre. Les données comprennent les titres parallèles, les titres subséquents et d'autres données sur le titre.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Mention de responsabilité, etc.  La sous-zone $c renferme la mention de responsabilite et/ou reste des données, qui n'ont pas été entrées dans l'une des autres sous-zones.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Code de langue du titre traduit  La source du code MARC est le document intitulé Codes des langues MARC</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='243'>
+    <name>Titre uniforme (collectif)</name>
+    <description>Cette zone renferme un titre générique utilisé pour regrouper les œuvres d'un auteur prolifique. Ce titre est établi par le catalogueur. Les crochets qui entourent généralement un titre uniforme n'apparaissent pas dans la notice MARC. Le système peut les générer comme constante d'affichage associée à l'étiquette de la zone.</description>
+    <indicator position='1' value='0'>
+      <description>Non imprimé ou affiché.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Imprimé ou affiché</description>
+    </indicator>
+
+    <indicator position='2' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='245'>
+    <name>Mention du titre</name>
+    <description>Cette zone contient le titre et la mention de responsabilité d'une notice bibliographique.</description>
+    <indicator position='1' value='0'>
+      <description>Aucune vedette secondaire La valeur «&#160;0&#160;» signale qu'aucune vedette secondaire de titre n'est générée, soit parce qu'on ne souhaite pas en générer une ou parce que la vedette secondaire de titre est mentionnée différemment du titre contenu dans la zone 245.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Vedette secondaire La valeur «&#160;1&#160;» signifie qu'une vedette secondaire de titre est générée.</description>
+    </indicator>
+
+    <indicator position='2' value='1-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste du titre</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Mention de responsabilité, etc.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Dates extrêmes  La sous-zone $f contient la période de création de tous les documents décrits dans la notice.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Dates générales  La sous-zone $g renferme la période de création de la majeure partie des documents décrits.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Forme  La sous-zone $k renferme la forme du document. On différencie les genres de documents particuliers (p.&#160;ex., les journaux, les journaux personnels, les répertoires, les revues, les mémorandums, etc.), en examinant leurs caractéristiques matérielles, le sujet de leur contenu intellectuel ou l'ordre des données dans les documents.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version  La sous-zone $s renferme le nom, le code ou la description d'un exemplaire des documents décrits qui ont été produits à des moments différents ou à l'intention d'auditoires différents.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='246'>
+    <name>Variante du titre</name>
+    <description>Cette zone contient des variantes du titre associées au document, mais pas nécessairement présentes dans celui-ci. On n'entre ces variantes du titre dans la zone 246 que si elles diffèrent substantiellement de la mention du titre dans la zone 245 et si elles contribuent à mieux identifier le document.</description>
+    <indicator position='1' value='0'>
+      <description>Note, pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Note, vedette secondaire</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Pas de note, pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Pas de note, vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucun génre précisé</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Partie du titre La valeur «&#160;0&#160;» indique que le titre présent dans la zone 246 représente une portion de titre pour laquelle on veut établir une vedette secondaire et que ce titre ne requiert pas de note produite à l'aide de cette zone, donc au une constante d'affichage est générée.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Titre parallèle La valeur «&#160;1&#160;» indique que le titre présent dans la zone 246 est un titre parallèle, c'est-à-dire un titre dans une autre langue pour lequel on veut établir une vedette secondaire. Lorsqu'un ou plusieurs titres parallèles sont entrés dans la zone 245, on entre aussi chaque titre parallèle dans un zone 246 séparée. Aucune constante d'affichage est générée.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Titre distinct Les titres distincts sont des titres particuliers apparaissant, en plus du titre régulier, dans des livraisons individuelles d'un document.La constante d'affichage Titre distinct: est associée à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Autre titre On utilise cette valeur lorsque les autres valeurs du second indicateur ne conviennent pas.On associe la constante d'affichage Autre titre: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Titre de la couverture Il s'agit du titre imprimé sur la couverture originale de la publication, ou garvé ou estampé sur la reliure de l'éditeur. On n'assigne cette valeur que si la couverture n'est pas la source principale d'information. On associe la constante d'affichage Titre de la couverture: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Titre de la page de titre additionnelle Il s'agit habituellement d'un titre dans une autre langue qu'on trouve sur une page de titre précédant ou suivant la page de titre utilisée comme source principale; il peut aussi s'agir d'un titre placé sur une page de titre disposée tête-bêche à la fin de la publication. On associe la constante d'affichage Titre de la page de titre additionnelle: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Titre de départ La valeur «&#160;6&#160;» indique que le titre entré à la zone 246 est un titre de départ; il s'agit du titre imprimé au commencement de la première page de texte. On associe la constante d'affichage Titre de départ: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Titre courant La valeur «&#160;7&#160;» indique que le titre entré à la zone 246 est un titre courant; il s'agit du titre imprimé dans la marge supérieure ou inférieure de chaque page de la publication. On associe la constante d'affichage Titre courant: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Titre au dos La valeur «&#160;8&#160;» indique que le titre entré à la zone 246 est le titre qu'on trouve sur le dos de la publication. On associe la constante d'affichage Titre au dos: à cette valeur d'indicateur.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre propre/titre abrégé</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste du titre</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Indication de la date ou de la séquence  La sous-zone $f contient les dates ou les numéros de volume et de livraison qui relient la variante du titre à la notice.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='247'>
+    <name>Ancien titre</name>
+    <description>Cette zone renferme un ancien titre propre.</description>
+    <indicator position='1' value='0'>
+      <description>Pas de vedette secondaire</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Vedette secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Afficher une note L'expression Le titre varie: précède un ancien titre ou une ancienne variante du titre dans la note produite à partir des données de la zone 247.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Ne pas afficher une note On peut aussi entrer les anciens titres propres dans la zone 547 (Note explicative du titre antérieur).</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste du titre</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Indication du date ou de la séquence  La sous-zone $f contient les dates ou les numéros de volume et de livraison qui relient l'ancienne variante du titre à la notice.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir &#160;Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='250'>
+    <name>Mention d'édition</name>
+    <description>Cette zone renferme les données relatives à l'édition d'un ouvrage. Ce sont les règles de catalogage qui déterminent ce qui constitue une mention d'édition.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Mention d'édition</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste de la mention d'édition  La sous-zone $b contient le reste de la mention d'édition qui comprend habituellement une mention de responsabilité personnelle ou collective et aussi, parfois, des mentions parallèles d'édition.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='254'>
+    <name>Mention de la représentation de l'imprimé musical</name>
+    <description>Cette zone contient la mention de représentation de l'imprimé musical dans le cas de musique imprimée ou manuscrite. La mention de représentation de l'imprimé musical décrit le support de l'édition qui pourrait être différent de celui d'une autre édition de la même œuvre, par exemple, un quatuor à cordes publié sous forme d'une partition, d'une partition d'étude individuelle, d'une partition et de parties ou d'un ensemble de parties. Cette zone ne s'applique pas aux enregistrements sonores.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Mention de la représentation de l'imprimé musical</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='255'>
+    <name>Données mathématiques sur les documents cartographiques</name>
+    <description>Cette zone renferme les données mathématiques associées à des documents cartographiques, y compris une mention de l'échelle, une mention de projection et/ou une mention des coordonnées de délimitation.Les cartes célestes peuvent aussi contenir une mention de zone, des données de déclinaison, d'ascension droite ou l'équinoxe. On peut également entrer, sous forme codée, les données mathématiques contenues dans cette zone dans la zone 034 (Données mathématiques codées sur les documents cartographiques).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Mention d'échelle  La sous-zone $a contient la mention complète de l'échelle, y compris toute mention d'équivalence. On entre aussi, dans la sous-zone $a, les mentions d'échelles des hauteurs ou du coefficient de surhaussement des modèles en relief ou d'autres documents en trois dimensions.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Mention de projection</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Mention de coordonnées</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Mention de zone  La sous-zone $d renferme la mention de zone pour les cartes célestes.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Mention d'équinoxe</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Paires de coordonnées sur l'anneau G d'inclusion</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Paires de coordonnées sur l'anneau G d'exclusion</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='256'>
+    <name>Caractéristiques du fichier d'ordinateur</name>
+    <description>On utilise cette zone pour entrer les caractéristiques relatives à un fichier d'ordinateur. Elle peut renfermer de l'information sur le type de fichier (p.&#160;ex., des programmes d'ordinateur), le nombre d'enregistrements, de lignes etc. (p.&#160;ex., 1 250 enregistrements, 5 076 multiplets).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Caractéristiques du fichier d'ordinateur</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='257'>
+    <name>Pays de l'agence de production des films d'archives</name>
+    <description>Cette zone contient le nom ou l'abréviation du ou des pays dans lesquels se trouvent les principaux bureaux de l'agence ou des agences de production d'un film d'archives.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Pays de l'agence de production des films d'archives  La sous-zone peut contenir une indication précisant que le pays est inconnu, p.&#160;ex., S.l.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='258'>
+    <name>Données relatives à l'émission de matériel philatélique</name>
+    <description>Cette zone contient l'information concernant la juridiction responsable et la valeur nominale de matériel philatélique tel que les timbres-poste, les entiers postaux (cartes-poste, etc., mises en vente par une administration postale et sur lesquelles est imprimée une valeur nominale), les timbres fiscaux, les timbres-taxe et les timbres utilisés pour le courrier recommandé. Ces documents sont habituellement valides dans une région précise et comportent des renseignements signifiant que des frais ont été payés d'avance ou que des frais doivent être payés pour obtenir des services ou pour respecter des obligations de nature fiscale.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Juridiction responsable</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Valeur nominale</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='260'>
+    <name>Publication, diffusion, etc. (Adresse bibliographique)</name>
+    <description>Cette zone contient les données relatives à la publication, à l'impression, à la diffusion, à la mise en circulation, au lancement ou à la production d'un ouvrage.</description>
+    <indicator position='1' value='#'>
+      <description>Non défini/Sans objet/Aucune information fournie/Éditeur le plus ancien</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Éditeur intermédiaire</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Éditeur actuel/le plus récent</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Lieu de publication, diffusion, etc.  Lorsque le lieu est inconnu, on peut entrer l'abréviation [S.l.].</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Nom de l'éditeur, diffuseur, etc.  Lorsque le nom est inconnu, on peut inscrire l'abréviation [s.n.].</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Date de publication, diffusion, etc.  On enregistre dans une seule sous-zone $c plusieurs dates de publication juxtaposées, telles qu'une date de publication et une date de copyright (droit d'auteur).</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Lieu de fabrication</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Nom du fabricant  Lorsque le nom est inconnu, on peut inscrire l'abréviation [s.n.].</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Date de fabrication</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='263'>
+    <name>Date de publication anticipée</name>
+    <description>On utilise cette zone pour les ouvrages qui n'ont pas encore été publiés, mais qui ont été catalogués dans le cadre d'un programme de catalogage avant publication (CIP) ou de programmes semblables qui créent des notices de prétirage, tels que le programme du centre national de l'ISSN aux États-Unis.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Date de publication anticipée  La date est présentée selon le format aaaamm (soit quatre chiffres pour l'année et deux pour le mois). Si une partie de la date est inconnue, on entre alors un trait d'union (-) pour remplacer les chiffres inconnus.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='270'>
+    <name>Adresse</name>
+    <description>Cette zone renferme une adresse (ainsi que l'information d'accès électronique telle le courrier électronique, le téléphone, le télécopieur, etc.) pour obtenir de l'information sur le contenu du document bibliographique. On doit répéter la zone 270 si on doit enregistrer plus d'une adresse, par ex. l'adresse actuelle est differente que l'adresse postale.</description>
+    <indicator position='1' value='1'>
+      <description>Primaire</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Secondaire</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Courrier postal</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Type indiqué dans la sous-zone $=i</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Adresse</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Ville</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>État ou province</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Pays</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Code postal</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Titre précédent à l'attention de</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>À l'attention de</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Titre suivant à l'attention de</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Type d'adresse</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Numéro de téléphone spécialisé</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Numéro de téléphone</description>
+    </subfield>
+
+    <subfield code='l' repeatable='false'>
+      <description>Numéro de télécopieur</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Adresse de courrier électronique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro ATS ou ATM</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Agent de liaison</description>
+    </subfield>
+
+    <subfield code='q' repeatable='false'>
+      <description>Titre de l'agent de liaison</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Heures de service</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='300'>
+    <name>Description matérielle</name>
+    <description>Dans cette zone, on trouve une description matérielle du document concernant son étendu et ses dimensions. Elle peut également inclure d'autres caractéristiques matérielles du document et des données sur le matériel d'accompagnement.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Nombre d'unités matérielles  La sous-zone $a renseigne sur le nombre d'unités matérielles qui comprend généralement le nombre de pages, le nombre de volumes, la durée totale d'exécution, etc. pour chaque type d'unité.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Autres caractéristiques matérielles  La sous-zone $b contient de l'information qui précise les autres caractéristiques matérielles d'un document, telles l'identification des illustrations, les couleurs, la vitesse d'écoute, les traits de sillons, la présence et le type de son, le nombre de canaux, le format de présentation du film cinématographique, etc.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Dimensions  La sous-zone $c indique les dimensions d'un document, généralement en centimètres, millimètres ou pouces. Les dimensions peuvent être suivies d'un qualificatif, situé entre parenthèses, indiquant le format du document (p.&#160;ex.&#160;: (fol.), (in-8)).</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Matériel d'accompagnement  La sous-zone $e contient une description du matériel d'accompagnement. Elle peut inclure, entre parenthèses, tous les renseignements additionnels sur la description matérielle.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Type de l'unité  Le type d'unité inclut des termes tels que page, volumes, boîtes, pied cube, pied linéaire, etc. qui sont utilisés pour identifier le format du matériel et comment il doit être entreposé.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Dimensions de l'unité  La sous-zone $g contient les dimensions d'un type d'unité identifié dans la sous-zone $f précédente. La sous-zone $g se répète lorsque des données additionnelles se rapportant aux unités matérielles sont fournies.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés  La sous-zone $3 contient des renseignements sur la partie des matériaux décrits correspondant à la zone pertinente.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='306'>
+    <name>Durée d'exécution</name>
+    <description>Cette zone contient une représentation numérique formatée sur la durée d'exécution d'un document; par exemple, la durée d'un enregistrement sonore ou la durée d'exécution d'une représentation d'une partition ou d'un manuscrit imprimé de musique. La durée d'exécution est composée de six caractères et elle est encodée de la manière suivante&#160;: hhmmss (2 caractères pour l'heure, 2 caractères pour les minutes et 2 caractères pour les secondes). Dans le cas d'enregistrements de moins d'une heure, l'heure est inscrite avec deux zéros et s'il est de moins d'une minute, la minute est inscrite avec deux zéros.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Durée d'exécution</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='307'>
+    <name>Heures, etc.</name>
+    <description>Dans cette zone, on trouve les renseignements de type chronologique sur les jours et/ou les temps de disponibilité ou d'accessibilité d'un document. Principalement, il est utile pour des notices de ressources électroniques.</description>
+    <indicator position='1' value='#'>
+      <description>Heures</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Heures</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Information supplémentaire</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='310'>
+    <name>Périodicité courante de la publication</name>
+    <description>Dans cette zone, on trouve les renseignements sur la périodicité courante de la publication ou de la mise à jour de la publication. La ou les dates de la périodicité courante de la publication sont fournies lorsque la date de début de la périodicité courante n'est pas la même que la date de début de la publication. Lorsque la publication cesse d'être publiée, on indique la date de fermeture de périodicité mais elle demeure inscrite dans la zone 310. Ces donées sont associées aux données codées contenues dans 008/18 (006/01) Périodicité et 008/19 (006/02) Régularité.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Périodicité courante de la publication</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Date de la périodicité courante de la publication  La sous-zone $b contient la date de début de la périodicité courante d'une publication lorsqu'elle est différente de la date de début de la publication et lorsque la périodicité d'une publication antérieure est indiquée dans la zone 321.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='321'>
+    <name>Périodicité antérieure de la publication</name>
+    <description>Cette zone est utilisée seulement si la périodicité courante est indiquée dans la zone 310 (Périodicité courante de la publication).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Périodicité antérieure de la publication</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Dates de la périodicité antérieure de la publication</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='340'>
+    <name>Support matériel</name>
+    <description>Cette zone s'applique principalement à des genres spéciaux de documents, tels ceux qui requièrent de l'équipement technique pour leur utilisation ou des exigences particulières pour leur conservation ou leur entreposage.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Matériel de base et arrangement  Cette zone enregistre les caractéristiques physiques des documents décrits.Cette zone s'applique principalement à des genres spéciaux de documents, tels ceux qui requièrent de l'équipement technique pour leur utilisation ou des exigences particulières pour leur conservation ou leur entreposage.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Dimensions  La sous-zone $b indique les dimensions des matériaux de configuration; par exemple, 35 mm. (film), 30 cm (disque phonographique), 11 x 15 cm (microfiche).</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Substances appliquées à la surface  La sous-zone $c identifie la substance matérielle appliquée sur le matériel de base, telle que l'encre, l'huile, la peinture, les émulsions photographiques spécifiques telles que l'albumen.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Technique d'enregistrement des données  La sous-zone $d contient une expression sur les moyens ou les techniques utilisés lors de la transcription de l'information dans ou sur le matériel, par exemple, perforé, coupé, moulu, par thermocopieur ou rayon X.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Support  La sous-zone $e spécifie le matériel sur lequel ou à l'intérieur duquel les documents sont montés, reliés ou conservés de quelque façon.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Vitesse/facteur de production  La sous-zone $f précise le facteur ou la vitesse normale qu'il faut adopter pour que l'information contenue dans le matériel demeure compréhensible: p.&#160;ex., tours à la minute pour les enregistrements, échelle d'agrandissement pour les réductions photographiques.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Référence exacte à l'intérieur du support  La sous-zone $h indique l'emplacement des documents décrits, compte tenu du matériel de base et de son arrangement: p.&#160;ex., bande, page, numéro d'image.</description>
+    </subfield>
+
+    <subfield code='i' repeatable='false'>
+      <description>Spécifications techniques du support  La sous-zone $i énumère les conditions d'accès au document nécessitant l'usage d'équipement technique.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés  La sous-zone $3 identifie la partie du document décrit à laquelle la zone s'applique.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='342'>
+    <name>Données de références géospatiales</name>
+    <description>Cette zone comprend une description du cadre de référence des coordonnées d'un ensemble de données. L'utilisateur d'un ensemble de données doit pouvoir déterminer comment l'exactitude de l'emplacement a été modifiée par l'application d'une méthode de référence géospatiale, ce qui lui permettra de manipuler l'ensemble de données pour retrouver l'exactitude de l'emplacement.</description>
+    <indicator position='1' value='0'>
+      <description>Système de coordonnées horizontales</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Système de coordonnées verticales</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Géographique</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Projection cartographique</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Système de coordonnées de quadrillage</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Coordonnées planes locales</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Locales</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Modèle géodésique</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Altitude</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Méthode indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Profondeur</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Unités de distance ou de coordonnées</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Résolution de la latitude</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Résolution de la longitude</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Parallèle de référence ou latitude oblique</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Longitude oblique</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Longitude du méridien central ou du centre de la projection</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Latitude du centre de la projection ou de son origine</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Abscisse fictive</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Ordonnée fictive</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Facteur d'échelle</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Hauteur du point de vue au-dessus de la surface</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Angle d'azimut</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Longitude d'après une mesure en azimut ou longitude verticale directe mesurée à partir du pôle</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Numéro du landsat et de la trajectoire</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Identificateur de zone</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Nom de l'ellipsoïde</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Demi grand-axe</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Dénominateur du rapport d'aplatissement</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Résolution verticale</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Méthode d'encodage vertical</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Projection plane, locale ou autre ou description de quadrillage</description>
+    </subfield>
+
+    <subfield code='w' repeatable='true'>
+      <description>Information plane locale ou à référence géospatiale locale</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Méthode de référence utilisée</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='343'>
+    <name>Données de coordonnées planes</name>
+    <description>Cette zone contient de l'information concernant le système de coordonnées élaborées sur une surface plane. Les renseignements sont présentés de telle sorte que l'utilisateur de données géospatiales peut identifier le nombre de distances ou les distances et les angles. Elles définissent la position d'un point d'une surface plane de référence sur laquelle la surface de la terre a été projetée.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Méthode d'encodage des coordonnées planes</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Unités de distance plane</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Résolution de l'abscisse</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Résolution de l'ordonnée</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Résolution de la distance</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Résolution du relèvement</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Unités du relèvement</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Direction de référence du relèvement</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Méridien de référence du relèvement</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='351'>
+    <name>Arrangement et classement du matériel</name>
+    <description>Cette zone enregistre des données sur l'arrangement et le classement d'une collection de documents. Les renseignements concernant l'organisation et la classification de fichiers d'ordinateur, par exemple, peuvent porter sur la structure du fichier ou la séquence de tri du fichier; pour les documents visuels, les renseignements pertinents à l'organisation d'une collection peuvent être utilisés.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Arrangement du matériel  La sous-zone $a contient les données décrivant la façon dont les documents décrits ont été organisés en plus petites unités, tout comme les groupes de notices sont organisés en séries et les séries en sous-séries. Les titres d'unités individuelles peuvent être inscrits dans cette sous-zone. Dans le cas d'un fichier d'ordinateur, la sous-zone $a décrit la structure du fichier. Lorsque l'arrangement dépend du logiciel d'un système particulier de gestion de base de données, on indique le nom du logiciel ou du système.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Classement du matériel  La sous-zone $b comprend des termes décrivant l'ordre dans lequel on a classé les documents à l'intérieur de l'unité décrite; p.&#160;ex., ordre alphabétique, chronologique, par pays, par bureau d'origine, etc.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Niveau hiérarchique  La sous-zone $c enregistre la position hiérarchique des documents décrits en relation avec d'autres documents de même provenance.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés  La sous-zone $3 identifie le sous-ensemble des documents décrits auquel la zone s'applique.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='352'>
+    <name>Représentation graphique numérique</name>
+    <description>Cette zone contient une description de la méthode d'établissement des références et du mécanisme utilisé pour représenter l'information géospatiale dans un ensemble de données. Il s'agit de la nature de la technique d'inscription utilisée, du nombre d'éléments dans l'ensemble des données, et du support dans lequel l'information est stockée.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Méthode de réeférence directe</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Type d'objet</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Nombre d'objets</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Nombre de rangées</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Nombre de colonnes</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Nombre vertical</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Niveau de topologie VPF</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Description de référence indirecte</description>
+    </subfield>
+
+    <subfield code='q' repeatable='false'>
+      <description>Support de l'image numérique</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='355'>
+    <name>Classification de sécurité</name>
+    <description>Cette zone contient des détails relatifs à la classification de sécurité relative au document, au titre, à l'extrait, à la note de contenu ou à l'auteur. De plus, elle peut contenir des instructions de manipulation et de l'information sur la diffusion externe relative à la diffusion du document, du titre, de l'extrait, de la note de contenu ou de l'auteur. La zone peut également contenir des données de déclassement ou de déclassification, le nom du système de classification et un code de pays d'origine. La source du code est le document intitulé Codes de pays MARC</description>
+    <indicator position='1' value='0'>
+      <description>Document</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Titre</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Extrait</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Note de contenu</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Auteur</description>
+    </indicator>
+
+    <indicator position='1' value='5'>
+      <description>Notice</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Autre élément</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Classification de décurité  La sous-zone $a contient une classification de sécurité (par ex.: non classifié, secret, confidentiel) connexe au document, au titre, à l'extrait, à la note de contenu ou à l'auteur.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Instructions de manipulation  La sous-zone $b contient des instructions de manipulation, par ex. les personnes, au sein de l'organisation, autorisées à manipuler ou à voir le document, le titre, l'extrait, la note de contenu ou l'auteur.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Information sur la diffusion externe</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Données de déclassement ou de déclassification  La sous-zone $d contient des données (généralement une date) relatives au moment auquel la classification de sécurité doit être déclassée ou auquel les documents doivent être déclassifiés. La sous-zone peut également contenir une phrase en rapport avec le déclassement ou la déclassification, par ex. OADR (qui veut dire Original Agency Determination Required [détermination nécessaire de l'organisme original]). Les dates pertinentes à la révision à la baisse ou à la déclassification sont inscrites dans la sous-zone $g ou $h.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Système de classification  La sous-zone $e contient le nom d'un système de classification de sécurité. Le nom ne provient pas nécessairement d'une liste contrôlée.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Code du pays d'origine  La sous-zone $f contient un code composé de deux ou trois caractères alphabétiques indiquant le pays d'origine de la classification. La source du code MARC est le document intitulé Codes de pays MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Date de révision à la baisse  La sous-zone $g indique une date se rapportant au déclassement d'un document, d'un titre, d'un résumé, d'une note de dépouillement ou d'un auteur. Le déclassement implique des modifications à la classification de sécurité, d'un niveau élevé à un niveau plus bas.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Date de déclassification  La sous-zone $h indique une date relative à la déclassification d'un document, d'un titre, du résumé, de la note de contenu ou de l'auteur. La déclassification implique que la classification de sécurité du document sera supprimée.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Autorisation  La sous-zone $j contient les données identifiant quelle autorité a effectué la modification à la classification. Cette sous-zone contient un code MARC émis par l'organisme autorisé. Voir Sources des codes des organismes pour une liste des sources relatives aux codes des organismes utilisés dans les notices MARC&#160;21.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='357'>
+    <name>Source de diffusion</name>
+    <description>Cette zone contient des détails spécifiques sur le contrôle de la diffusion des documents en main par l'émetteur (c-à-d. l'auteur, le producteur). La sous-zone $a contient un terme particulier indiquant que l'émetteur contrôle les documents.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Terme de contrôle par l'émetteur</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Organisme de départ</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Destinataires habilités des documents</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Autres restrictions</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='362'>
+    <name>Dates de publication et/ou désignation d'ordre séquentiel</name>
+    <description>Cette zone renferme la désignation des volumes et/ou les dates du début et/ou de la fin d'une publication. Les dates de cette zone constituent des désignations chronologiques sur les livraisons individuelles de la publication en série. Les désignations séquentielles sont habituellement numériques mais peuvent être également alphabétiques. Les données peuvent être structurées ou non structurées. Lorsque l'information concernant la date provient d'une source autre que la première et/ou dernière livraison de la publication, l'information est transcrite dans une note non structurée et la source d'information est habituellement citée.</description>
+    <indicator position='1' value='0'>
+      <description>Forme structurée</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Note non structurée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Dates de publication et/ou désignation d'ordre séquentiel  Si on enregistre ensemble la mention de volumes et la désignation chronologique, on insère la désignation chronologique entre parenthèses.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='true'>
+      <description>Source des données  La sous-zone $z contient une citation de la source des données inscrites dans la sous-zone $a</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='365'>
+    <name>Prix du commerce</name>
+    <description>Cette zone contient le prix courant de l'article.La zone est aussi utilisée pour enregistrer le prix à l'exportation particulier d'un article peu importe la monnaie.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Code type de prix</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Montant du prix</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Code unité monétaire</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Unité de l'établissement du prix</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Note sur le prix</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Prix en vigueur à partir du</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Prix en vigueur jusqu'au</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Taux de taxation 1</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Taux de taxation 2</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Code ISO du pays</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Code de pays MARC La source du code est le document intitulé Codes de pays MARC.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Identification de l'entité de l'établissement du prix</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du code type de prix  La source des codes MARC se trouve dans le document intitulé Codes de relations, de sources et de conventions de description MARC qui est mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='366'>
+    <name>Renseignement sur la disponibilité dans le commerce</name>
+    <description>Cette zone contient des renseignements précis concernant la disponibilité des produits chez les éditeurs. Elle est utilisée tout avant par les usagers du commerce du livre du format MARC.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Identification du titre comprimé donné par les éditeurs</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Date exacte de publication</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Code du statut de disponibilité</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date prévue de la prochaine disponibilité</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Type de rabais de l'éditeur</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Date d'épuisement</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Code ISO du pays</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Code de pays MARC  La source du code est le document intitulé Codes de pays MARC .</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Identification de l'agence</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du code type de prix  La source des codes MARC se trouve dans le document intitulé Codes de relations, de sources et de conventions de description MARC qui est mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='440'>
+    <name>Mention de collection / Vedette secondaire de titre</name>
+    <description>Cette zone renferme une mention de titre de collection lorsque la mention de collection et la forme de la vedette secondaire contrôlée de la collection possèdent le même titre.</description>
+    <indicator position='2' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie ou de la section du document&#160; La sous-zone $n renferme la désignation sous forme de numéro de la partie ou de la section d'un titre de collection.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie ou de la section du document&#160; La sous-zone $p renferme la désignation sous forme de nom de la partie ou de la section d'un titre de collection.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Désignation des volumes / désignation séquentielle&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='490'>
+    <name>Mention de collection</name>
+    <description>La zone 490 ne sert pas de vedette secondaire d'une collection. Lorsque la zone 490 est utilisée et qu'il y a lieu d'entrer une vedette secondaire de collection, on enregistre la mention de collection (zone 490) et une vedette secondaire de collection correspondante (zones 800-830) dans la notice bibliographique.</description>
+    <indicator position='1' value='0'>
+      <description>Collection non mentionnée en rappel</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Collection mentionnée en rappel sous une forme différente</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Mention de collection&#160; La sous-zone $a contient le titre de la collection et peut également renfermer une mention de responsabilité, d'autre information sur le titre, des dates, ou des numéros de volumes qui précèdent le titre ou qui paraissent faire partie du titre.</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Cote de la Library of Congress&#160; La sous-zone $l contient la cote de la Library of Congress lorsqu'elle est donnée dans la mention de collection. Cette situation se produit lorsqu'un document est publié comme faisant partie d'une collection pendant une période de temps et a été classifié sous la cote de la Library of Congress de cette collection au cours de cette période.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Désignation des volumes / désignation séquentielle&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='500'>
+    <name>Note générale&#160;</name>
+    <description>Cette zone contient une note qui donne des renseignements généraux pour lesquels aucune zone de note plus spécialisée (i.e. une zone 5XX spécifique) n'existe.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note générale&#160;</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='501'>
+    <name>Note «&#160;Avec&#160;»</name>
+    <description>La note dans cette zone indique que plus d'un ouvrage bibliographique est compris dans le document physique au moment de la publication, de la parution ou de l'exécution. Les ouvrages contenus dans le document portent habituellement des titres distincts et sont dépourvus d'un titre collectif. La zone débute normalement par les mots Avec:, Publié avec:, etc.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note «&#160;Avec&#160;»&#160; La sous-zone $a contient le texte complet de la note y compris l'expression d'introduction (p.&#160;ex., Avec:, Sur la bobine avec:, Publié avec:).</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='502'>
+    <name>Note de thèse</name>
+    <description>Cette zone mentionne le type de thèse universitaire ainsi que l'institution où on l'a présentée. On entre dans la zone 500 (Note générale) les notes indiquant la relation entre le document en main et le mémoire ou la thèse de l'auteur.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note de thèse&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='504'>
+    <name>Note de bibliographie, etc.&#160;</name>
+    <description>Cette zone contient une note mentionnant la présence d'une ou plusieurs bibliographies, discographies, filmographies et/ou d'autres références bibliographiques à l'intérieur du document ou du matériel d'accompagnement décrit dans la notice. Avec les documents en plusieurs parties, y compris les publications en série, cette note peut s'appliquer à toutes les parties ou à une seule partie ou livraison.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note de bibliographie, etc.&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Nombre de références&#160; Généralement, on s'en sert pour déterminer l'importance d'une bibliographie.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='505'>
+    <name>Note de dépouillement structurée&#160;</name>
+    <description>Une note de dépouillement contient habituellement les titres d'œuvres séparées, les parties du document ou la table des matières. Elle peut aussi inclure les mentions de responsabilité associées à ces ouvrages ou parties. Les numéros de volumes et autres identificateurs séquentiels font aussi partie de la note de dépouillement; cependant, on omet généralement les numéros de chapitres.</description>
+    <indicator position='1' value='0'>
+      <description>Dépouillement complet</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Dépouillement incomplet La valeur «&#160;1&#160;» indique que la note de dépouillement est incomplète, c'est-à-dire que les parties d'un document en plusieurs parties ne sont pas toutes disponibles pour l'analyse, soit parce qu'elles ne sont pas encore publiées, soit parce que l'organisme de catalogage n'en a pas encore fait l'acquisition. La valeur «&#160;1&#160;» sert à générer la constante d'affichage Dépouillement incomplet&#160;:.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Dépouillement partiel La valeur «&#160;2&#160;» indique qu'il s'agit d'une note de dépouillement partiel qui ne décrit que certaines parties choisies d'un document même si toutes les parties sont disponibles pour l'analyse. Cette valeur sert à générer la constante d'affichage Dépouillement partiel:.</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Codage minimum</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Codage enrichi</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note de dépouillement structurée&#160; Le format de la note est déterminé par les règles de catalogage.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Renseignements divers&#160;</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Mention de responsabilité&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='false'>
+      <description>Titre&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160; La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='506'>
+    <name>Note sur les limites à la consultation&#160;</name>
+    <description>Cette zone indique les restrictions imposées à la libre utilisation des documents décrits. Pour les œuvres publiées, cette note fournit de l'information sur la limitation de la diffusion.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Conditions régissant la consultation&#160; La sous-zone $a identifie les restrictions légales, physiques ou administratives imposées aux personnes désireuses de consulter les documents décrits.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Juridiction&#160; La sous-zone $b contient la juridiction, c'est-à-dire le nom d'une personne, d'un organisme ou d'une position ou fonction à l'intérieur de l'organisme, qui impose ou applique les restrictions à la consultation et auprès de qui on peut interjeter appel.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Règlements contrôlant l'accès direct&#160; La sous-zone $c indique les arrangements nécessaires pour accéder directement au document.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Usagers autorisés&#160; La sous-zone $d indique la catégorie d'usagers ou les personnes précises (désignées par leur nom ou leur titre) pour qui les restrictions énoncées dans la sous-zone ¼a ne s'appliquent pas.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Autorisation&#160; La sous-zone $e précise quelle autorité est à la source de la restriction.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160; La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='507'>
+    <name>Note sur l'échelle des documents iconiques</name>
+    <description>. On utilise cette zone avec les dessins d'architecture et les artefacts en trois dimensions. Dans le cas des cartes géographiques, on ne peut donner l'information concernant l'échelle dans cette zone que pour des notices conformes aux règles de catalogage antérieures aux RCAA 2. Dans le cas des notices conformes aux RCAA 2, on entre la notation de l'échelle à la zone 255 (Données mathématiques sur les documents cartographiques).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note indiquant la fraction représentant l'échelle&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Reste de la note sur l'échelle&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='508'>
+    <name>Note de générique sur la production/création</name>
+    <description>Cette zone contient une note mentionnant le nom des personnes ou organismes (autres que ceux faisant partie de la distribution) qui ont participé à la création et/ou à la production d'une œuvre. La terme d'introduction Générique: qui accompagne souvent les données entrées à la zone 508, n'appaît pas dans la notice MARC. Le système peut le générer comme constante d'affichage associée à l'étiquette de la zone.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note de générique sur la production/création</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='510'>
+    <name>Note de citation/référence</name>
+    <description>Cette zone renferme les citations ou les références aux descriptions bibliographiques ou aux comptes rendus publiés. On l'utilise pour indiquer où un document a été cité ou critiqué.</description>
+    <indicator position='1' value='0'>
+      <description>Couverture inconnue La valeur «&#160;0&#160;» précise que la couverture n'est pas indiquée. On se sert de cette valeur pour générer la constante d'affichage Indexé par:.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Couverture complète On assigne la valeur «&#160;1&#160;» lorsque la couverture donnée par le service d'indexation et d'analyse inclut des références à tous les articles d'un périodique et/ou à tous les numéros de chaque volume, et est considérée comme étant complète. On se sert de la valeur «&#160;1&#160;» pour générer la constante d'affichage Indexé complètement par:.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Couverture sélective La valeur «&#160;2&#160;» indique que le service d'indexation ou d'analyse n'inclut pas de références à tous les articles d'un périodique. On se sert de cette valeur pour générer la constante d'affichage Indexé sélectivement par:.</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Pas de localisation exacte dans la source La valeur «&#160;3&#160;» indique que la source citée dans la zone 510 ne fournit pas de localisation exacte (p.&#160;ex., le numéro de volume, de page). On se sert de cette valeur pour générer la constante d'affichage Références:.</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Localisation exacte indiquée dans la source La valeur «&#160;4&#160;» indique que la source citée dans la zone 510 fournit les localisations exactes (p.&#160;ex., le numéro de volume, de page). On se sert de cette valeur pour générer la constante d'affichage Références:.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de la source</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Couverture de la source  La sous-zone $b contient les dates et/ou les indication des volumes de la publication en série auxquelles le service a commencé et terminé la couverture.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Localisation à l'intérieur de la source</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle&#160;</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='511'>
+    <name>Note sur les participants ou les interprètes</name>
+    <description>Cette zone contient une note donnant de l'information sur les participants, les acteurs, les narrateurs, les présentateurs ou les interprètes.</description>
+    <indicator position='1' value='0'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Distribution La valeur «&#160;1&#160;» sert à générer la constante d'affichage Distribution:.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les participants ou les interprètes</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='513'>
+    <name>Note sur le genre de rapport et la période de couverture</name>
+    <description>Cette zone contient une note qui précise le genre de rapport et la période couverte par ce rapport.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Genre de rapport&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Période de couverture&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='514'>
+    <name>Note sur la qualité des données</name>
+    <description>Cette zone renferme une note qui donne une évaluation générale de la qualité de l'ensemble des données constituant le document.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Rapport sur l'exactitude des caractéristiques&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Valeur d'exactitude des caractéristiques&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Explication de l'exactitude des caractéristiques&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Rapport sur la cohérence logique&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Rapport sur l'intégralité&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Rapport sur l'exactitude de position horizontale&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Valeur d'exactitude de position horizontale&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Explication de l'exactitude de position horizontale&#160;</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Rapport sur l'exactitude de position verticale&#160;</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Valeur d'exactitude de position verticale&#160;</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Explication de l'exactitude de position verticale&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Couverture nuageuse&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160; La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Affichage de note&#160; La sous-zone $z contient une note qui présente les données dans la zone, s'il y a lieu.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='515'>
+    <name>Note sur les particularités de la numérotation</name>
+    <description>Cette zone contient une note non structurée mentionnant les irrégularités et les particularités de la numérotation ou le rythme de parution. On peut aussi se servir de cette note pour indiquer qu'une publication paraît en parties ou en éditions révisées, ou pour fournir des renseignements sur les années couvertes par un rapport.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les particularités de la numérotation&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='516'>
+    <name>Note sur le genre de fichier d'ordinateur ou de données</name>
+    <description>Cette zone comporte des indications sur les caractéristiques du fichier d'ordinateur. En plus d'un descripteur générique (p.&#160;ex., texte, programmes d'ordinateur, fichier numérique), il est possible d'enregistrer dans cette zone des indications plus précises telles que la forme ou le genre de support textuel (p.&#160;ex., biographies, dictionnaires, index). On entre, sous forme codée, le genre général de fichier d'ordinateur dans la zone 008/26 (Genre de fichier d'ordinateur).</description>
+    <indicator position='1' value='#'>
+      <description>Genre de fichier</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur le genre de fichier d'ordinateur ou de données</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='518'>
+    <name>Note sur la date/l'heure et le lieu d'un événement</name>
+    <description>Cette zone enregistre la date/l'heure et/ou le lieu de création, de saisie ou de diffusion associés à un événement, i.e. la date/l'heure et/ou le lieu d'enregistrement, de tournage, d'exécution, de diffusion ou de découverte s'il s'agit d'artefacts. La zone 033 (Date/heure et lieu d'un événement) contient la même information sous forme codée.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur la date/l'heure et le lieu d'un événement</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='520'>
+    <name>Résumé, etc.</name>
+    <description>Cette zone contient une note non structurée décrivant la portée et le contenu du document. Il peut s'agir d'un résumé, d'un résumé analytique, d'une annotation, d'une critique ou simplement d'une phrase décrivant l'ouvrage.</description>
+    <indicator position='1' value='#'>
+      <description>Résumé</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Matière</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Critique</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Portée et contenu</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Résumé analytique</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Résumé, etc.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Développement du résumé</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='521'>
+    <name>Note sur le public cible</name>
+    <description>On l'utilise principalement lorsque le contenu d'un ouvrage convient à un public cible ou à un niveau intellectuel spécifique: p.&#160;ex., étudiants du niveau primaire. On utilise cette note pour indiquer les niveaux d'intérêt et de motivation ainsi que les caractéristiques spécifiques aux apprenants et apprenantes.</description>
+    <indicator position='1' value='#'>
+      <description>Public cible</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Niveau de lecture selon l'année scolaire</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Niveau d'intérêt selon l'âge</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Niveau d'intérêt selon l'année scolaire</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Caractéristiques spéciales du public cible</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Niveau de motivation/d'intérêt</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Note sur le public cible</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source  La sous-zone $b renferme le nom ou l'abréviation de l'agence ou de l'entité qui fournit les données concernant le public cible.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='522'>
+    <name>Note sur la représentation géographique&#160;</name>
+    <description>Cette zone fournit des indications sur la représentation géographique de l'ouvrage (habituellement pour du matériel d'enquête). On se sert de la zone 052 (Code de classification géographique) pour enregistrer les données géographiques sous forme codée.</description>
+    <indicator position='1' value='#'>
+      <description>Représentation geographique</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur la représentation géographique</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='524'>
+    <name>Note sur la citation préférée des documents décrits&#160;</name>
+    <description>Cette zone renferme la citation des documents décrits préférée par le conservateur.</description>
+    <indicator position='1' value='#'>
+      <description>Cité comme suit</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur la citation préférée des documents décrits&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du schéma utilisé&#160;</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='525'>
+    <name>Note de supplément&#160;</name>
+    <description>Cette zone clarifie ou amplifie les relations du document avec des suppléments ou des numéros spéciaux qui ne sont pas enregistrés dans des notices séparées ou dans la zone de liaison 770 (Liaison au supplément/numéro spécial).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note de supplément&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='526'>
+    <name>Note d'information sur le programme d'études</name>
+    <description>Cette zone contient une note précisant le nom du programme d'études qui utilise le titre décrit dans la notice. Elle renferme également des détails sur les éléments de données du programme d'études. En général, on utilise la zone 526 pour des études ou des programmes de lecture fondés sur des programmes d'études formels.</description>
+    <indicator position='1' value='0'>
+      <description>Programme de lecture</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom du programme&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Niveau d'intérêt&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Niveau de lecture&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Valeur numérique du titre</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Note non destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='530'>
+    <name>Note sur les autres formats physiques disponibles</name>
+    <description>Cette zone contient de l'information sur les autres formats physiques disponibles du document.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les autres formats physiques disponibles&#160; Pour les ressources continues la source d'acquisition, les modalités d'acquisition et le numéro de commande sont inclus dans la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Source d'acquisition&#160; La sous-zone $b contient la source de disponibilité qui est définie comme étant l'unité organisationnelle ou le distributeur-fournisseur auprès de qui on peut se procurer l'autre format physique du document.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Modalités d'acquisition&#160; La sous-zone $c comprend les modalités d'acquisition qui ont trait aux modalités selon lesquelles on peut se procurer l'autre format physique (p.&#160;ex., Des photocopies sont disponibles moyennant un coût.).</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Numéro de commande&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160; La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet. On peut répéter la zone si plus d'un URI doit enregistrer.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='533'>
+    <name>Note de reproduction&#160;</name>
+    <description>Cette zone contient de l'information qui décrit un document qui est une reproduction du document original.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Genre de reproduction&#160; La sous-zone $a comprend la locution d'introduction qui identifie le genre de reproduction faisant l'objet de la description. La locution d'introduction se termine par un point.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Lieu de reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Organisme responsable de la reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date de la reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Description matérielle de la reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Mention de collection de la reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Dates de publication et /ou indication séquentielle des livraisons reproduites</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note sur la reproduction&#160;</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Éléments de données de longueur fixe concernant la reproduction  La sous-zone $7 comprend quinze positions de caractères (désignées par 0, 1-4, etc.) qui renferment de l'information codée sur la reproduction. Les codes correspondent aux celui definé pour zone 008 (Éléments de Données de Longueur Fixe) positions de caractère /06-07 (Tous les documents), /18-19 (Ressources continues), et /23 (Livres). Sous-zone $7 est la derniere dans la zone. Toutes les positions de caractère doivent contenir un code défini ou un caractère de remplissage (|).  /0 - Type de date/statut de publication La position «&#160;0&#160;» de la sous-zone 7 ($7/0) contient un code alphabétique de un caractère qui indique, pour la reproduction, le type de dates précisées dans les positions 1-4 (Date 1) et 5-8 (Date 2). On peut utiliser tous les codes que l'on retrouve dans la description de la zone 008/06 (Type de date/statut de publication) sauf le code «&#160;r&#160;» (Date de réimpression et date originale). /1-4 - Date 1 Pour déterminer les dates qui seront enregistrées dans la sous-zone $7/1-4, il faudra se fonder sur le choix du code indiqué dans la sous-zone $7/0. /5-8 - Date 2 Pour déterminer les dates qui seront enregistrées dans la sous-zone $7/5-8, il faudra se fonder sur le choix du code indiqué dans la sous-zone $7/0. /9-11 - Lieu de publication, production ou d'exécution Les positions 9-11 de la sous-zone $7 ($7/9-11) renferment un code alphabétique de deux ou trois caractères qui indique le lieu de publication, de production ou d'exécution de la reproduction. Les codes à deux caractères sont justifiés à gauche, et les positions vides contiennent un blanc (#). La source du code est le document intitulé Codes de pays MARC . /12 - Périodicité La position 12 de la sous-zone $7 ($7/12) contient un code de un caractère qui indique la périodicité de la reproduction. On utilise cet élément de concert avec celui de la position 13 &#160;(Régularité).  n - Sans objet Voir aussi zone 008/18 &#160;(Périodicité) Ressources continues pour les autres codes valides.   /13 - Régularité La position 13 de la sous-zone $7 ($7/13) renferme un code de un caractère qui indique la régularité d'une reproduction d'une publication en série. On utilise cet élément de concert avec celui de la position 12 &#160; (Périodicité).  # - Sans objet Voir aussi zone 008/19 &#160; (Regularité) Ressources continues pour les autres codes valides.   /14 - Support matériel du document La position 14 de la sous-zone $7 ($7/14) contient un code de un caractère qui précise le support matériel de la reproduction en main. Voir zone 008/23 &#160; (Support matériel du document) Livres pour la liste des codes valides.</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='534'>
+    <name>Note de version originale</name>
+    <description>Cette zone contient l'information qui décrit la production originale d'un ouvrage. On décrit la reproduction dans la partie principale de la notice bibliographique. On donne des détails sur l'original dans la zone 534 lorsqu'ils diffèrent de l'information décrivant la reproduction.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Mention d'édition de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Publication, diffusion, etc. de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Description matérielle, etc. de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Mention de collection de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Titre-clé de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Localisation de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant l'original&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note sur l'original&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Locution d'introduction&#160; La sous-zone $p renferme une locution d'introduction à la note sur la version originale doit toujours être présente.</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Mention de titre de l'original&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Numéro international normalisé des publications en série&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé du livre&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='535'>
+    <name>Note sur la localisation des originaux/doubles&#160;</name>
+    <description>Cette zone enregistre le nom et l'adresse du dépôt d'archives qui est chargé de la conservation des originaux ou des doubles des documents décrits. On n'utilise cette zone que lorsque l'on conserve les originaux ou les doubles dans un dépôt différent de celui de l'ouvrage décrit.</description>
+    <indicator position='1' value='1'>
+      <description>Détenteur des originaux</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Détenteur des doubles</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Conservateur&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Adresse postale&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Pays&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Adresse par télécommunications&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Code de localisation du dépôt d'archives&#160; La sous-zone $g comprend un code MARC de deux ou trois caractères pour identifier le pays dans lequel se trouve le dépôt d'archives qui détient les originaux ou les doubles des documents décrits. La source du code de localisation des dépôts d'archives est le document intitulé:Codes de pays MARC</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='536'>
+    <name>Note sur le financement</name>
+    <description>Cette zone contient les numéros de contrat, de subvention et de projet lorsqu'une publication a été subventionnée.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Texte de la note&#160; La sous-zone $a contient tout renseignement sur les promoteurs ou les organismes de financement. La sous-zone $a n'est pas obligatoire.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Numéro de contrat&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Numéro de subvention&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Numéro non différencié&#160; La sous-zone $d comprend un numéro non différencié associé au matériel qui identifie un numéro de projet, de tâche ou d'unité de travail.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Numéro d'élément de programme&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Numéro de projet&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Numéro de tâche&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Numéro d'unité de travail&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='538'>
+    <name>Note sur les particularités du système</name>
+    <description>Cette zone renferme des données techniques sur le fichier d'ordinateur y compris la présence ou l'absence de certains types de codes ou les caractéristiques matérielles du fichier telles que la densité d'enregistrement, la parité, les facteurs de groupage ou le mode d'accès. Pour un logiciel, on peut entrer des données telles que le langage de programmation du logiciel, les modalités d'opération de l'ordinateur (p.&#160;ex., constructeur et modèle de l'ordinateur, système d'exploitation, capacité de la mémoire) et les conditions périphériques (p.&#160;ex., nombre de dispositifs d'entraînement de bandes magnétiques, nombre de disques ou d'unités à tambour, nombre de terminaux ou autres dispositifs périphériques, logiciel de soutien ou équipement associé). Pour les enregistrements sonores et vidéo, on peut inclure dans cette note de l'information sur le nom commercial ou sur le ou les systèmes d'enregistrement (p.&#160;ex., VHS), la modulation de fréquence et le nombre de lignes de résolution.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les particularités du système</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160;</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='540'>
+    <name>Note sur les modalités d'utilisation et de reproduction</name>
+    <description>Cette zone explique les modalités d'utilisation et/ou de reproduction une fois qu'on a autorisé l'accès aux documents. Dans cette zone, on peut entrer entre autres, les droits d'auteur, les droits cinématographiques, les restrictions au commerce, qui limitent le droit de reproduire, d'exposer, de fictionnaliser, de citer, etc.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Modalités d'utilisation et de reproduction  La sous-zone $a contient les modalités d'utilisation et de reproduction.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Juridiction  La sous-zone $b renferme la juridiction, c'est-à-dire le nom d'une personne, d'un établissement, ou d'un poste ou d'une fonction au sein d'un établissement, qui impose ou fait respecter les restrictions à la consultation et auprès de qui on peut interjeter appel.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Autorisation  La sous-zone $c identifie quelle autorité est à la source de la restriction&#160;: p.&#160;ex., un statut particulier, un contrat.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Usagers autorisés  La sous-zone $d désigne la catégorie d'usagers ou les personnes spécifiques (par leur nom ou leur titre) pour qui les restrictions énoncées dans la sous-zone $a ne s'appliquent pas.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='541'>
+    <name>Note sur la source immédate d'acquisition</name>
+    <description>Cette zone comprend des données sur la source immédate d'acquisition des documents décrits. Cette zone est utilisée principalement pour des documents originaux ou historiques, ou d'autres collections d'archives.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune information fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Privé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Non privé</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Source d'acquisition  La sous-zone $a contient le nom de la personne (ou des personnes) ou de l'organisation d'où provient le matériel.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Adresse&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Methode d'acquisition  La sous-zone $c renferme la méthode d'acquisition qui a trait aux modalités selon lesquelles le Transfer de garde physique se produit, par exemple par l'entremise d'un don, d'un legs, d'un prêt, d'un achat ou d'un dépôt.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date d'acquisition&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Numéro d'acquisition  La sous-zone $e comprend le numéro d'acquisition qui est défini comme étant le code d'identification attribué aux documents acquis dans un Transfer de garde unique ou séparé.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Propriétaire&#160; La sous-zone $f représente l'individu ou l'organisation qui est le gardien légal des documents décrits.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Prix d'achat&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Nombre d'unités matérielles  La sous-zone $n renferme le nombre d'unités matérielles, soit le nombre de documents acquis.</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Type d'unité&#160; La sous-zone $o comprend le type de l'unité, soit le nom de l'unité de mesure.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='544'>
+    <name>Note sur l'emplacement d'autres documents d'archives</name>
+    <description>Cette zone comprend le nom et l'adresse des conservateurs ou propriétaires de documents reliés aux documents décrits; il s'agit ici d'une relation de provenance, i.e. les documents en question faisaient auparavant partie de la même collection ou du même groupe de documents.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Documents associés La valeur «&#160;0&#160;» indique que les autres documents identifiés dans la note proviennent du même endroit, mais se trouvent dans un autre dépôt d'archivage.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Documents connexes La valeur «&#160;1&#160;» indique que les autres documents identifiés dans la note portent sur le même domaine d'activité, sont dans le même dépôt d'archivage mais proviennent d'endroits différents.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Conservateur&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Addresse&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Pays&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Titre&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Provenance des documents&#160; La sous-zone $e décrit l'historique de la conservation des documents connexes depuis leur création, y compris tous les changements que des conservateurs successifs ont pu leur apporter.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Texte de la note&#160; La sous-zone $n contient le texte entier de la note qui décrit les autres documents. On peut utiliser la sous-zone $n au lieu des sous-zones spécifiques pour entrer le titre des documents, le conservateur et la provenance.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='545'>
+    <name>Données biographiques ou historiques</name>
+    <description>Cette zone renferme des renseignements biographiques sur un individu ou des données historiques sur une institution ou un événement dont le nom sert de vedette principale pour le document décrit.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Énoncé biographique</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Historique administratif</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Données biographiques ou historiques  La sous-zone $a contient un bref énoncé fourissant de l'information biographique sur une personne ou de l'information historique ou administrative sur une organisation.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Extension  La sous-zone $b comprend une expansion des données biographiques ou historiques fournies dans la sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='546'>
+    <name>Note sur les langues</name>
+    <description>Cette zone renferme la note textuelle précisant la ou les langues des documents décrits. La zone sert aussi à décrire les alphabets, les écritures ou autres systèmes de symboles figurant dans le document. On retrouve de l'information codée sur la ou les langues dans 008/35-37 (Langue) et dans la zone 041 (Code de langue).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les langues</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Code d'information ou alphabet  La sous-zone $b renferme le nom de l'alphabet, de l'écriture ou du code d'information utilisé pour inscrire la langue. Il inclut aussi les écritures spécialisées, les caractères ou les codes: p.&#160;ex., alphabet arabe, chiffres arabes, ASCII, code à bâtonnets, BCD, braille, clef tétégraphique, alphabet cyrillique, EBCDIC, alphabet fraktur, alphabet grec, alphabet hébreu, hiéroglyphes, systèmes de notations musicales, pictogrammes, caractères et chiffres romains ou signes logarithmiques ou semilogarithmiques, etc.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='547'>
+    <name>Note explicative du titre antérieur</name>
+    <description>Cette zone contient une note qui exprime une liaison complexe entre des titres propres lorsqu'une note intelligible ne peut être générée par le système à partir des données dans la zone 247 (Ancien titre).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note explicative du titre antérieur</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='550'>
+    <name>Note sur les organismes de publication</name>
+    <description>Cette zone renferme une note faisant allusion aux organismes de publication actuels et antérieurs, y compris les notes contenant de l'information sur l'édition, la compilation ou sur la traduction qui touche un organisme de publication.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les organismes de publication</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='552'>
+    <name>Note d'information sur l'entité et l'attribut</name>
+    <description>Cette zone contient une description du contenu de l'ensemble de données, notamment les types d'entité, leurs attributs et les domaines dans lesquels les valeurs d'attribut peuvent être assignées.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Étiquette du type d'entité</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Définition et source du type d'entité</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Étiquette de l'attribut</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Définition et source de l'attribut</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Valeur du domaine énuméré</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Définition et source de la valeur du domaine énuméré</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Amplitude minimum et maximum du domaine</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Nom et source de l'ensemble de codes</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Domaine non représentable</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Unités de mesure et de résolution de l'attribut</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Dates de début et de fin d'application des valeurs d'attribut</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Exactitude de la valeur d'attribut</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Explication de l'exactitude de la valeur de l'attribut</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Fréquence de la mesure de l'attribut</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Aperçu général de l'entité et de l'attribut</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Citation des détails de l'entité et de l'attribut</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Affichage de note  La sous-zone $z contient une note qui présente les données dans la zone, s'il y a lieu.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='555'>
+    <name>Note d'index cumulatif/instruments de recherche</name>
+    <description>Cette zone souligne la disponibilité d'index cumulatifs et/ou d'instruments de recherche se rapportant au document décrit. Pour les documents d'archives et les documents visuels, cette zone renferme l'information identifiant les contrôles administratif et intellectuel sur les documents décrits et indiquant le degré de contrôle de chacun.</description>
+    <indicator position='1' value='#'>
+      <description>Index La valeur «&#160;#&#160;» est utilisée pour générer la constante d'affichage Index:.</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Instruments de recherche La valeur «&#160;0&#160;» est habituellement utilisée pour générer la constante d'affichage Instruments de recherche:.</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note d'index cumulatif/instruments de recherche</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Source d'acquisition  La sous-zone $b contient la source de disponibilité qui fait allusion à l'unité organisationnelle, ou au distributeur-fournisseur, auprès de laquelle on peut se procurer des instruments de recherche ou d'autre documentation.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Niveau de contrôle  La sous-zone $c spécifie le degré de contrôle administratif, bibliographique ou physique exercé sur les documents décrits.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Renvoi bibliographique  La sous-zone $d contient la citation d'un index ou instrument de recherche publié ou non se rapportant aux documents décrits lorsqu'il n'est pas catalogué avec l'item.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='556'>
+    <name>Note des données concernant la documentation</name>
+    <description>Cette zone contient de l'information sur la documentation relative aux documents décrits telle que des listes de codage qui expliquent le contenu et l'utilité du dossier ou d'un manuel de l'usager par rapport à une publication en série.</description>
+    <indicator position='1' value='#'>
+      <description>Documentation La valeur «&#160;#&#160;» est utilisée pour générer la constante d'affichage Documentation:.</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note des données concernant la documentation</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='561'>
+    <name>Propriété et historique de la conservation</name>
+    <description>Cette zone réservée pour une copie spécifique relate l'historique des documents depuis leur création jusqu'à leur acquisition, y compris la période où les divers documents ou groupes de documents ont été rassemblés en un tout et classés dans leur état.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune information fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Privé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Non privé</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Historique</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='562'>
+    <name>Note d'identification des copies et versions</name>
+    <description>Cette zone note les différences entre les copies ou les versions des documents conservés dans un service ou un dépôt d'archives lorsqu'il existe ou pourrait exister plus d'une copie ou version.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Marques d'identification  La sous-zone $a indique les marques présentes sur le support ou encastrées dans le matériel qui peuvent servir à identifier une copie en particulier: p.&#160;ex., filigranes, annotations, en-têtes.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Identification de la copie  La sous-zone $b spécifie le nom, le code, le numéro ou la description permettant de distinguer une copie parmi les autres.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Identification de la version  La sous-zone $c spécifie le nom, le code ou la description d'une version des documents décrits; il s'agit d'une version qui diffère des autres par le contenu, mais qui leur est reliée chronologiquement (p.&#160;ex., une édition).</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Format de présentation  La sous-zone $d contient la présentation matérielle des documents enregistrés, sans égard à leur support actuel, dans laquelle ils étaient destinés à être utilisés, vus ou entendus (p.&#160;ex., un film fait pour la télévision ou un texte destiné à être proclamé oralement).</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Nombre de copies</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution to which field applies  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='563'>
+    <name>Renseignements au sujet de la reliure</name>
+    <description>Cette zone contient des renseignements au sujet de la reliure, en ce qui concerne les articles anciens, les livres rares et les autres collections spéciales. Cela ne s'applique pas aux publications en série reliées sous une couverture aux fins de rayonnage et d'entreposage.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note au sujet de la reliure</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme des liens à une illustration de la reliure. Cette zone contient l'Uniform Resource Identifier (URI), par exemple un URL ou URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à une ressource électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='565'>
+    <name>Note sur les caractéristiques du dossier de documentation</name>
+    <description>Cette zone décrit le contenu et les caractéristiques des dossiers de documentation. Pour les fichiers d'ordinateur, cette zone contient le nombre de dossiers ou de variables composant un fichier.</description>
+    <indicator position='1' value='#'>
+      <description>Volume du fichier</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Caractéristiques du dossier de documentation</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nombre de dossiers/variables  La sous-zone $a désigne le nombre de dossiers ou le nombre de variables dans un dossier unique à l'intérieur d'une série répétitive de dossiers de documentation.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Nom de la variable</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Unité d'analyse  La sous-zone $c indique le sujet auquel se rapportent les variables dans un dossier de documentation ou une base de données: p.&#160;ex., les prisonniers dans les dossiers correctionnels, les employés dans les dossiers du personnel, les blessés dans les dossiers d'admission des salles d'urgence.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Univers des données  La sous-zone $d documente la portée du travail de collecte des données et les spécifications de l'échantillon représenté dans les documents décrits.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Système ou code de classement  La sous-zone $e place les documents décrits dans le contexte d'un système de classement rationnel.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='567'>
+    <name>Note sur la méthodologie</name>
+    <description>Cette zone indique les caractéristiques méthodologiques importantes du document telles que l'algorithme, la description des ensembles, les procédures d'échantillonnage, la classification ou les critères de validation.</description>
+    <indicator position='1' value='#'>
+      <description>Méthodologie</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur la méthodologie</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='580'>
+    <name>Note de liaison complexe des vedettes</name>
+    <description>Cette zone comprend une note qui décrit une relation complexe entre le document décrit dans la notice et les autres documents qui ne peuvent être générés adéquatement par les zones de liaisons des vedettes (760-787).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note de liaison complexe des vedettes  Le code de sous-zone $a comprend l'entrée au catalogue du titre connexe et l'énoncé décrivant la relation.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='581'>
+    <name>Note de publications sur les documents décrits</name>
+    <description>Cette zone contient une note donnant la citation ou l'information sur une publication selon l'utilisation, l'étude ou l'analyse des documents décrits dans la notice.</description>
+    <indicator position='1' value='#'>
+      <description>Publications</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>La sous-zone $a renferme la citation ou l'information sur une publication qui constitue une étude ou une analyse des documents décrits.</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='583'>
+    <name>Note sur les mesures prises</name>
+    <description>Cette zone renferme de l'information concernant les mesures de traitement et de référence, telles qu'une brève mention des mesures passives ou actives prises dans le but d'acquérir le document en question et la date de la dernière mention de correspondance. Cette zone décrit aussi les mesures de conservation reliées à un document telles que l'évaluation de l'état du document, l'ajout à la file d'attente et l'achèvement du processus de conservation. Si on utilise la zone pour entrer des activités de conservation, il existe une liste, Terminologie normalisée utilisée dans la zone 583 du MARC&#160;21 "Note sur les mesures prises" disponible en ligne à&#160;: www.collectionscanada.gc.ca/marc/040010-236-f.html.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune information fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Privé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Non privé</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Mesures prises</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Identification des mesures  La sous-zone $b contient un code ou une désignation identifiant une mesure particulière ou l'identifiant en relation avec la date des mesures prises: p.&#160;ex., un numéro d'acquisition ou un code de projet.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Heure/Date où les mesures ont été prises  La sous-zone $c contient la période ou la date exacte à laquelle la mesure a été prise. Il peut s'agir d'une date ou d'une période passée ou future.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Période où les mesures ont été prises  La sous-zone $d renferme une mention définissant la période de temps qui ne peut être exprimée par une date précise: p.&#160;ex., à la fin de la session universitaire ou aux six mois.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Circonstances de la prise des mesures  La sous-zone $e indique le moment ou la période sous forme de circonstance imprévue: p.&#160;ex., à la fin du procès, après le décès de sa fille, à la réception des documents.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Autorisation  La sous-zone $f contient un texte ou une citation référant à un statut, un ordre d'exécution, un rapport, une analyse raisonnée, ou un règlement régissant une mesure particulière.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='false'>
+      <description>Juridiction  La sous-zone $h indique le nom de l'entité responsable de la mesure prise, qu'il s'agisse d'une personne, d'un établissement, d'un poste ou d'une fonction à l'intérieur de l'établissement.</description>
+    </subfield>
+
+    <subfield code='i' repeatable='false'>
+      <description>Méthode suivie dans la prise des mesures  La sous-zone $i dénote l'approche suivie dans la prise des mesures: p.&#160;ex., par la poste, en personne, services de référence par téléphone, ou jeté, incinéré, déchiqueté pour fin de destruction.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Lieu de la prise des mesures  La sous-zone $j précise l'endroit où on a pris les mesures concernant les documents décrits, y compris l'emplacement où les chercheurs consultent ces documents.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Responsable de la prise des mesures  La sous-zone $k désigne la personne ou l'organisme qui exécute les mesures prises.</description>
+    </subfield>
+
+    <subfield code='l' repeatable='false'>
+      <description>État des documents  La sous-zone $l définit l'état des documents décrits, lequel ne résulte pas nécessairement d'une mesure prise: p.&#160;ex., condition physique, valeur assurée, statut de la description.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Nombre d'unités physiques  La sous-zone $n contient le nombre d'unités physiques que l'on définit comme étant le nombre de documents sur lesquels la mesure s'applique.</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Type d'unité  La sous-zone $o renferme le type d'unité, soit le nom de l'unité de mesure.</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier  La sous-zone $u renferme l'Uniform Resource Identifier (URI), par exemple un URL ou un URN, qui fournit des données d'accès électroniques dans une syntaxe normalisée. On peut utiliser ces données pour l'accès automatisé à un document électronique à l'aide d'un des protocoles Internet.</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Note non destinée au public</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du terme  La sous-zone $2 comprend un code MARC qui identifie la source du terme utilisée pour entrer l'information sur la mesure. La source du code MARC est le document intitulé: Codes de relations, de sources et de conventions de description MARC</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='584'>
+    <name>Note sur l'accroissement et la fréquence d'utilisation</name>
+    <description>Cette zone contient les mesures et l'information sur les taux d'accroissement lorsque les notices décrites portent sur des acquisitions ouvertes continues. La zone peut également renfermer le taux de consultation de tous les documents décrits.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Accroissement  La sous-zone $a comprend le taux d'accroissement des documents décrits; il s'agit du volume par rapport à une période.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Fréquence d'utilisation  La sous-zone $b mesure l'activité de consultation des documents décrits, habituellement exprimée sous forme du rapport du nombre de repérages par période ou en termes généraux tels que «&#160;active&#160;» ou «&#160;inactive&#160;».</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='585'>
+    <name>Note sur les expositions</name>
+    <description>Cette zone réservée aux copies spécifiques note les expositions où les documents décrits ont été présentés.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les expositions</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle s'applique la zone  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='586'>
+    <name>Note sur les prix décernés</name>
+    <description>Cette zone indique les prix décernés au document décrit.</description>
+    <indicator position='1' value='#'>
+      <description>Prix décernés</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Aucune constante d'affichage n'est générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Note sur les prix décernés</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='59x'>
+    <name>59X - Notes locales</name>
+    <description>Dans les notices MARC, les zones 590-599 sont réservées à l'usage local et à la définition locale.</description>
+  </field>
+  <field repeatable='true' tag='600'>
+    <name>Vedette-matière - Nom de personne</name>
+    <description>Cette zone contient un nom de personne utilisé comme vedette-matière.</description>
+    <indicator position='1' value='0'>
+      <description>Prénom</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de famille</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Nom d'une famille</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. L'emploi de la valeur «&#160;1&#160;» implique que la zone est appropriée au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans les fichiers d'autorité de la NLM.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>La valeur «&#160;7&#160;» indique que la vedette-matière est formulée conformément à un ensemble de règles d'établissement de systèmes ou de thésaurus de vedettes-matières autre que celui précisé par l'une des autres valeurs définies et pour lequel on trouve des codes d'identification dans la sous-zone $2.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de personne&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numérotation&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Titres et autres qualificatifs associés au nom&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Dates associées au nom&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document&#160; Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Qualificatif d'attribution&#160; Renferme des renseignements relatifs au qualificatif d'attribution de noms dont la responsabilité est inconnue, incertaine, fictive ou pseudonyme&#160;(R).</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Forme complète du nom&#160;</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique&#160;</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $a, $b, $d, $e, $f, $g, $l, $n, $p, $q, $t, $u, et $4 de la zone 100.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='610'>
+    <name>Vedette-matière - Nom de collectivité</name>
+    <description>Cette zone comporte un nom de collectivité utilisé comme vedette-matière.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. L'emploi de la valeur «&#160;1&#160;» implique que la zone est appropriée au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans les fichiers d'autorité de la NLM.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Agricultural Library. L'emploi de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de collectivité ou nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Collectivité subordonnée&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de la réunion ou de la signature d'un traité&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document&#160; Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion&#160;</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique&#160;</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $e, $f, $l, $p, $t, $u et $4 de la zone 100 et des sous-zones $a, $b, $c, $d, $g, et $n de la zone 110.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='611'>
+    <name>Vedette-matière - Nom de réunion</name>
+    <description>Cette zone comporte un nom de réunion ou de conférence utilisé comme vedette-matière. Des vedettes-matières sont attribuées à une notice bibliographique selon des directives et des principes de catalogage établis afin d'en permettre l'accès par sujets.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. L'emploi de la valeur «&#160;1&#160;» implique que la zone est appropriée au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans les fichiers d'autorité de la NLM.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Agricultural Library. L'emploi de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de réunion ou nom de lieu comme élément de classement&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date de réunion&#160;</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Collectivité subordonnée&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document&#160; Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Nom de la réunion suivant le nom de lieu comme élément de classement&#160;</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $f, $g, $l, $p, $t, $u, et $4 de la zone 100 ; sous-zones $c et $n de la zone 110 et sous-zones $a, $e, et $q de la zone 111 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='630'>
+    <name>Vedette-matière - Titre uniforme</name>
+    <description>Cette zone comporte un titre uniforme utilisé comme vedette-matière. Des vedettes-matières sont attribuées à une notice bibliographique selon des directives et des principes de catalogage établis afin d'en permettre l'accès par sujets.</description>
+    <indicator position='1' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement La position du premier indicateur contient une valeur qui précise le nombre de positions associées à un article défini ou à un article indéfini apparaissant au début d'une zone de titre uniforme et qui sont ignorés lors du tri et du classement.</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. Pour utiliser la valeur «&#160;1&#160;», il faut que la zone convienne au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans les fichiers d'autorité de la NLM.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de vedettes-matières de la National Agricultural Library. L'utilisation de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au document «&#160;Canadian Subject Headings&#160;» qui est mis à jour par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document&#160;</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document&#160; Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document&#160;</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document&#160;</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique&#160;</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document&#160; La sous-zone $t contient le titre de la page de titre d'un document.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source des codes MARC se trouve dans le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $f, $g, $l, $n, et $p de la zone 100 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='648'>
+    <name>Vedette-matière - Terme chronologique</name>
+    <description>Cette zone comprend une terme chronologique utilisé comme vedette-matière.</description>
+    <indicator position='2' value='0'>
+      <description>Library of Congress Subject Headings La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH .</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. Pour utiliser la valeur «&#160;1&#160;», il faut que la zone convienne au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément au document Medical Subject Headings (MeSH) qui est mis à jour par la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans le MeSH.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de vedettes-matières de la National Agricultural Library. L'utilisation de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Terme chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='650'>
+    <name>Vedette-matière - Sujet</name>
+    <description>Cette zone comprend un sujet utilisé comme vedette-matière.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Sujet principal La valeur «&#160;1&#160;» indique que la vedette est un sujet principal. On considère qu'un sujet est principal s'il couvre le sujet mis en évidence dans le document décrit.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Sujet secondaire La valeur «&#160;2&#160;» indique que la vedette est un sujet secondaire. On considère qu'un sujet est secondaire s'il représente un aspect moins important du contenu du document décrit.</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que le terme d'indexation est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. Pour utiliser la valeur «&#160;1&#160;», il faut que la zone convienne au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément au document Medical Subject Headings (MeSH) qui est mis à jour par la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans le MeSH.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de vedettes-matières de la National Agricultural Library. L'utilisation de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette de sujet ou vedette comportant un nom géographique&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Vedette de sujet ou nom géographique comme élément de classement&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de l'événement&#160;</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Dates d'activité&#160; La sous-zone $d réfère à la période de temps durant laquelle un événement s'est produit.</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Relation&#160; La sous-zone $e contient un terme décrivant la relation entre la vedette de sujet et les documents décrits: p.&#160;ex., entité illustrée.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='651'>
+    <name>Vedette-matière - Nom géographique</name>
+    <description>Cette zone comprend un nom géographique utilisé comme vedette-matière.</description>
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que la vedette-matière a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour l'utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que la vedette-matière est formulée conformément à la section «&#160;AC Subject Headings&#160;» du document Library of Congress Subject Headings qui est mis à jour par la Library of Congress. Pour utiliser la valeur «&#160;1&#160;», il faut que la zone convienne au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour utilisation dans les fichiers d'autorité de la NLM.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que la vedette-matière est formulée conformément aux fichiers d'autorité de vedettes-matières de la National Agricultural Library. L'utilisation de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedettes-matières de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que la vedette-matière est formulée conformément au document Canadian Subject Headings qui est mis à jour par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que la vedette-matière est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom géographique&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='653'>
+    <name>Terme d'indexation - Vedette non contrôlée</name>
+    <description>Cette zone contient des termes d'indexation qui ne sont pas tirés d'un système ou d'un thésaurus de vedettes-matières contrôlé.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Terme principal La valeur «&#160;1&#160;» indique que le terme d'indexation est un terme principal. On considère qu'un terme d'indexation est principal s'il couvre le sujet mis en évidence dans le document décrit.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Terme secondaire La valeur «&#160;2&#160;» indique que le terme d'indexation est un terme secondaire. On considère qu'un terme d'indexation est secondaire s'il représente un aspect moins important du contenu du document décrit.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Terme non contrôlé&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='654'>
+    <name>Vedette-matière - Termes à facettes</name>
+    <description>Cette zone renferme une vedette de sujet élaborée à partir d'un vocabulaire à facettes.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Terme principal La valeur «&#160;1&#160;» indique que la vedette est une expression ou chaîne principale. On considère qu'une expression ou chaîne par matière est principale si elle couvre le sujet mis en évidence dans le document décrit.</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Terme secondaire La valeur «&#160;2&#160;» indique que la vedette est une expression ou chaîne secondaire. On considère qu'une expression ou chaîne par matière est secondaire si elle représente un aspect moins important du contenu du document décrit.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Terme dominant&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Terme non dominant&#160; La sous-zone $b comprend un terme autre que le terme dominant.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Indicateur de facette/hiérarchie&#160; La sous-zone $c spécifie l'indicateur identifiant la facette/hiérarchie de chaque terme présent dans les sous-zones $a et $b. Les désignations diffèrent selon le thésaurus de vedettes-matières utilisé (tel que précisé par le code inscrit dans la sous-zone $2). On trouve dans le thésaurus spécifié à la sous-zone $2 les facettes/hiérarchies, de même que les indicateurs qui les représentent.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la vedette ou du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='655'>
+    <name>Terme d'indexation - Genre/forme</name>
+    <description>Cette zone contient des termes précisant le genre, la forme et/ou les caractéristiques matérielles des documents décrits. On utilise les termes de genre avec des documents qui se distinguent particulièrement par le style ou la technique de leur contenu intellectuel: p.&#160;ex., biographies, catéchismes, essais, hymnes ou critiques. Quant aux termes de forme et de caractéristiques matérielles, ils sont attribués à des documents qui, historiquement ou par leur usage, se démarquent des autres particulièrement par leur aspect physique, le sujet de leur contenu intellectuel ou l'ordre de présentation des données: p.&#160;ex., journaux intimes, annuaires, revues, mémorandums, questionnaires, prospectus ou feuilles de présence. S'il s'agit de documents graphiques, les vedettes de genre dénotent les catégories de documents qui se distinguent en raison des points de vue, des caractéristiques de l'auteur, du statut de publication ou de la méthode de représentation.</description>
+    <indicator position='1' value='#'>
+      <description>Vedette de base</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Vedette à facettes</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Vedettes-matières de la Library of Congress La valeur «&#160;0&#160;» indique que le terme d'indexation a été formulée conformément au document Library of Congress Subject Headings (LCSH), mis à jour par la Library of Congress. L'emploi de la valeur «&#160;0&#160;» implique que la vedette est appropriée pour utilisation dans les LCSH.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Vedettes-matières de la LC pour la littérature de jeunesse La valeur «&#160;1&#160;» indique que le terme d'indexation est formulée conformément à la section «&#160;AC Subject Headings&#160;» de la Library of Congress Subject Headings qui est mise à jour par la Library of Congress. Pour utiliser la valeur «&#160;1&#160;», il faut que la zone convienne au LC Annotated Card Program.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Medical Subject Headings La valeur «&#160;2&#160;» indique que le terme d'indexation est formulée conformément au document Medical Subject Headings (MeSH) qui est mis à jour pour la National Library of Medicine. L'emploi de la valeur «&#160;2&#160;» implique que la zone est appropriée pour l'utilisation dans le MeSH.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Fichier d'autorité de vedettes-matières de la National Agricultural Library La valeur «&#160;3&#160;» indique que le terme d'indexation est formulée conformément aux fichiers d'autorité de vedettes-matières de la National Agricultural Library. L'utilisation de la valeur «&#160;3&#160;» implique que la zone est appropriée pour les fins de vedette de genre ou de forme de la National Agricultural Library.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Canadian Subject Headings La valeur «&#160;5&#160;» indique que le terme d'indexation est formulée conformément au répertoire Canadian Subject Headings, élaboré par Bibliothèque et Archives Canada.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Répertoire de vedettes-matière La valeur «&#160;6&#160;» indique que le terme d'indexation est formulée conformément au Répertoire de vedettes-matière qui est mis à jour par la Bibliothèque de l'Université Laval.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Données ou terme dominant sur le genre/la forme&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Terme non dominant&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Indicateur de facette/hiérarchie&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; See Control Subfields</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='656'>
+    <name>Terme d'indexation - Occupation</name>
+    <description>Cette zone renferme des termes d'indexation décrivant les occupations (y compris les passe-temps) représentées dans le contenu des documents décrits.</description>
+    <indicator position='2' value='7'>
+      <description>La position du second indicateur contient la valeur «&#160;7&#160;» qui indique que la source du terme d'indexation se trouve dans la sous-zone $2.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Occupation&#160;</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Forme&#160;</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du terme&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='657'>
+    <name>Terme d'indexation - Fonction</name>
+    <description>Cette zone contient des termes d'indexation qui décrivent l'activité ou la fonction qui a produit les documents décrits.</description>
+    <indicator position='2' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Fonction</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Subdivision de forme</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Subdivision générale</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Subdivision chronologique</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Subdivision géographique</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du terme  La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='658'>
+    <name>Terme d'indexation - Objectif du programme d'études</name>
+    <description>Cette zone renferme des termes d'indexation qui décrivent des objectifs de programmes d'études correspondant au contenu des documents décrits. La zone inclut des coefficients de corrélation spécifiant jusqu'à quel point les documents atteignent un objectif particulier de même que des codes assignés à des objectifs spécifiques et tirés de listes publiées. Les objectifs de programmes d'études, les codes de programmes d'études et les coefficients de corrélation proviennent de listes publiées normalisées identifiées dans la sous-zone $2 (Source du terme ou du code).</description>
+    <subfield code='a' repeatable='true'>
+      <description>Objectif principal du programme d'études&#160;</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Objectif secondaire du programme d'études&#160;</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Code du programme d'études&#160; La sous-zone $c contient un code représentant l'objectif du programme d'études inscrit dans la sous-zone $a et, s'il y a lieu, dans la sous-zone $b.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Coefficient de corrélation&#160; La sous-zone $d contient un énoncé qui identifie le degré de corrélation des documents décrits à l'objectif du programme d'études inscrit dans la zone.</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source du terme ou du code&#160; La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='662'>
+    <name></name>
+    <description></description>
+  </field>
+  <field repeatable='true' tag='69X'>
+    <name>Zones d'accès local aux sujets</name>
+    <description>Les zones 690-699 sont réservées aux vedettes-matières et aux définitions à usage local. Aux fins d'échange, la documentation de la structure des zones 69X et des conventions de saisie des données devrait être fournie aux partenaires échangistes par l'institution qui a initié l'échange.</description>
+  </field>
+  <field repeatable='true' tag='700'>
+    <name>Vedette secondaire - Nom de personne</name>
+    <description>Cette zone contient un nom de personne désigné comme vedette secondaire.</description>
+    <indicator position='1' value='0'>
+      <description>Prénom</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de famille</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Nom d'une famille</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Vedette analytique La valeur «&#160;2&#160;» indique que le document à cataloguer contient l'ouvrage représenté par la vedette secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de personne</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numérotation</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Titres et autres qualificatifs associés au nom</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Dates associées au nom</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Qualificatif d'attribution  Renferme des renseignements relatifs au qualificatif d'attribution de noms dont la responsabilité est inconnue, incertaine, fictive ou pseudonyme.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Forme complète du nom</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  Le sigle ISSN précédant le numéro international normalisé des ressources continues n'apparaît pas dans une notice MARC. Elle peuvent être générée par le système comme constant d'affichage.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $a, $b, $d, $e, $f, $g, $l, $n, $p, $q, $t, $u, et $4 de la zone 100 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='710'>
+    <name>Vedette secondaire - Nom de collectivité</name>
+    <description>Cette zone contient un nom de collectivité désigné comme vedette secondaire.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Vedette analytique La valeur «&#160;2&#160;» indique que le document à cataloguer contient l'ouvrage représenté par la vedette secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de collectivité ou nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Collectivité subordonnée</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de conférence</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de la réunion ou de la signature d'un traité</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  Le sigle ISSN précédant le numéro international normalisé des ressources continues n'apparaît pas dans une notice MARC. Elle peuvent être générée par le système comme constant d'affichage.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $e, $f, $l, $p, $t, $u, et $4 de la zone 100 et des sous-zones $a, $b, $c, $d, $g, et $n de la zone 110 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='711'>
+    <name>Vedette secondaire - Nom de réunion</name>
+    <description>Cette zone contient un nom de réunion ou conférence comme vedette secondaire.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Vedette analytique La valeur «&#160;2&#160;» indique que le document à cataloguer contient l'ouvrage représenté par la vedette secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de réunion ou nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date de réunion</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Collectivité subordonnée</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Nom de la réunion suivant le nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  Le sigle ISSN précédant le numéro international normalisé des ressources continues n'apparaît pas dans une notice MARC. Elle peuvent être générée par le système comme constant d'affichage.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $g, $l, $p, $t, $u et $4 de la zone 100 ; sous-zones $c et $n de la zone 110 et sous-zones $a, $e, et $q de la zone 111 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='720'>
+    <name>Vedette secondaire - Nom entré sans vérification</name>
+    <description>Cette zone contient un nom associé à un ouvrage lorsque le nom n'est pas contrôlé par un fichier ou une liste d'autorité. Elle est également utilisée pour les noms qui n'ont pas été formulés selon les règles de catalogage. Les noms inscrits dans la zone 720 peuvent être de n'importe quel type (p.&#160;ex.&#160;: personnel, collectivité, réunion).</description>
+    <indicator position='1' value='#'>
+      <description>Non précisé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de personne</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Autre</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Terme de relation La sous-zone $e contient une désignation de fonction qui décrit la liaison entre un nom et l'ouvrage, par exemple, éd., comp., ill., trad., collectionneur, coauteur.</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='730'>
+    <name>Vedette secondaire - Titre uniforme</name>
+    <description>Cette zone contient un titre uniforme désigné comme vedette secondaire.</description>
+    <indicator position='1' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune information fournie</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Vedette analytique Cette zone contient un titre uniforme désigné comme vedette secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  Le sigle ISSN précédant le numéro international normalisé des ressources continues n'apparaît pas dans une notice MARC. Elle peuvent être générée par le système comme constant d'affichage.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $f, $g, $l, $n, et $p de la zone 100 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='740'>
+    <name>Vedette secondaire - Titre analytique, associé ou non contrôlé</name>
+    <description>Le contenu de cette zone se limite aux vedettes secondaires de titres associés et de titres analytiques non contrôlés. On entre à la zone 730 (Vedette secondaire-Titre uniforme) les vedettes secondaires de titres uniformes pour les documents connexes et les titres analytiques.</description>
+    <indicator position='1' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Vedette analytique La valeur «&#160;2&#160;» indique que le document à cataloguer contient l'ouvrage représenté par la vedette secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre analytique, associé ou non contrôlé</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  Un designateur de l'indication générale du genre de document.</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document  La sous-zone $n renferme la désignation sous forme de numéro de la partie ou de la section d'un titre.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document  La sous-zone $p renferme la désignation sous forme de nom de la partie ou de la section d'un titre de collection.</description>
+    </subfield>
+
+    <subfield code='5' repeatable='true'>
+      <description>Institution à laquelle la zone s'applique  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='752'>
+    <name>Vedette secondaire - Nom hiérarchique de lieu</name>
+    <description>Cette zone contient une forme hiérarchique d'un nom géographique. Ce type de vedette secondaire est attribué selon les diverses règles de catalogage; l'objectif visé est de fournir un accès à une notice bibliographique via une forme hiérarchique d'un nom de lieu, associé à un attribut particulier (p.&#160;ex.&#160;: pour les journaux, le nom de la localité desservie; pour des livres rares, le lieu d'édition ou d'impression). Le tiret (-) précédant une sous-element dans une nom de lieu ne parît pas dans une notice MARC. Le système peut le générer comme constant d'affichage pour séparer les sous-elements du nom de lieu, par. ex. Canada-British Columbia-Vancouver.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Pays</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>&#160;(NR)</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description></description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Ville</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='753'>
+    <name>Particularités du système pour l'accès aux fichiers d'ordinateur</name>
+    <description>Cette zone décrit le genre de machine, le système d'exploitation et/ou le langage de programmation utilisés avec les fichiers d'ordinateur et le matériel d'accompagnement. On assigne ce type de vedette secondaire en conformité avec les diverses règles de catalogage; ceci ajoute des moyens d'accès supplémentaires à la notice bibliographique et facilite la sélection et le classement des notices en vue de la production d'index imprimés.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Marque et modèle de la machine</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Langage de programmation</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Système d'exploitation</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='754'>
+    <name>Vedette secondaire - Identité taxinomique</name>
+    <description>Cette zone renferme l'information relative à l'identification taxinomique associée à l'ouvrage décrit dans la notice bibliographique.</description>
+    <subfield code='a' repeatable='false'>
+      <description>Nom taxinomique</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Catégorie taxinomique</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Nom courant ou alternatif</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Note non destinée au public</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de l'identité  La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='760'>
+    <name>Liaison à la collection principale</name>
+    <description>Cette zone contient l'information relative à une collection principale associée lorsque le document cible est une sous-collection (relation verticale). Lorsqu'une note est générée à portir de cette zone, elle pourrait-être générée avec une phrase d'introduction Collection principale ou Sous-collection de.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Collection principale</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale  La sous-zone $a contient les données de la vedette principale (sauf les désignateurs de contenu) de la zone 100 (Vedette principale-Nom de personne), 110 (Vedette principale-Nom de collectivité) ou 111 (Vedette principale-Nom de réunion) dans la notice lié. Les composantes individuelles du nom ou du titre uniforme ne sont pas inscrites dans une sous-zone séparée comme elles le seraient dans la zone 1XX.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition  La sous-zone $b contient le nom de l'édition dans la zone 250 (Mention d'édition) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels  La sous-zone $c contient les données nécessaires pour faire la distinction entre deux titres. Cette information figure habituellement entre parenthèses et elle est fournie par la personne qui effectue le catalogage. Pour les notices pré-RCAA 2 des publications en série, la sous-zone $c contient l'information provenant habituellement de la sous-zone $b (Éléments additionnels) de la zone 222 (Titre-clé).</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication  La sous-zone $d contient l'information d'édition des sous-zones $a, $b et/ou $c de la zone 260 (Publication, diffusion, etc. (Adresse bibliographique) de la noticelié.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation  La sous-zone $g contient les données indiquant la ou les pièces spécifiques du document associé impliqué dans la liaison avec le document cible, tels les dates et les volumes. L'information relative à la liaison inclut l'emplacement d'une partie composante dans un document cible.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme  La sous-zone $s contient le titre de la zone 240 (Titre uniforme) ou de la zone 243 (Titre uniforme (collectif)) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre  La sous-zone $t contient l'information sur le titre des sous-zones $a, $f, $g, $k, $n et $p de la zone 130 (Vedette principale-Titre uniforme) si présente et de la zone 245 (Mention de titre) de la notice lié. Les composantes individuelles du titre ne sont pas encodées séparément dans la sous-zone. (Avant 1981, la sous-zone $t était parfois dérivée de la sous-zone $a de la zone 222 (Titre-clé) lorsque le titre-clé était présent dans la notice.)</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice  La sous-zone $w contient le numéro de contrôle du système pour la notice lié, précédé par le code MARC, entre parenthèses, pour l'organisme auquel le numéro de contrôle s'applique. Voir Sources des codes des organismes pour une liste des sources relatives aux codes des organismes utilisés dans les notices MARC&#160;21.</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série  La sous-zone $x contient le Numéro international normalisé des publications en série (ISSN) pour un titre d'une publication en série dans la zone 022 (Numéro international normalisé de publication en série) de la notice lié. Nota&#160;: Le sigle ISSN précédant le numéro ne figure pas dans la notice MARC. Il peut être produit par le système en tant que constante d'affichage associée avec la présence de la sous-zone $x.</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN  La sous-zone $y contient la désignation CODEN, une identification unique pour les publications en série scientifiques et techniques, provenant de la zone 030 (Désignation CODEN) de la notice lié. Nota&#160;: L'acronyme CODEN précédant le numéro ne figure pas dans la notice MARC. Il peut être produit par le système en tant que constante d'affichage associée avec la présence de la sous-zone $y.</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle   La sous-zone $7 contient un maximum de quatre caractères (identifié «&#160;0&#160;», «&#160;1&#160;», etc.) qui indiquent les caractéristiques spéciales de la vedette de liaison. Les définitions de codes de la sous-zone $7 sont dépendantes de la position du caractère qu'elle occupe; donc, l'encodage de l'une ou l'autre position de caractère exige que chaque position de caractère précédente contient un code ou un caractère de remplissage (|). Les positions de caractère qui suivent peuvent être utilisées ou omises.</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='762'>
+    <name>Liaison à la sous-collection</name>
+    <description>Cette zone contient l'information relative à une sous-collection associée lorsque le document cible est une collection principale ou une sous-collection-mère (relation verticale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Sous-collection:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Sous-collection</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='765'>
+    <name>Liaison au document de langue originale</name>
+    <description>Cette zone contient l'information relative à la publication dans sa langue d'origine lorsque le document cible est une traduction (relation horizontale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Traduction de:</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Traduction de</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport  La sous-zone $r contient le numéro de rapport dans la zone 088 (Numéro de rapport) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique  La sous-zone $u contient le Numéro normalisé de rapport technique de la zone 027 (Numéro normalisé de rapport technique) de la notice lié. Nota&#160;: Le sigle STRN&#160;: précédant le numéro ne figure pas dans la notice MARC. Il peut être produit par le système en tant que constante d'affichage associée avec la présence de la sous-zone $u.</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>International Standard Book Number</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='767'>
+    <name>Liaison au document traduit</name>
+    <description>Cette zone contient l'information relative à la publication dans une langue autre que la langue d'origine lorsque le document cible est l'original ou une autre traduction (relation horizontale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Traduit sous le titre:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Traduit sous le titre</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport  The report number from field 088 (Report Number) of related record.</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique  La sous-zone $u contient le Numéro normalisé de rapport technique de la zone 027 (Numéro normalisé de rapport technique) de la notice lié. Il peut être produit par le système en tant que constante d'affichage associée avec la présence de la sous-zone $u.</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='770'>
+    <name>Liaison au supplément/numéro spécial</name>
+    <description>Cette zone contient l'information relative aux suppléments ou aux numéros spéciaux associé au document cible mais catalogués et/ou saisis comme notices séparées (relation verticale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Supplément:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Supplément</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection� La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='772'>
+    <name>Liaison à la notice-mère/supplément</name>
+    <description>Cette zone contient l'information relative à la notice-mère associé lorsque le document cible est un numéro unique, un supplément ou un numéro spécial (relation verticale) du document-mère. Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Supplément à:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Supplement to</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Parent</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='773'>
+    <name>Liaison au document hôte</name>
+    <description>Cette zone contient de l'information relative au document hôte pour l'unité constituante décrite dans la notice (relation verticale). Dans le cas de documents hôtes qui sont des publications en série ou des ouvrages en volumes multiples, l'information de la sous-zone $g ou la sous-zone $q sur l'emplacement exact de la partie composante dans le document bibliographique est nécessaire.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>In</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Titre abrégé  La sous-zone $p contient le titre abrégé de la zone 210 (Titre abrégé) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Énumération et première page</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport�</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='774'>
+    <name>Liaison à l'unité constituante</name>
+    <description>Cette zone contient l'information relative à une unité constituante associé à une plus grande unité bibliographique. Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Unité constituante:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Unité constituante</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='775'>
+    <name>Liaison à une autre édition</name>
+    <description>Cette zone contient des données de liaison à d'autres éditions disponibles de l'ouvrage en main (relation horizontale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Autre édition disponible:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Autre édition disponible</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='e' repeatable='true'>
+      <description>Code de langue  La sous-zone $e contient le code de langue dans la zone 008/35-37 (Langue) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Code de pays  La sous-zone $f contient le code de pays dans la zone 008/15-17 (Lieu de publication, production ou d'exécution) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle  La sous-zone $h contient la description matérielle du document associé.</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Form of name /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='776'>
+    <name>Liaison au document d'une autre forme physique</name>
+    <description>Cette zone contient l'information relative aux autres formes physiques du document cible (relation horizontale). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Disponible sous une autre forme: ou Publié dans une autre forme:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Disponible sous une autre forme</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $z contient le Numéro international normalisé des livres (ISBN) dans la zone 020 (Numéro international normalisé des livres) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='777'>
+    <name>Liaison au document «&#160;Publié avec&#160;»</name>
+    <description>Cette zone contient l'information relative aux publications cataloguées séparément mais qui paraissent avec ou sont incluses dans le document cible (relation horizontale). Lorsqu'une note est produite à partir de cette zone, elle pourrait-être générée avec une phrase d'introduction Avec:.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Avec</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='780'>
+    <name>Liaison au document prédécesseur</name>
+    <description>Cette zone contient l'information relative au document prédécesseur immédiat du document cible (relation chronologique). Lorsqu'une note est générée à partir de cette zone, elle pourrait-être générée avec un terme ou expression d'introduction produite comme une constante d'affichage à partir de la valeur du second indicateur.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Fait suite à La valeur «&#160;0&#160;» indique que le document cible fait suite au document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Fait suite après scission à La valeur «&#160;1&#160;» indique que le document cible fait suite après scission au document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Remplace La valeur «&#160;2&#160;» indique que le document cible remplace le document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Remplace en partie La valeur «&#160;3&#160;» indique que le document cible remplace en partie le document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Fusion de ... et de ... La valeur «&#160;4&#160;» indique que le document cible est le résultat de l'union d'un ou de plusieurs titres.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>A absorbé La valeur «&#160;5&#160;» indique que le titre en question a absorbé le document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>A absorbé en partie La valeur «&#160;6&#160;» indique que le titre en question a absorbé en partie le document prédécesseur.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Scisson de La valeur «&#160;7&#160;» indique que le titre en question est le résultat de la scission du document prédécesseur.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='785'>
+    <name>Liaison au document successeur</name>
+    <description>Cette zone contient l'information relative au document successeur immédiat du document cible (relation chronologique). S'il y a plus d'un document successeur, la zone 785 est répétée. Lorsqu'une note est produite à partir de cette zone, elle est affichée et/ou imprimée avec une expression d'introduction produite comme une constante d'affichage à partir de la valeur du second indicateur.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Suivi de La valeur «&#160;0&#160;» indique que le document cible est suivi du document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Suivi en partie de La valeur «&#160;1&#160;» indique que le document cible est suivi en partie du document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Remplacé par La valeur «&#160;2&#160;» indique que le document cible est remplacé par le document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='3'>
+      <description>Remplacé en partie par La valeur «&#160;3&#160;» indique que le document cible est remplacé en partie par le document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='4'>
+      <description>Absorbé par La valeur «&#160;4&#160;» indique que le document cible a été absorbé par le document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='5'>
+      <description>Absorbé en partie par La valeur «&#160;5&#160;» indique que le document cible a été absorbé en partie par le document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='6'>
+      <description>Scindé en ... et ... La valeur «&#160;6&#160;» indique que le document cible s'est scindé en deux ou plusieurs documents successeurs.</description>
+    </indicator>
+
+    <indicator position='2' value='7'>
+      <description>Fusionné avec ... et devient ... La valeur «&#160;7&#160;» indique que le document cible a été fusionné avec un autre titre pour former le document successeur.</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Redevient La valeur «&#160;8&#160;» indique que le document cible est revenu à une forme antérieure, c'est-à-dire que la forme de la vedette du successeur est identique à la forme précédente du document.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='786'>
+    <name>Liaison à la source des données</name>
+    <description>Cette zone renferme de l'information sur une source de données lié au document décrit. Elle peut aussi référer à d'autres fichiers, à des documents imprimés ou à des procédures de collecte des données.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Source de données</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Période de durée du contenu  La sous-zone $j contient la date de début et, au besoin, la date ou les dates de fin du contenu du document associé. La date et l'heure sont inscrites selon Représentation de la date et de l'heure (ISO 8601).</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Titre abrégé  La sous-zone $p contient le titre abrégé de la zone 210 (Titre abrégé) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Apport de la source</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='787'>
+    <name>Liaison non spécifique au document</name>
+    <description>Cette zone contient l'information relative à un document associé lorsque la relation ne peut être accommodée par celles définies dans les zones 760-786.</description>
+    <indicator position='1' value='0'>
+      <description>Afficher une note</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Ne pas afficher une note La valeur «&#160;1&#160;» est utilisée lorsque la constante d'affichage associée avec la zone de liaison ne décrit pas adéquatement cette liaison. Dans ce cas, une note pour l'affichage est inscrite dans la zone 580.</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>document associé</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Vedette principale</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Édition</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Éléments additionnels</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Lieu, éditeur et date de publication</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Éléments de relation</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Description matérielle</description>
+    </subfield>
+
+    <subfield code='i' repeatable='true'>
+      <description>Texte d'affichage</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Données sur la collection  La sous-zone $k contient une vedette de collection du 4XX (Mention de collection) ou 8XX (Vedette secondaire de collection) de la notice lié.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='true'>
+      <description>Détails concernant la source</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Note</description>
+    </subfield>
+
+    <subfield code='o' repeatable='false'>
+      <description>Autre identification du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='false'>
+      <description>Numéro de rapport</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Numéro normalisé de rapport technique</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice</description>
+    </subfield>
+
+    <subfield code='x' repeatable='true'>
+      <description>Numéro international normalisé des publications en série</description>
+    </subfield>
+
+    <subfield code='y' repeatable='true'>
+      <description>Désignation CODEN</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Numéro international normalisé des livres</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>Sous-zone de contrôle  Se reporter à le description de la sous-zone $7 de la zone 760.  /0 - Type de la vedette principale /1 - Forme du nom /2 - Type de notice /3 - Niveau bibliographique</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='800'>
+    <name>Vedette secondaire de collection--Nom de personne</name>
+    <description>Cette zone contient une vedette secondaire de collection auteur/titre dont la partie auteur est un nom de personne.</description>
+    <indicator position='1' value='0'>
+      <description>Prénom</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de famille</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Nom d'une famille</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de personne</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Numérotation</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Titres et autres qualificatifs associés au nom</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Dates associées au nom</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document  A media qualifier.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='false'>
+      <description>Qualificatif d'attribution  La sous-zone $j renferme des renseignements relatifs au qualificatif d'attribution de noms dont la responsabilité est inconnue, incertaine, fictive ou pseudonyme.</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Forme complète du nom</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Désignation des volumes/désignation séquentielle</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $a, $b, $d, $e, $f, $g, $l, $n, $p, $t, $u, et $4 de la zone 100 .</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='810'>
+    <name>Vedette secondaire de collection--Nom de collectivité</name>
+    <description>Cette zone contient une vedette secondaire de collection auteur/titre dont la partie auteur est un nom de collectivité.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de collectivité ou de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Sous-vedette</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de conférence</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de la réunion ou de la signature d'un traité</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Relation</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Désignation des volumes/désignation séquentielle</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Relator code</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $e, $f, $l, $p, $t, $u, et $4 de la zone 100 et des sous-zones $a, $b, $c, $d, $g, et $n de la zone 110.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='811'>
+    <name>Vedette secondaire de collection--Nom de réunion</name>
+    <description>Cette zone contient une vedette secondaire de collection auteur/titre dont la partie auteur est un nom de conférence ou de réunion.</description>
+    <indicator position='1' value='0'>
+      <description>Nom inversé</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Nom de lieu</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Nom en ordre direct</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Nom de conférence ou nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='c' repeatable='true'>
+      <description>Lieu de réunion</description>
+    </subfield>
+
+    <subfield code='d' repeatable='true'>
+      <description>Date de réunion</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Collectivité subordonnée</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section/réunion</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Nom de la réunion suivant le nom de lieu comme élément de classement</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document</description>
+    </subfield>
+
+    <subfield code='u' repeatable='true'>
+      <description>Affiliation</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Désignation des volumes/désignation séquentielle</description>
+    </subfield>
+
+    <subfield code='4' repeatable='false'>
+      <description>Code de relation</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle Se reporter à les descriptions des sous-zones $f, $g, $l, $p, $t, $u, et $4 de la zone 100; sous-zones $c et $n de la zone 110 et sous-zones $a, $e, et $q de la zone 111.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='830'>
+    <name>Vedette secondaire de collection--Titre uniforme</name>
+    <description>Cette zone contient une vedette secondaire de collection dont la vedette est un titre uniforme.</description>
+    <indicator position='2' value='0-9'>
+      <description>Nombre de caractères à ignorer dans le classement</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Titre uniforme</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Date de signature du traité</description>
+    </subfield>
+
+    <subfield code='f' repeatable='true'>
+      <description>Date du document</description>
+    </subfield>
+
+    <subfield code='g' repeatable='true'>
+      <description>Renseignements divers</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Indication générale du genre de document</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Sous-vedette de forme</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Langue du document</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Médium d'exécution pour la musique</description>
+    </subfield>
+
+    <subfield code='n' repeatable='false'>
+      <description>Numéro de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Mention d'arrangement pour la musique</description>
+    </subfield>
+
+    <subfield code='p' repeatable='false'>
+      <description>Nom de la partie/section du document</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Tonalité de la musique</description>
+    </subfield>
+
+    <subfield code='s' repeatable='true'>
+      <description>Version</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Titre du document  La sous-zone $t contient un titre uniforme, un titre de la page titre d'un document ou un titre d'une publication en série utilisé dans une zone nom/titre..</description>
+    </subfield>
+
+    <subfield code='v' repeatable='true'>
+      <description>Désignation des volumes/désignation séquentielle</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle Se reporter à descriptions des sous-zones $f, $g, $l, $n, et $p de la zone 100.</description>
+    </subfield>
+
+  </field>
+  <field repeatable='false' tag='841'>
+    <name>Données des fonds en codes associées</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 841.]</description>
+  </field>
+  <field repeatable='false' tag='842'>
+    <name>Définition textuelle du genre de matériel</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 842.]</description>
+  </field>
+  <field repeatable='true' tag='843'>
+    <name>Note de reproduction</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 843.]</description>
+  </field>
+  <field repeatable='false' tag='844'>
+    <name>Nom de l'unité</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 844.]</description>
+  </field>
+  <field repeatable='true' tag='845'>
+    <name>Modalités d'utilisation et de reproduction</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 845.]</description>
+  </field>
+  <field repeatable='true' tag='850'>
+    <name>Institution possédant les fonds</name>
+    <description>Institution possédant les fonds</description>
+    <subfield code='a' repeatable='false'>
+      <description>Institution possédant les fonds  La sous-zone $a renferme le code MARC ou le nom de l'institution détenant le document. Voir Sources des codes des organismes pour les données bibliographiques des sources relatives aux codes des organismes utilisés dans les notices MARC&#160;21.</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='852'>
+    <name>Emplacement</name>
+    <description>Cette zone comporte l'information requise permettant de localiser un document. L'information peut tout simplement désigner un organisme dépositaire du document ou à qui il faut s'adresser pour obtenir le document, ou encore contenir l'information détaillée permettant de localiser le document dans une collection.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Classification de la Library of Congress</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Classification décimale Dewey</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Classification de la National Library of Medicine</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Classification du Superintendent of Documents</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>Numéro topographiquer</description>
+    </indicator>
+
+    <indicator position='1' value='5'>
+      <description>Titre La valeur «&#160;5&#160;» indique que le document est classé sur les rayons en ordre de titre. S'il y a lieu, ce titre sera contenu dans la sous-zone $l (Forme de rangement du titre).</description>
+    </indicator>
+
+    <indicator position='1' value='6'>
+      <description>Rangement séparé</description>
+    </indicator>
+
+    <indicator position='1' value='7'>
+      <description>Source indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <indicator position='1' value='8'>
+      <description>Autre</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Sans numérotation</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Numérotation primaire La valeur «&#160;1&#160;» indique que le document est classé selon sa numérotation primaire. Cette valeur sert également lorsque le document ne comporte qu'un seul système de rangement.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Numérotation alternative La valeur «&#160;2&#160;» indique que le document comporte deux systèmes de numérotation et qu'il est classé selon le système secondaire.</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Emplacement  La sous-zone $a identifie l'institution ou la personne dépositaire du document ou auprès de laquelle on peut se procurer le document. La zone contient un code MARC de l'institution dépositaire ou le nom de l'institution ou de la personne. Voir Sources des codes des organismes pour les données bibliographiques des sources relatives aux codes des organismes utilisés dans les notices MARC&#160;21.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Succursale ou collection  La sous-zone $b renferme le nom de la division organisationnelle de l'organisation (désignée dans la sous-zone $a) ou le nom de la collection de laquelle fait partie le document ou de laquelle le document est disponible.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Emplacement sur les rayons</description>
+    </subfield>
+
+    <subfield code='e' repeatable='false'>
+      <description>Adresse  La sous-zone $e contient l'information sur l'adresse, la ville, ou l'État ou province, le code postal, le pays en ce qui concerne le principal emplacement désigné dans la sous-zone $a (Emplacement). La sous-zone $e peut être répétée afin de séparer les parties d'une adresse.</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Qualificatif d'emplacement codé  La sous-zone $f contient un code à deux ou trois caractères qui identifient les numéros qui sont spécifiquement rangés dans un emplacement distinct du fonds principal du même document. La sous-zone $f suit immediatement la sous-zone $a, $b, ou la sous-zone $c qui est qualifiée.   Note to LAC coder: The format of this list differs from the LC coding. Please maintain the coding in this list to avoid using the unline code. Genre de qualificatif   l - Dernier   Le code «&#160;l&#160;» indique que le dernier tirage, y compris le plus récent, ou une partie de celui-ci est rangé dans un autre emplacement.   p - Précédent   Le code «&#160;p&#160;» indique que le tirage précédent, autre que le plus récent, ou une partie de celui-ci est rangé dans un autre emplacement.   Nombre d'entités   1-9 - Nombre d'entités   Un nombre composé d'un caractère (de 1 à 9) précise le nombre ou les parties d'entités rangées dans un autre emplacement. Lorsqu'il n'est pas nécessaire d'indiquer les entités précises, il est possible d'omettre le nombre d'entités. Lorsque le genre de qualificatif est exprimé par Dernier (code «&#160;l&#160;»), le nombre comprend l'édition courante ou la partie d'entité. Lorsque le genre de qualificatif décrit l'édition précédente (code «&#160;p&#160;»), le nombre ne comprend pas l'édition courante ou la partie d'entité.    Genre d'entité:   Fréquence  m - Mois(s) w - Semaine(s) y - Année(s)   Partie  e - Édition(s) i - Numéro(s) s - Supplément(s)</description>
+    </subfield>
+
+    <subfield code='g' repeatable='false'>
+      <description>Qualificatif d'emplacement non codé  La sous-zone $g contient un texte descriptif qui détermine les entités précises d'un document rangé dans un emplacement qui diffère de l'emplacement principal du fonds du même document lorsque le qualificatif d'emplacement ne peut s'exprimer sous une forme codée dans la sous-zone $f (Qualificatif d'emplacement codé). La sous-zone $f suit immediatement la sous-zone $a, $b, ou la sous-zone $c qui est qualifiée.</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Partie de classification</description>
+    </subfield>
+
+    <subfield code='i' repeatable='false'>
+      <description>Partie de document</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Numéro topographique</description>
+    </subfield>
+
+    <subfield code='k' repeatable='false'>
+      <description>Préfixe de la cote</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Forme de rangement du titre  La sous-zone $l contient un titre qui sert à classer un document. La position de premier indicateur contient la valeur 5 (Titre).</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Suffixe de la cote</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Code du pays  La sous-zone $n contient un code de pays MARC à deux ou trois caractères permettant de désigner l'identificateur principal d'emplacement dans la sous-zone $a (Emplacement). La source du code MARC se trouve dans le document intitulé Codes de pays MARC , mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Désignation du document  La sous-zone $p contient une identification d'un document singulier lorsque l'information sur le fonds ne renferme pas de zone 863-865 (Énumération et Chronologie) qui contient une sous-zone $p (Désignation du document). La désignation peut comporter un numéro d'identification tel un code à barre ou un numéro d'acquisition.</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Condition physique du document  La sous-zone $q contient une description de toute caractéristique physique inusitée de la condition physique du document lorsque l'information sur le fonds ne contient pas de zone 863-865 (Énumération et chronologie) qui contient une sous-zone $q (Condition physique du document). Lorsque des zones d'énumération et de chronologie sont présentes, la condition physique du document peut être enregistrée dans la sous-zone $q de la zone 863-865.</description>
+    </subfield>
+
+    <subfield code='s' repeatable='false'>
+      <description>Code pour les frais de droit d'auteur d'un article</description>
+    </subfield>
+
+    <subfield code='t' repeatable='true'>
+      <description>Numéro d'exemplaire  La sous-zone $t contient un numéro d'exemplaire ou un intervalle de numéros pour désigner des exemplaires qui comportent le même emplacement et la même cote lorsque l'information sur le fonds ne contient pas de zone 863-865 (Énumération et Chronologie) qui contient une sous-zone $t (Numéro d'exemplaire). Lorsque les zones d'énumération et de chronologie sont présentes, un numéro d'exemplaire est enregistré dans la sous-zone $t de la zone 863-865.</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Note non destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source de la classification ou du système de rangement  La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='true'>
+      <description>Numéro de séquence  Voir la description de cette sous-zone à la zone 852 du [On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de Format MARC&#160;21 pour les données sur les fonds</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='853'>
+    <name>Libellé et ordonnance-Unité bibliographique de base</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 853.]</description>
+  </field>
+  <field repeatable='true' tag='854'>
+    <name>Libellé et ordonnance-Matériel supplémentaire</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 854.]</description>
+  </field>
+  <field repeatable='true' tag='855'>
+    <name>Libellé et ordonnance-Index</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 855.]</description>
+  </field>
+  <field repeatable='true' tag='856'>
+    <name>Emplacement et accès électroniques</name>
+    <description>Cette zone contient les données nécessaires pour localiser une ressource électronique et y avoir accès. On peut utiliser cette zone dans une notice bibliographique pour une ressource lorsque cette dernière ou un de ses sous-ensembles est disponible par voie électronique. De plus, on peut s'en servir pour localiser et accéder à une version électronique d'une ressource non électronique décrite dans la notice bibliographique ou dans une ressource électronique connexe.</description>
+    <indicator position='1' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='1' value='0'>
+      <description>Courrier électronique La valeur «&#160;0&#160;» signale qu'on a accès à la ressource électronique par courrier électronique. Ce mode d'accès comprend l'abonnement à un journal électronique ou à un groupe de discussion par l'entremise de logiciels conçus aux fins d'utilisation d'un système de courrier électronique.</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>FTP</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Téléouverture de session (Telnet)</description>
+    </indicator>
+
+    <indicator position='1' value='3'>
+      <description>Composition d'un numéro La valeur «&#160;3&#160;» signale qu'on a accès à la ressource électronique grâce à une ligne téléphonique conventionnelle (composition d'un numéro).</description>
+    </indicator>
+
+    <indicator position='1' value='4'>
+      <description>HTTP La valeur «&#160;4&#160;» indique qu'on accède à la ressource électronique par le protocole http.</description>
+    </indicator>
+
+    <indicator position='1' value='7'>
+      <description>Méthode indiquée dans la sous-zone $2</description>
+    </indicator>
+
+    <indicator position='2' value='#'>
+      <description>Aucune indication fournie</description>
+    </indicator>
+
+    <indicator position='2' value='0'>
+      <description>Ressource La valeur «&#160;0&#160;» signale que l'emplacement électronique indiqué dans la zone 856 s'applique à la même ressource décrite dans la notice en tant qu'entité. Dans ce cas, le document représenté par la notice bibliographique est une ressource électronique. Si les données dans la zone 856 ont trait à une unité constituante de la ressource représentée par la notice, on utilise la sous-zone $3 pour préciser la partie ou les parties auxquelles la zone s'applique.</description>
+    </indicator>
+
+    <indicator position='2' value='1'>
+      <description>Version de la ressource La valeur «&#160;1&#160;» indique que l'emplacement dans la zone 856 s'applique à une version électronique de la ressource décrite dans la notice. Dans ce cas, le document représenté par la notice bibliographique n'est pas une ressource électronique, mais indique qu'une version électronique du document est disponible. Si les données dans la zone 856 portent sur une unité constituante de la ressource représentée par la notice, il faut utiliser la sous-zone $3 pour préciser la partie ou les parties auxquelles la zone s'applique.</description>
+    </indicator>
+
+    <indicator position='2' value='2'>
+      <description>Ressource associée La valeur «&#160;2&#160;» indique que l'emplacement dans la zone 856 s'applique à une ressource électronique qui est liée au document bibliographique décrit dans la notice. Dans ce cas, le document représenté dans la notice bibliographique ne constitue pas la ressource électronique en soi. On peut utiliser la sous-zone $3 pour préciser la relation entre le document électronique identifié dans la zone 856 et le document représenté dans la notice bibliographique en tant qu'entité.</description>
+    </indicator>
+
+    <indicator position='2' value='8'>
+      <description>Aucune constante d'affichage générée</description>
+    </indicator>
+
+    <subfield code='a' repeatable='false'>
+      <description>Nom d'hôte&#160; La sous-zone $a contient le nom de domaine complet (le nom d'hôte) de l'emplacement électronique. Elle contient une adresse réseau que l'on répète au besoin s'il y a plus d'une adresse pour le même hôte.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='false'>
+      <description>Numéro d'accès&#160; La sous-zone $b renferme le numéro d'accès associé à l'hôte. Elle peut contenir l'adresse numérique du protocole Internet (IP) si le document est une ressource Internet, ou un numéro de téléphone si l'accès par composition d'un numéro est possible par ligne téléphonique. Ces données peuvent changer souvent et peuvent être produites par le système au lieu d'être entreposées statiquement.</description>
+    </subfield>
+
+    <subfield code='c' repeatable='false'>
+      <description>Information sur la compression&#160; La sous-zone $c contient des données sur la compression d'un fichier.</description>
+    </subfield>
+
+    <subfield code='d' repeatable='false'>
+      <description>Parcours&#160;</description>
+    </subfield>
+
+    <subfield code='f' repeatable='false'>
+      <description>Nom électronique&#160;</description>
+    </subfield>
+
+    <subfield code='h' repeatable='true'>
+      <description>Responsable du traitement de la demande&#160; La sous-zone $h renferme le nom de l'utilisateur, ou du responsable du traitement de la demande; ces données précèdent habituellement le séparateur («&#160;@&#160;») dans l'adresse de l'hôte.</description>
+    </subfield>
+
+    <subfield code='i' repeatable='false'>
+      <description>Instruction&#160; La sous-zone $i contient une instruction ou une commande à l'ordinateur hôte pour le télétraitement de la demande.</description>
+    </subfield>
+
+    <subfield code='j' repeatable='true'>
+      <description>Bits par seconde&#160;</description>
+    </subfield>
+
+    <subfield code='k' repeatable='true'>
+      <description>Mot de passe&#160;</description>
+    </subfield>
+
+    <subfield code='l' repeatable='true'>
+      <description>Ouverture de la session&#160; La sous-zone $l renferme des caractères essentiels pour se brancher (c.-à-d., «&#160;ouvrir une session&#160;», «&#160;entrer dans le système utilisateur&#160;», etc.) à une ressource électronique ou à un site FTP. On utilise cette sous-zone pour entrer les chaînes pour ouvrir une session à usage général pour lesquelles un niveau de sécurité spécial n'est pas nécessaire.</description>
+    </subfield>
+
+    <subfield code='m' repeatable='false'>
+      <description>Agent de liaison pour l'accès à l'information&#160;</description>
+    </subfield>
+
+    <subfield code='n' repeatable='true'>
+      <description>Emplacement de l'ordinateur hôte&#160; La sous-zone $n contient le nom conventionnel de l'emplacement de l'hôte dans la sous-zone $a, y compris son emplacement physique (géographique).</description>
+    </subfield>
+
+    <subfield code='o' repeatable='true'>
+      <description>Système d'exploitation&#160;</description>
+    </subfield>
+
+    <subfield code='p' repeatable='true'>
+      <description>Port&#160; La sous-zone $p inclut la portion de l'adresse identifiant un procédé ou un service accompli par l'ordinateur hôte.</description>
+    </subfield>
+
+    <subfield code='q' repeatable='true'>
+      <description>Type de format électronique&#160; La sous-zone $q contient une identification du type de format électronique, qui constitue la représentation des données de la ressource, notamment du texte en HTML, en ASCII, un fichier Postscript, une application exécutable, ou une image JPEG. On peut trouver les types de formats électroniques dans des listes énumératives comme les Types d'applications Internet multimédias autorisés (types de protocoles MIME).</description>
+    </subfield>
+
+    <subfield code='r' repeatable='true'>
+      <description>Arrangement&#160;</description>
+    </subfield>
+
+    <subfield code='s' repeatable='false'>
+      <description>Taille du fichier&#160;</description>
+    </subfield>
+
+    <subfield code='t' repeatable='false'>
+      <description>Émulation du terminal&#160;</description>
+    </subfield>
+
+    <subfield code='u' repeatable='false'>
+      <description>Uniform Resource Identifier&#160; La sous-zone $u renferme l'identificateur de ressource uniformes (Uniform Resource Identifier, URI) qui fournit des données d'accès électroniques dans une syntaxe normalisée. La zone 856 est organisée de sorte à permettre la création d'une adresse du localisateur de ressources uniformes (Uniform Resource Locator, URL) à partir de la concaténation d'autres sous-zones distinctes de la zone 856. La sous-zone $u pourra uniquement se répéter si on a enregistré un URN et un URL ou lorsqu'on a enregistré plus d'un URN.</description>
+    </subfield>
+
+    <subfield code='v' repeatable='false'>
+      <description>Heures où la méthode d'accès est disponible&#160;</description>
+    </subfield>
+
+    <subfield code='w' repeatable='false'>
+      <description>Numéro de contrôle de la notice&#160;</description>
+    </subfield>
+
+    <subfield code='x' repeatable='false'>
+      <description>Note non destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='y' repeatable='false'>
+      <description>Texte du lien&#160;</description>
+    </subfield>
+
+    <subfield code='z' repeatable='false'>
+      <description>Note destinée au public&#160;</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Méthode d'accès&#160; La sous-zone $2 contient la méthode d'accès lorsque la position du premier indicateur renferme la valeur «&#160;7&#160;» (Méthode indiquée dans la sous-zone $2).</description>
+    </subfield>
+
+    <subfield code='3' repeatable='true'>
+      <description>Documents précisés&#160;</description>
+    </subfield>
+
+    <subfield code='6' repeatable='true'>
+      <description>Liaison&#160; Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='8' repeatable='false'>
+      <description>Numéro de liaison de zone et de séquence  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='863'>
+    <name>Énumération et chronologie-Unité bibliographique de base</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 863]</description>
+  </field>
+  <field repeatable='true' tag='864'>
+    <name>Énumération et chronologie-Matériel supplémentaire</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 864]</description>
+  </field>
+  <field repeatable='true' tag='865'>
+    <name>Énumération et chronologie-Index</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 865]</description>
+  </field>
+  <field repeatable='true' tag='866'>
+    <name>Texte des fonds-Unité bibliographique de base</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 866]</description>
+  </field>
+  <field repeatable='true' tag='867'>
+    <name>Texte des fonds-Matériel supplémentaire</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 867]</description>
+  </field>
+  <field repeatable='true' tag='868'>
+    <name>Texte des fonds-Index</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 868]</description>
+  </field>
+  <field repeatable='true' tag='876'>
+    <name>Information sur le document-Entité bibliographique de base</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 876]</description>
+  </field>
+  <field repeatable='true' tag='877'>
+    <name>Information sur le document-Matériel supplémentaire</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 877]</description>
+  </field>
+  <field repeatable='true' tag='878'>
+    <name>Information sur le document-Index</name>
+    <description>[On devrait consulter le Format MARC&#160;21 pour les données sur les fonds pour obtenir la description de zone 878]</description>
+  </field>
+  <field repeatable='true' tag='880'>
+    <name>Graphie alternative</name>
+    <description>Cette zone contient la représentation au contenu complètement désigné, dans un script différent ou dans une autre zone de la même notice. La zone 880 est liée à la zone ordinaire associée par la sous-zone $6 (Liaison). Une sous-zone $6 dans la zone associée lie également cette zone à la zone 880. S'il n'existe pas de zone associée dans la notice, on construit la zone 880 comme s'il y en avait une, et on utilise un numéro d'occurrence réservé, soit (00), pour indiquer une situation spéciale. Les données dans la zone 880 peuvent se trouver dans plusieurs scripts.</description>
+    <subfield code='6' repeatable='true'>
+      <description>Liaison  Voir Sous-zones de contrôle</description>
+    </subfield>
+
+    <subfield code='a' repeatable='true'>
+      <description>z Identique à la zone associée</description>
+    </subfield>
+
+    <subfield code='0' repeatable='true'>
+      <description>5 Identique à la zone associée</description>
+    </subfield>
+
+    <subfield code='7' repeatable='true'>
+      <description>9 Identique à la zone associée</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='886'>
+    <name>Zone de données du MARC étranger</name>
+    <description>Cette zone renferme des données provenant de notices MARC étranger pour lesquelles il n'existe pas de zones MARC&#160;21 correspondantes. On utilise cette zone lorsqu'on doit convertir des notices MARC étranger en format MARC&#160;21.</description>
+    <indicator position='1' value='0'>
+      <description>Guide</description>
+    </indicator>
+
+    <indicator position='1' value='1'>
+      <description>Zones de contrôle variables (002-009)</description>
+    </indicator>
+
+    <indicator position='1' value='2'>
+      <description>Zones de données variables (010-999)</description>
+    </indicator>
+
+    <subfield code='a' repeatable='true'>
+      <description>Étiquette de la zone du MARC étranger  La sous-zone $a doit être la deuxième sous-zone dans la zone, immédiatement avant la sous-zone $b. Si la valeur du premier indicateur est «&#160;0&#160;» (Guide), il n'y aura donc pas de sous-zone $a.</description>
+    </subfield>
+
+    <subfield code='b' repeatable='true'>
+      <description>Contenu de la zone du MARC étranger</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source des données  La sous-zone $2 contient le code MARC concernant le format utilisé comme source de la notice MARC, par exemple, le MARC chinois, le UK MARC, etc. La sous-zone $2 doit être la première sous-zone de la zone. La source du code MARC est le document intitulé Codes de relations, de sources et de conventions de description MARC, mis à jour par la Library of Congress.</description>
+    </subfield>
+
+    <subfield code='a' repeatable='false'>
+      <description>z - Sous-zone MARC étranger&#160;</description>
+    </subfield>
+
+    <subfield code='0' repeatable='false'>
+      <description>9 - Sous-zone MARC étranger&#160;</description>
+    </subfield>
+
+  </field>
+  <field repeatable='true' tag='887'>
+    <name>Zone de données incompatibles MARC</name>
+    <description>Cette zone contient des données provenant de notices incompatibles MARC, pour lesquelles il n'existe pas de zone correspondant MARC&#160;21. Cette zone est utilisée pour la conversion des notices incompatibles MARC au format MARC&#160;21.</description>
+    <subfield code='a' repeatable='true'>
+      <description>Contenu de la zone incompatible MARC</description>
+    </subfield>
+
+    <subfield code='2' repeatable='true'>
+      <description>Source des données  La sous-zone $2 contient la source des données, soit un schéma ou une référence DTD. Le code MARC provient des Codes de relations, de sources et de conventions de description MARC.</description>
+    </subfield>
+
+  </field>
+
+</fields>
index be78897..b41ebf7 100644 (file)
@@ -1,6 +1,9 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Main, Authentication Window -->
+<!--
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- PRESENTATION -->
@@ -19,7 +22,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
        <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
        <scripts id="openils_util_scripts"/>
 
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/lang.js"/>
-       <script type="text/javascript" src="/xul/server/main/lang.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script>
        <![CDATA[
-               dump("entities['lang.version'] = " + entities['lang.version'] + '\n');
 
                function data_init() {
 
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
                        if (typeof JSAN == 'undefined') {
-                               throw(
-                                       "The JSAN library object is missing."
-                               );
+                               throw(document.getElementById("commonStrings").getString('common.jsan.missing'));
                        }
                        /////////////////////////////////////////////////////////////////////////////
 
                        JSAN.use('OpenILS.data');
                        g.data = new OpenILS.data()
                        g.data.on_error = xulG.auth.logoff;
-                       g.data.entities = entities;
-                       g.data.stash('entities');
 
                        g.data.session = {};
                        g.data.session.key = xulG.auth.session.key;
                                        urls.XUL_OFFLINE_GENERATE_WIDGETS       
                                );
 
-                               document.getElementById('caption').setAttribute('label','Data loaded.');
+                               document.getElementById('caption').setAttribute('label', document.getElementById('commonStrings').getString('staff.main.data.loaded'));
 
                                xulG.window.open(urls.XUL_MENU_FRAME
                                        + '?server='+window.escape(xulG.url),
        ]]>
        </script>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties" />
+
        <groupbox id="data_groupbox" flex="1" class="my_overflow"> 
-               <caption id="caption" label="Loading data..."/> 
+               <caption id="caption" label="&staff.main.data.loading;"/> 
                <description id="data_progress"/>
                <iframe id="iframe" />
        </groupbox>
index 5649b02..7385822 100644 (file)
@@ -1,6 +1,9 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Main, Authentication Window -->
+<!--
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- PRESENTATION -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -28,8 +31,6 @@
        <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
        <scripts id="openils_util_scripts"/>
 
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/lang.js"/>
-       <script type="text/javascript" src="/xul/server/main/lang.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
        <script>
        <![CDATA[
@@ -38,9 +39,7 @@
             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
                        if (typeof JSAN == 'undefined') {
-                               throw(
-                                       "The JSAN library object is missing."
-                               );
+                               throw(document.getElementById('commonStrings').getString('common.jsan.missing'));
                        }
                        /////////////////////////////////////////////////////////////////////////////
 
@@ -89,7 +88,7 @@
 
                        save_object('print_list_templates',g.data.print_list_templates);
 
-                       $('placeholder').setAttribute('value','Offline interface synchronized with server.');
+                       $('placeholder').setAttribute('value', $('commonStrings').getString('staff.main.gen_offline_widgets.synced'));
 
                }
 
                                util.functional.map_list( 
                                        /*util.fm_utils.flatten_ou_branch(g.data.tree.aou)*/ g.data.list.aou,
                                        function(obj) { 
-                                               var sname = obj.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
+                                               var sname = obj.shortname();
+                                               for (i = sname.length; i < 20; i++) {
+                                                       sname += ' ';
+                                               }
                                                return [ 
                                                        obj.name() ? sname + ' ' + obj.name() : obj.shortname(),
                                                        obj.id(), 
                                                                        [ b.owning_lib(), b.name() ]
                                                                );
                                                        } catch(E) {
-                                                               alert('error in noncat sorting: ' + E);
+                                                               alert($('commonStrings').getString('staff.main.gen_offline_widgets.noncat_sort.error') + E);
                                                                return 0;
                                                        }
                                                }
index 037975b..c90dfda 100644 (file)
@@ -1,6 +1,9 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!-- Application: Evergreen Staff Client -->
 <!-- Screen: Main, Authentication Window -->
+<!--
+ vim:noet:sw=4:ts=4:
+-->
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- PRESENTATION -->
@@ -11,7 +14,7 @@
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
 <!-- LOCALIZATION -->
 <!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
 ]>
 
 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
@@ -28,8 +31,6 @@
        <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
        <scripts id="openils_util_scripts"/>
 
-       <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/lang.js"/>
-       <script type="text/javascript" src="/xul/server/main/lang.js"/>
        <script type="text/javascript" src="/opac/common/js/OrgTree.js"/>
        <script type="text/javascript" src="/opac/common/js/org_utils.js"/>
        <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
 
                        document.getElementById('register_btn').disabled = true;
                        document.getElementById('wsname').disabled = true;
-                       document.getElementById('wsname').value = 'Please Wait';
+                       document.getElementById('wsname').value = document.getElementById('commonStrings').getString('staff.main.gen_offline_widgets.please_wait');
 
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
                        if (typeof JSAN == 'undefined') {
-                               throw(
-                                       "The JSAN library object is missing."
-                               );
+                               throw(document.getElementById("commonStrings").getString('common.jsan.missing'));
                        }
                        /////////////////////////////////////////////////////////////////////////////
 
@@ -79,7 +78,7 @@
                                [ xulG.auth.session.key, g.user.id(), 'REGISTER_WORKSTATION']
                        );
                        if (highest_org_id == -1) {
-                               alert('You do not have permission to register a workstation.');
+                               alert(document.getElementById('commonStrings').getString('staff.main.gen_offline_widgets.workstation_registration_denied'));
                                xulG.auth.logoff();
                                return;
                        }
                                        [ xulG.auth.session.key, g.my_libs_shortname_hash[ g.ml.value ] + '-' + g.tb.value, g.ml.value ],
                                        null,
                                        {
-                                               'title' : 'Override Registration Failure?',
+                                               'title' : document.getElementById('commonStrings').getString('staff.main.gen_offline_widgets.registration.override'),
                                                'overridable_events' : [ 
                                                        1703 /* WORKSTATION_NAME_EXISTS */, 
                                                ],
                                );
 
                                if (typeof robj.ilsevent != 'undefined') {
-                                       switch(robj.ilsevent) {
+                                       switch(Number(robj.ilsevent)) {
                                                case -1 : g.error.standard_network_error_alert(); break;
                                                case 1703 /* WORKSTATION_NAME_EXISTS */ : /* handled with override request */ break;
-                                               default: g.error.standard_unexpected_error_alert('Workstation Registration',robj); break;
+                                               default: g.error.standard_unexpected_error_alert(document.getElementById('commonStrings').getFormattedString('staff.main.gen_offline_widgets.registration.error', ['1']), robj); break;
                                        }
                                } else {
                                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalPreferencesWrite UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
                                        };
                                        xulG.file.get('ws_info');
                                        xulG.file.set_object(g.data.ws_info);
-                                       alert('Registration successful');
+                                       alert(document.getElementById('commonStrings').getString('staff.main.gen_offline_widgets.registration.success'));
                                        xulG.auth.logoff();
                                }
                        } catch(E) {
-                               g.error.standard_unexpected_error_alert('Workstation Registration 2',E);
+                               g.error.standard_unexpected_error_alert(document.getElementById('commonStrings').getFormattedString('staff.main.gen_offline_widgets.registration.error', ['2']) ,E);
                        }
                }
 
 
        <vbox flex="1" style="background: #993333">
                <description>
-                       Enter a workstation name and library to register this client under:
+                       &staff.main.ws_info.entry;
                </description>
                <hbox>
-                       <label value="Name" control="wsname"/>
+                       <label value="&staff.main.ws_info.name;" control="wsname"/>
                        <textbox id="wsname" />
                </hbox>
                <hbox>
                        <hbox id="placeholder"/>
-                       <button id="register_btn" label="Register" accesskey="R" oncommand="register();"/>
+                       <button id="register_btn" label="&staff.main.ws_info.register_btn.label;" accesskey="&staff.main.ws_info.register_btn.accesskey;" oncommand="register();"/>
                </hbox>
        </vbox>
 </window>
diff --git a/Open-ILS/xul/staff_client/server/patron/adv_barcode_entry.xul b/Open-ILS/xul/staff_client/server/patron/adv_barcode_entry.xul
deleted file mode 100644 (file)
index 48e98f7..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0"?>
-<!-- Application: Evergreen Staff Client -->
-<!-- Screen: Retrieve Patron By Barcode -->
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- STYLESHEETS -->
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
-<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- LOCALIZATION -->
-<!DOCTYPE window PUBLIC "" ""[
-       <!--#include virtual="/opac/locale/en-US/lang.dtd"-->
-]>
-
-<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-<!-- OVERLAYS -->
-<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
-
-<window id="patron_barcode_entry_win" 
-       onload="try { my_init(); font_helper(); } catch(E) { alert(E); }"
-       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
-       <!-- BEHAVIOR -->
-        <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
-        <scripts id="openils_util_scripts"/>
-
-       <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
-       <script>
-       <![CDATA[
-               function my_init() {
-                       try {
-                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
-                               JSAN.errorLevel = "die"; // none, warn, or die
-                               JSAN.addRepository('/xul/server/');
-                               JSAN.use('util.error'); g.error = new util.error();
-                               g.error.sdump('D_TRACE','my_init() for patron/barcode_entry.xul');
-
-                               var tb = document.getElementById('barcode_tb');
-                               tb.addEventListener(
-                                       'keypress',
-                                       function(ev) {
-                                               if (ev.keyCode == 13 || ev.keyCode == 77) {
-                                                       setTimeout(
-                                                               function() {
-                                                                       submit();
-                                                               }, 0
-                                                       );
-                                               }
-                                       },
-                                       false
-                               );
-                               tb.focus();
-       
-                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('User Permission Editor'); } catch(E) { alert(E); }
-                               }
-
-                               if (xul_param('error')) { 
-                                       var error = xul_param('error');
-                                       alert(error);
-                               }
-
-                       } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" + E + '\n';
-                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
-                               alert(err_msg);
-                       }
-               }
-
-               function submit() {
-                       var tb;
-                       try {
-                               JSAN.use('util.sound'); var sound = new util.sound();
-                               tb = document.getElementById('barcode_tb');
-                               var barcode = tb.value;
-
-                               barcode = String( barcode ).replace( /\s+/g, '' );
-
-                               if (!barcode) { sound.bad(); add_msg('No barcode entered.'); tb.select(); tb.focus(); return; }
-
-                               JSAN.use('util.network'); var net = new util.network();
-
-                               tb.disabled = true;
-                               document.getElementById('progress').setAttribute('hidden','false');
-                               net.simple_request('PATRON_BARCODE_EXISTS',[ ses(), barcode ],
-                                       function(req) {
-                                               document.getElementById('progress').setAttribute('hidden','true');
-                                               tb.disabled = false; tb.select(); tb.focus(); ;
-                                               var robj = req.getResultObject();
-                                               if (typeof robj.ilsevent != 'undefined') {
-                                                       sound.bad();
-                                                       add_msg('Problem retrieving ' + barcode + '.  Please report this message: \n' + js2JSON(robj));
-                                                       return;
-                                               } else if (robj == 0) {
-                                                       sound.bad(); 
-                                                       add_msg('Barcode ' + barcode + ' not found.');
-                                                       return;
-                                               }
-
-                                               sound.good();
-
-                                               spawn(barcode);
-                                       }
-                               );
-                       } catch(E) {
-                               tb.select(); tb.focus();
-                               g.error.standard_unexpected_error_alert('barcode_entry.xul',E);
-                       }
-               }
-
-               function add_msg(text) {
-                       var x = document.getElementById('status');
-                       var d = document.createElement('description');
-                       x.appendChild(d);
-                       d.appendChild( document.createTextNode( text ) );
-                       d.setAttribute('style','color: red');
-               }
-
-               function spawn(barcode) {
-                       try {
-
-                               JSAN.use('patron.util'); var patron_obj = patron.util.retrieve_fleshed_au_via_barcode( ses(), barcode );
-
-                               var loc = urls.XUL_USER_PERM_EDITOR + '?ses=' + window.escape(ses()) + '&usr=' + patron_obj.id();
-
-                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab == 'function') {
-
-                                       window.xulG.set_tab( loc, {}, {} );
-                               } else {
-
-                                       location.href = loc;
-;
-                               }
-                       } catch(E) {
-                               g.error.standard_unexpected_error_alert('spawning patron display',E);
-                       }
-               }
-
-               function default_focus() { try { setTimeout( function() { document.getElementById('barcode_tb').focus(); }, 0); } catch(E) {} }
-       ]]>
-       </script>
-
-       <vbox flex="1" class="my_overflow">
-               <groupbox orient="vertical" flex="1">
-                       <caption label="Retrieve Patron" />
-                       <hbox>
-                               <label value="Barcode:" accesskey="B" control="barcode_tb"/>
-                               <textbox id="barcode_tb" />
-                               <button label="Submit" accesskey="S" oncommand="submit();"/>
-                       </hbox>
-                       <label value="Retrieving..." style="color: green" id="progress" hidden="true"/>
-                       <vbox id="status">
-                       </vbox>
-               </groupbox>
-       </vbox>
-
-</window>
-
diff --git a/Open-ILS/xul/staff_client/server/patron/barcode_entry.js b/Open-ILS/xul/staff_client/server/patron/barcode_entry.js
deleted file mode 100644 (file)
index 9b9c762..0000000
+++ /dev/null
@@ -1,760 +0,0 @@
-               function $(id) { return document.getElementById(id); }
-               function $c(tag) { return document.createElement(tag); }
-               function $w(e,msg) { 
-                       if (typeof e != 'object') e = $(e); 
-                       switch(e.nodeName) {
-                               case 'description' :
-                                       e.appendChild( document.createTextNode( msg ) );
-                               break;
-                               case 'label' : 
-                               default:
-                                       e.setAttribute('value',msg);
-                               break;
-                       }
-               }
-
-/*********************************************************************************************************/
-/* Main entry point */
-
-               function my_init() {
-                       try {
-                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
-                               JSAN.errorLevel = "die"; // none, warn, or die
-                               JSAN.addRepository('/xul/server/');
-                               JSAN.use('util.error'); g.error = new util.error();
-                               g.error.sdump('D_TRACE','my_init() for patron/barcode_entry.xul');
-                               JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
-
-                               JSAN.use('util.network'); g.network = new util.network();
-                               JSAN.use('util.barcode');
-                               JSAN.use('util.print'); g.print = new util.print();
-
-                               g.cgi = new CGI();
-
-                               /************************************************************/
-                               /* set up the non-cat menu */
-
-                               JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
-                               var items = [ [ 'or choose a non-barcoded option' , 'barcode' ] ].concat(
-                                               util.functional.map_list(
-                                                       util.functional.filter_list(
-                                                               g.data.list.cnct,
-                                                               function(o) {
-                                                                       return util.fm_utils.compare_aou_a_is_b_or_ancestor(o.owning_lib(), g.data.list.au[0].ws_ou());
-                                                               }
-                                                       ).sort(
-
-                                                               function(a,b) {
-                                                                       try { 
-                                                                               return util.fm_utils.sort_func_aou_by_depth_and_then_string(
-                                                                                       [ a.owning_lib(), a.name() ],
-                                                                                       [ b.owning_lib(), b.name() ]
-                                                                               );
-                                                                       } catch(E) {
-                                                                               alert('error in noncat sorting: ' + E);
-                                                                               return 0;
-                                                                       }
-                                                               }
-
-                                                       ),
-                                                       function(o) {
-                                                               return [ g.data.hash.aou[ o.owning_lib() ].shortname() + ' : ' + o.name(), o.id() ];
-                                                       }
-                                               )
-                               );
-                               g.error.sdump('D_TRACE','items = ' + js2JSON(items));
-                               var ml = util.widgets.make_menulist(
-                                       items
-                               );
-                               $("checkout_menu_placeholder").appendChild( ml );
-                               ml.setAttribute('id','checkout_menulist');
-                               ml.setAttribute('accesskey','');
-                               ml.addEventListener(
-                                       'command',
-                                       function(ev) {
-                                               var tb = $('checkout_barcode_entry_textbox');
-                                               var db = $('checkout_duedate_menu');
-                                               if (ev.target.value == 'barcode') {
-                                                       db.value = db.getAttribute('default_value') || db.value;
-                                                       db.disabled = false;
-                                                       tb.disabled = false;
-                                                       tb.value = '';
-                                                       tb.focus();
-                                               } else {
-                                                       db.setAttribute('default_value',db.value);
-                                                       db.value = 'Normal';
-                                                       db.disabled = true;
-                                                       tb.disabled = true;
-                                                       tb.value = 'Non-Cataloged';
-                                               }
-                                       }, false
-                               );
-
-                               /************************************************************/
-                               /* set up the patron barcode textbox */
-
-                               var tb = $('barcode_tb');
-                               tb.addEventListener(
-                                       'keypress',
-                                       function(ev) {
-                                               if (ev.keyCode == 13 || ev.keyCode == 77) {
-                                                       setTimeout(
-                                                               function() {
-                                                                       submit();
-                                                               }, 0
-                                                       );
-                                               }
-                                       },
-                                       false
-                               );
-                               tb.focus();
-
-                               /************************************************************/
-                               /* set up the item barcode textbox */
-
-                               $('checkout_barcode_entry_textbox').addEventListener(
-                                       'keypress',
-                                       function(ev) {
-                                               if (ev.keyCode == 13 || ev.keyCode == 77) {
-                                                       setTimeout(
-                                                               function() {
-                                                                       submit_item();
-                                                               }, 0
-                                                       );
-                                               }
-                                       },
-                                       false
-                               );
-
-                               $('checkout_top_ui').hidden = ! $('quick_checkout').checked;    
-       
-                               $("checkout_barcode_entry_textbox").disabled = true;
-                               $("checkout_duedate_menu").disabled = true;
-                               $("checkout_menulist").disabled = true;
-                               $("checkout_submit").disabled = true;
-                               $("done").disabled = true;
-                               $("retrieve_patron").disabled = true;
-                               $("strict_barcode").disabled = true;
-                               $("enable_print").disabled = true;
-
-                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Check Out'); } catch(E) { alert(E); }
-                               }
-
-                               if (g.cgi.param('error')) { 
-                                       var error = g.cgi.param('error');
-                                       alert(error);
-                               }
-
-                       } catch(E) {
-                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
-                                       "system administrator or software developer the following:\n" + E + '\n';
-                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
-                               alert(err_msg);
-                       }
-               }
-
-
-/*********************************************************************************************************/
-/* test for a specific event in array or scalar */
-
-               function test_event(list,ev) {
-                       if (typeof list.ilsevent != 'undefined' ) {
-                               if (list.ilsevent == ev) {
-                                       return list;
-                               } else {
-                                       return false;
-                               }
-                       } else {
-                               for (var i = 0; i < list.length; i++) {
-                                       if (typeof list[i].ilsevent != 'undefined') {
-                                               if (list[i].ilsevent == ev) return list[i];
-                                       }
-                               }
-                               return false;
-                       }
-               }
-
-/*********************************************************************************************************/
-/* look for a valid checkdigit if the strict barcode check is enabled */
-
-               function test_barcode(bc) {
-                       var x = document.getElementById('strict_barcode');
-                       if (x && x.checked != true) return true;
-                       var good = util.barcode.check(bc);
-                       if (good) {
-                               return true;
-                       } else {
-                               if ( 1 == g.error.yns_alert(
-                                                       'Bad checkdigit; possible mis-scan.  Use this barcode ("' + bc + '") anyway?',
-                                                       'Bad Barcode',
-                                                       'Cancel',
-                                                       'Accept Barcode',
-                                                       null,
-                                                       'Check here to confirm this action',
-                                                       '/xul/server/skin/media/images/bad_barcode.png'
-                               ) ) {
-                                       return true;
-                               } else {
-                                       return false;
-                               }
-                       }
-               }
-
-/*********************************************************************************************************/
-/* check and convert the value in the due_date widget */
-
-               function test_date(node) {
-                       JSAN.use('util.date');
-                       try {
-                               if (node.value == 'Normal') return true;
-                               var pattern = node.value.match(/Today \+ (\d+) days/);
-                               if (pattern) {
-                                       var today = new Date();
-                                       var todayPlus = new Date(); todayPlus.setTime( today.getTime() + 24*60*60*1000*pattern[1] );
-                                       node.value = util.date.formatted_date(todayPlus,"%F");
-                               }
-                               if (! util.date.check('YYYY-MM-DD',node.value) ) { throw('Invalid Date'); }
-                               if (util.date.check_past('YYYY-MM-DD',node.value) ) { throw('Due date needs to be after today.'); }
-                               if ( util.date.formatted_date(new Date(),'%F') == node.value) { throw('Due date needs to be after today.'); }
-                               return true;
-                       } catch(E) {
-                               alert(E);
-                               node.value = 'Normal';
-                               return true;
-                       }
-               }
-
-/*********************************************************************************************************/
-/* process the checkout submission -- first pass */
-
-               function submit_item() {
-                       try {
-               
-                               var checkout_params = {};
-
-                               JSAN.use('util.sound'); var sound = new util.sound();
-
-                               try { test_date($('checkout_duedate_menu')); } catch(E) { return; }
-                               if ($('checkout_duedate_menu').value != 'Normal') {
-                                       checkout_params.due_date = $('checkout_duedate_menu').value;
-                               }
-
-                               switch( $('checkout_menulist').value ) {
-
-                                       case 'barcode' :
-                                               var tb = $('checkout_barcode_entry_textbox');
-                                               var barcode = tb.value; barcode = String( barcode ).replace( /\s+/g, '' );
-                                               if (!barcode) { sound.circ_bad(); /*add_msg('No item barcode entered.');*/ tb.select(); tb.focus(); return; }
-                                               var row = $c('row'); 
-                                               if ($('spacer').nextSibling) {
-                                                       $('rows').insertBefore(row,$('spacer').nextSibling); 
-                                               } else {
-                                                       $('rows').appendChild(row);
-                                               }
-                                               row.setAttribute('name','lineitem');
-                                               var bc_label = $c('label'); row.appendChild(bc_label); $w(bc_label,barcode);
-                                               var dd_label = $c('label'); row.appendChild(dd_label); 
-                                               var tt_label = $c('description'); row.appendChild(tt_label);
-                                               addCSSClass(bc_label,'line_item'); addCSSClass(dd_label,'line_item'); addCSSClass(tt_label,'line_item');
-
-                                               if ( test_barcode(barcode) ) { 
-                                                       sound.circ_good(); 
-                                                       checkout_params.patron_id = g.patron_id;
-                                                       checkout_params.barcode = barcode;
-                                                       process_barcoded_item( checkout_params,dd_label,tt_label);
-                                               } else {
-                                                       $w(dd_label,'Bad Barcode');
-                                                       addCSSClass(dd_label,'bad_barcode');
-                                                       sound.circ_bad(); 
-                                               }
-
-                                               tb.value = ''; tb.select(); tb.focus();
-                                       break;
-
-                                       default:
-                                               alert('non-cat quick checkout not yet implemented');
-                                       break;
-
-                               }
-
-                       } catch(E) {
-                               g.error.standard_unexpected_error_alert('barcode_entry.xul:submit_item()',E);
-                               $('checkout_barcode_entry_textbox').focus();
-                               $('checkout_barcode_entry_textbox').select();
-                       }
-               }
-
-/*********************************************************************************************************/
-/* process the checkout submission -- second pass, barcoded item */
-
-       function process_barcoded_item(checkout_params,dd_label,tt_label) {
-               try {
-                       addCSSClass(dd_label,'checking_barcode');
-                       $w(dd_label,'Checking...');
-                       g.network.simple_request(
-                               checkout_params.precat ? 'CHECKOUT' : 'CHECKOUT_FULL',
-                               [ ses(), checkout_params ],
-                               function(req) {
-                                       try {
-                                               removeCSSClass(dd_label,'checking_barcode');
-                                               $w(dd_label,'');
-                                               process_barcoded_item_callback(req,checkout_params,dd_label,tt_label);
-                                       } catch(E) {
-                                               g.error.standard_unexpected_error_alert('barcode_entry.xul:process_barcoded('+checkout_params+'),callback wrapper',E);
-                                               $('checkout_barcode_entry_textbox').focus();
-                                               $('checkout_barcode_entry_textbox').select();
-                                       }
-                               },
-                               {
-                                       'title' : 'Override Checkout Failure?',
-                                       'overridable_events' : [ 
-                                               1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */,
-                                               1213 /* PATRON_BARRED */,
-                                               1215 /* CIRC_EXCEEDS_COPY_RANGE */,
-                                               7002 /* PATRON_EXCEEDS_CHECKOUT_COUNT */,
-                                               7003 /* COPY_CIRC_NOT_ALLOWED */,
-                                               7004 /* COPY_NOT_AVAILABLE */, 
-                                               7006 /* COPY_IS_REFERENCE */, 
-                                               7010 /* COPY_ALERT_MESSAGE */,
-                                               7013 /* PATRON_EXCEEDS_FINES */,
-                                               7016 /* ITEM_ON_HOLDS_SHELF */,
-                                       ],
-                                       'text' : {
-                                               '1212' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '1213' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '1215' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '7002' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '7003' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '7004' : function(r) {
-                                                       return 'Status: ' + r.payload.status().name() + '\nItem: ' + checkout_params.barcode;
-                                               },
-                                               '1212' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '7010' : function(r) {
-                                                       return 'Alert: ' + r.payload + '\nItem: ' + checkout_params.barcode;
-                                               },
-                                               '7013' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                               '7016' : function(r) { return 'Item: ' + checkout_params.barcode; },
-                                       }
-                               }
-                       );
-               } catch(E) {
-                       g.error.standard_unexpected_error_alert('barcode_entry.xul:process_barcoded('+checkout_params+')',E);
-                       $('checkout_barcode_entry_textbox').focus();
-                       $('checkout_barcode_entry_textbox').select();
-               }
-       }
-
-       function process_barcoded_item_callback(req,checkout_params,dd_label,tt_label) {
-               try {
-                       var checkout = req.getResultObject();
-
-                       if (typeof checkout.ilsevent != 'undefined') checkout = [ checkout ];
-
-                       if (test_event(checkout, 0 /* SUCCESS */)) {
-
-                               removeCSSClass(dd_label,'bad_barcode'); removeCSSClass(tt_label,'bad_barcode');
-                               var dd = String(checkout[0].payload.circ.due_date()).substr(0,10);
-                               var tt = checkout[0].payload.record ? checkout[0].payload.record.title() : checkout[0].payload.copy.dummy_title(); 
-                               $w(dd_label, dd);
-                               util.widgets.remove_children(tt_label);
-                               $w(tt_label, tt);
-                               if ($('enable_print').checked) {
-                                       var print_params = { 
-                                               'patron' : g.patron, 
-                                               'lib' : g.data.hash.aou[ g.data.list.au[0].ws_ou() ],
-                                               'staff' : g.data.list.au[0],
-                                               //'header' : g.data.print_list_templates.checkout.header,
-                                               'line_item' : g.data.print_list_templates.checkout.line_item,
-                                               //'footer' : g.data.print_list_templates.checkout.footer,
-                                               'type' : g.data.print_list_templates.checkout.type,
-                                               'list' : [ { 'barcode' : checkout_params.barcode, 'title' : tt, 'due_date' : dd } ],
-                                               'silent' : true,
-                                               'print_strategy' : 'dos.print',
-                                       };
-                                       g.print.tree_list( print_params );
-                               }
-                       } else if (
-                               test_event(checkout, 1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */) ||
-                               test_event(checkout, 1213 /* PATRON_BARRED */) ||
-                               test_event(checkout, 1215 /* CIRC_EXCEEDS_COPY_RANGE */) ||
-                               test_event(checkout, 7002 /* PATRON_EXCEEDS_CHECKOUT_COUNT */) ||
-                               test_event(checkout, 7003 /* COPY_CIRC_NOT_ALLOWED */) ||
-                               test_event(checkout, 7004 /* COPY_NOT_AVAILABLE */) || 
-                               test_event(checkout, 7006 /* COPY_IS_REFERENCE */) || 
-                               test_event(checkout, 7010 /* COPY_ALERT_MESSAGE */) ||
-                               test_event(checkout, 7016 /* ITEM_ON_HOLDS_SHELF */) ||
-                               test_event(checkout, 7013 /* PATRON_EXCEEDS_FINES */) 
-                       ) {
-                               addCSSClass(dd_label,'bad_barcode'); addCSSClass(tt_label,'bad_barcode');
-                               $w(dd_label,'Failed');
-                               for (var i = 0; i < checkout.length; i++) $w(tt_label,checkout[i].textcode + ' ');
-                       } else if (test_event(checkout,1202 /* ITEM_NOT_CATALOGED */)) {
-
-                               /**************************************************************************************/
-                               /* offer pre-cat checkout */
-
-                               $w(dd_label,'Pre-Cat?');
-
-                               if ( 1 == g.error.yns_alert(
-                                       'Mis-scan or non-cataloged item.  Checkout ("' + checkout_params.barcode + '") as a pre-cataloged item?',
-                                       'Alert',
-                                       'Cancel',
-                                       'Pre-Cat',
-                                       null,
-                                       'Check here to confirm this action',
-                                       '/xul/server/skin/media/images/book_question.png'
-                               ) ) {
-
-                                       g.data.dummy_title = ''; g.data.dummy_author = ''; g.data.stash('dummy_title','dummy_author');
-                                       JSAN.use('util.window'); var win = new util.window();
-                                       win.open(urls.XUL_PRE_CAT, 'dummy_fields', 'chrome,resizable,modal');
-                                       g.data.stash_retrieve();
-
-                                       checkout_params.permit_key = checkout[0].payload;
-                                       checkout_params.dummy_title = g.data.dummy_title;
-                                       checkout_params.dummy_author = g.data.dummy_author;
-                                       checkout_params.precat = 1;
-
-                                       if (checkout_params.dummy_title != '') { 
-                                               process_barcoded_item( checkout_params, dd_label, tt_label ); 
-                                       } else { 
-                                               throw(checkout); 
-                                       }
-
-                               } else {
-                                       throw(checkout);
-                               }
-                       } else if (test_event(checkout, 1702 /* OPEN_CIRCULATION_EXISTS */)) {
-
-                               /**************************************************************************************/
-                               /* offer to checkin an already circulating item */
-
-                               addCSSClass(dd_label,'bad_barcode'); $w(dd_label,'Check In?');
-                               addCSSClass(tt_label,'bad_barcode'); for (var i = 0; i < checkout.length; i++) $w(tt_label,checkout[i].textcode + ' ');
-                               g.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[checkout_params.barcode],
-                                       function(req) {
-                                               try {
-                                                       var my_copy = req.getResultObject();
-                                                       if (typeof my_copy.ilsevent != 'undefined') throw(my_copy);
-                                                       g.network.simple_request('FM_CIRC_RETRIEVE_VIA_COPY',[ses(),my_copy.id(),1],
-                                                               function(rreq) {
-                                                                       try {
-                                                                               var my_circ = rreq.getResultObject();
-                                                                               if (typeof my_circ.ilsevent != 'undefined') throw(my_copy);
-                                                                               my_circ = my_circ[0];
-                                                                               var due_date = my_circ.due_date() ? my_circ.due_date().substr(0,10) : null;
-                                                                               JSAN.use('util.date'); var today = util.date.formatted_date(new Date(),'%F');
-                                                                               var msg = 'This item ("' + checkout_params.barcode + '") is already circulating.';
-                                                                               if (due_date) if (today > due_date) msg += '\nIt was due on ' + due_date + '.\n';
-                                                                               var r = g.error.yns_alert(
-                                                                                       msg, 'Check Out Failed','Cancel','Checkin then Checkout', 
-                                                                                       due_date ? (today > due_date ? 'Forgiving Checkin then Checkout' : null) : null,
-                                                                                       'Check here to confirm this message'
-                                                                               );
-                                                                               JSAN.use('circ.util');
-                                                                               switch(r) {
-                                                                                       case 1:
-                                                                                               circ.util.checkin_via_barcode( ses(), { 'barcode' : checkout_params.barcode } );
-                                                                                               process_barcoded_item( checkout_params, dd_label, tt_label ); 
-                                                                                       break;
-                                                                                       case 2:
-                                                                                               circ.util.checkin_via_barcode( ses(), { 'barcode' : checkout_params.barcode }, due_date );
-                                                                                               process_barcoded_item( checkout_params, dd_label, tt_label ); 
-                                                                                       break;
-                                                                               }
-                                                                       } catch(E) {
-                                                                               addCSSClass(dd_label,'bad_barcode'); addCSSClass(tt_label,'bad_barcode');
-                                                                               $w(dd_label,'Error');
-                                                                               if (E.length) {
-                                                                                       for (var i = 0; i < E.length; i++) $w(tt_label,E[i].textcode + ' ');
-                                                                               } else {
-                                                                                       $w(tt_label,E);
-                                                                               }
-                                                                       }
-                                                               }
-                                                       );
-                                               } catch(E) {
-                                                       addCSSClass(dd_label,'bad_barcode'); addCSSClass(tt_label,'bad_barcode');
-                                                       $w(dd_label,'Error');
-                                                       if (E.length) {
-                                                               for (var i = 0; i < E.length; i++) $w(tt_label,E[i].textcode + ' ');
-                                                       } else {
-                                                               $w(tt_label,E);
-                                                       }
-                                               }
-                                       }
-                               );
-                       } else if (test_event(checkout, 7014 /* COPY_IN_TRANSIT */)) {
-
-                               /**************************************************************************************/
-                               /* offer to abort an existing transit for the item attempting to be checked out */
-
-                               addCSSClass(dd_label,'bad_barcode'); $w(dd_label,'Abort transit?');
-                               addCSSClass(tt_label,'bad_barcode'); for (var i = 0; i < checkout.length; i++) $w(tt_label,checkout[i].textcode + ' ');
-                               var r = g.error.yns_alert('This item ("' + checkout_params.barcode + '") is in transit.','Check Out Failed','Cancel','Abort Transit then Checkout',null,'Check here to confirm this message');
-                               switch(r) {
-                                       case 1:
-                                               var robj = g.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : checkout_params.barcode } ]);
-                                               if (typeof robj.ilsevent == 'undefined') {
-                                                       process_barcoded_item( checkout_params, dd_label, tt_label ); 
-                                               } else {
-                                                       throw(robj);
-                                               }
-                                       break;
-                               }
-                       } else {
-                               throw(checkout);
-                       }
-
-               } catch(E) {
-                       addCSSClass(dd_label,'bad_barcode'); addCSSClass(tt_label,'bad_barcode');
-                       $w(dd_label,'Error');
-                       if (E.length) {
-                               for (var i = 0; i < E.length; i++) $w(tt_label,E[i].textcode + ' ');
-                       } else {
-                               $w(tt_label,E);
-                       }
-                       //g.error.standard_unexpected_error_alert('Error in barcode_entry.js:process_barcoded_item_callack()',E);
-               }
-       }
-       
-/*********************************************************************************************************/
-/* process the patron submission */
-
-               function submit() {
-                       var tb;
-                       try {
-                               JSAN.use('util.sound'); var sound = new util.sound();
-                               tb = $('barcode_tb');
-                               var barcode = tb.value;
-
-                               barcode = String( barcode ).replace( /\s+/g, '' );
-
-                               if (!barcode) { sound.bad(); add_msg('No barcode entered.'); tb.select(); tb.focus(); return; }
-
-                               tb.disabled = true; $('submit_cb').disabled = true; $('quick_checkout').disabled = true;
-                               $('progress').setAttribute('hidden','false');
-                               g.network.simple_request('PATRON_BARCODE_EXISTS',[ ses(), barcode ],
-                                       function(req) {
-                                               $('progress').setAttribute('hidden','true');
-                                               var robj = req.getResultObject();
-                                               if (typeof robj.ilsevent != 'undefined') {
-                                                       tb.disabled = false; tb.select(); tb.focus(); $('submit_cb').disabled = false; $('quick_checkout').disabled = false;
-                                                       sound.bad();
-                                                       add_msg('Problem retrieving ' + barcode + '.  Please report this message: \n' + js2JSON(robj));
-                                                       return;
-                                               } else if (robj == 0) {
-                                                       tb.disabled = false; tb.select(); tb.focus(); $('submit_cb').disabled = false; $('quick_checkout').disabled = false;
-                                                       sound.bad(); 
-                                                       add_msg('Barcode ' + barcode + ' not found.');
-                                                       return;
-                                               }
-
-                                               sound.good(); g.barcode = barcode;
-
-                                               if ($('quick_checkout').checked) {
-                                                       g.network.simple_request(
-                                                               'FM_AU_RETRIEVE_VIA_BARCODE',
-                                                               [ ses(), barcode ],
-                                                               function(req) {
-                                                                       var p = req.getResultObject();  
-                                                                       g.patron = p;
-                                                                       $w('patron_name',
-                                                                               p.family_name() + ', ' + p.first_given_name() + ' ' +
-                                                                               ( p.second_given_name() ? p.second_given_name() : '' )
-                                                                       );
-                                                                       JSAN.use('patron.util'); patron.util.set_penalty_css(p);
-                                                                       alert_message(p);
-
-                                                                       g.patron_id = p.id();
-                                                                       /**/
-                                                                       util.widgets.remove_children( 'status' );
-                                                                       $("checkout_barcode_entry_textbox").disabled = false;
-                                                                       $("checkout_barcode_entry_textbox").focus();
-                                                                       $("checkout_duedate_menu").disabled = false;
-                                                                       $("checkout_menulist").disabled = false;
-                                                                       $("checkout_submit").disabled = false;
-                                                                       $("done").disabled = false;
-                                                                       $("retrieve_patron").disabled = false;
-                                                                       $("strict_barcode").disabled = false;
-                                                                       $("enable_print").disabled = false;
-                                                                       /**/
-                                                               }
-                                                       );
-                                               } else {
-                                                       retrieve_patron(true);
-                                               }
-                                       }
-                               );
-                       } catch(E) {
-                               tb.select(); tb.focus();
-                               g.error.standard_unexpected_error_alert('barcode_entry.xul:submit()',E);
-                       }
-               }
-
-/*********************************************************************************************************/
-/* finish with simple checkout and go back to patron submission form */
-
-               function done() {
-                       try {
-                               removeCSSClass(document.documentElement,'PATRON_HAS_BILLS');
-                               removeCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
-                               removeCSSClass(document.documentElement,'PATRON_HAS_NOTES');
-                               removeCSSClass(document.documentElement,'PATRON_EXCEEDS_CHECKOUT_COUNT');
-                               removeCSSClass(document.documentElement,'PATRON_EXCEEDS_OVERDUE_COUNT');
-                               removeCSSClass(document.documentElement,'PATRON_EXCEEDS_FINES');
-                               removeCSSClass(document.documentElement,'NO_PENALTIES');
-                               removeCSSClass(document.documentElement,'ONE_PENALTY');
-                               removeCSSClass(document.documentElement,'MULTIPLE_PENALTIES');
-                               removeCSSClass(document.documentElement,'PATRON_HAS_ALERT');
-                               removeCSSClass(document.documentElement,'PATRON_BARRED');
-                               removeCSSClass(document.documentElement,'PATRON_INACTIVE');
-                               removeCSSClass(document.documentElement,'PATRON_EXPIRED');
-                               removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
-                               removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_GE_65');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_LT_65');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_GE_24');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_LT_24');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_GE_21');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_LT_21');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_GE_18');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_LT_18');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_GE_13');
-                               removeCSSClass(document.documentElement,'PATRON_AGE_LT_13');
-                               removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_1');
-                               removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_2');
-                               removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_3');
-                               $w('patron_name','');
-                               g.barcode = '';
-                               var nl = document.getElementsByAttribute('name','lineitem');
-                               var remove_these = [];
-                               for (var i = 0; i < nl.length; i++) remove_these.push( nl[i] ); // a nodelist is not a simple array we can safely delete the dom nodes from
-                               for (var i = 0; i < remove_these.length; i++) remove_these[i].parentNode.removeChild( remove_these[i] );
-                               $("checkout_barcode_entry_textbox").value = ''; $("checkout_menulist").value = 'barcode';
-                               $("checkout_barcode_entry_textbox").disabled = true; $("checkout_duedate_menu").disabled = true;
-                               $("checkout_menulist").disabled = true; $("checkout_submit").disabled = true;
-                               $('barcode_tb').disabled = false; $('barcode_tb').value = ''; $('barcode_tb').select(); $('barcode_tb').focus(); $('submit_cb').disabled = false;
-                               $('quick_checkout').disabled = false; $("done").disabled = true; $("retrieve_patron").disabled = true;
-                               $("strict_barcode").disabled = true; $("enable_print").disabled = true;
-
-                       } catch(E) {
-                               g.error.standard_unexpected_error_alert('barcode_entry.xul:done()',E);
-                       }
-               }
-
-/*********************************************************************************************************/
-/* take a patron object and alert any needed messages based on the patron */
-
-               function alert_message(patron) {
-                               g.network.simple_request(
-                                       'FM_AHR_COUNT_RETRIEVE',
-                                       [ ses(), patron.id() ],
-                                       function(req) {
-                                               try {
-                                                       var msg = ''; g.stop_checkouts = false;
-                                                       if (patron.alert_message()) msg += '"' + patron.alert_message() + '"\n';
-                                                       if (g.barcode) {
-                                                               if (patron.cards()) for (var i = 0; i < patron.cards().length; i++) {
-                                                                       //alert('card #'+i+' == ' + js2JSON(patron.cards()[i]));
-                                                                       if ( (patron.cards()[i].barcode()==g.barcode) && ( ! get_bool(patron.cards()[i].active()) ) ) {
-                                                                               msg += 'Patron account retrieved with an INACTIVE card.\n';
-                                                                               g.stop_checkouts = true;
-                                                                       }
-                                                               }
-                                                       }
-                                                       if (get_bool(patron.barred())) {
-                                                               msg += 'Patron account is BARRED.\n';
-                                                               g.stop_checkouts = true;
-                                                       }
-                                                       if (!get_bool(patron.active())) {
-                                                               msg += 'Patron account is INACTIVE.\n';
-                                                               g.stop_checkouts = true;
-                                                       }
-                                                       if (patron.expire_date()) {
-                                                               var now = new Date();
-                                                               now = now.getTime()/1000;
-
-                                                               var expire_parts = patron.expire_date().substr(0,10).split('-');
-                                                               expire_parts[1] = expire_parts[1] - 1;
-
-                                                               var expire = new Date();
-                                                               expire.setFullYear(expire_parts[0], expire_parts[1], expire_parts[2]);
-                                                               expire = expire.getTime()/1000
-
-                                                               if (expire < now) {
-                                                                       msg += 'Patron account is EXPIRED.\n';
-                                                                       g.stop_checkouts = true;
-                                                               }
-                                                       }
-                                                       var holds = req.getResultObject();
-                                                       if (holds.ready && holds.ready > 0) msg += 'Holds available: ' + holds.ready;
-                                                       if (msg) {
-                                                               g.error.yns_alert(msg,'Alert Message','OK',null,null,'Check here to confirm this message.');
-                                                       }
-                                               } catch(E) {
-                                                       g.error.standard_unexpected_error_alert('Error showing patron alert and holds availability.',E);
-                                               }
-                                       }
-                               );
-               }
-
-/*********************************************************************************************************/
-/* append text to an error section onscreen */
-
-               function add_msg(text) {
-                       var x = $('status');
-                       var d = $c('description');
-                       x.appendChild(d);
-                       $w(d,text);
-                       d.setAttribute('style','color: red');
-               }
-
-/*********************************************************************************************************/
-/* Open the usual patron display in current tab */
-
-               function spawn(barcode) {
-                       try {
-                               var loc = urls.XUL_PATRON_DISPLAY; // + '?barcode=' + window.escape(barcode);
-
-                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab == 'function') {
-
-                                       window.xulG.set_tab( loc, {}, { 'barcode' : barcode } );
-                               } else {
-
-                                       location.href = loc + '?barcode=' + window.escape(barcode);
-;
-                               }
-                       } catch(E) {
-                               g.error.standard_unexpected_error_alert('spawning patron display',E);
-                       }
-               }
-
-/*********************************************************************************************************/
-/* Open the usual patron display */
-
-               function retrieve_patron(same_tab) {
-                       try {
-                               if (same_tab) {
-                                       if (typeof window.xulG == 'object' && typeof window.xulG.set_tab == 'function') {
-                                               var url = urls.XUL_PATRON_DISPLAY; 
-                                               window.xulG.set_tab( url, {}, { 'barcode' : g.barcode });
-                                       }
-                               } else {
-                                       if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
-                                               var url = urls.XUL_PATRON_DISPLAY; 
-                                               window.xulG.new_tab( url, {}, { 'barcode' : g.barcode });
-                                       }
-                               }
-                       } catch(E) {
-                               g.error.standard_unexpected_error_alert('Error retrieving patron',E);
-                       }
-               }
-
-/*********************************************************************************************************/
-/* used by the menu/tab code for determining focus upon a tab switch */
-
-               function default_focus() { try { setTimeout( function() { if (g.barcode) $('checkout_barcode_entry_textbox').focus(); else $('barcode_tb').focus(); }, 0); } catch(E) {} }
-
index 5c2b661..1ba13b2 100644 (file)
                                tb.focus();
        
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
-                                       try { window.xulG.set_tab_name('Check Out'); } catch(E) { alert(E); }
+                    if (xul_param('perm_editor')) {
+                                           try { window.xulG.set_tab_name('User Permission Editor'); } catch(E) { alert(E); }
+                    } else {
+                                       try { window.xulG.set_tab_name('Check Out'); } catch(E) { alert(E); }
+                    }
                                }
 
                                if (xul_param('error')) { 
@@ -89,7 +93,7 @@
 
                                tb.disabled = true;
                                document.getElementById('progress').setAttribute('hidden','false');
-                               net.simple_request('PATRON_BARCODE_EXISTS',[ ses(), barcode ],
+                               net.simple_request('PATRON_BARCODE_EXISTS.authoritative',[ ses(), barcode ],
                                        function(req) {
                                                document.getElementById('progress').setAttribute('hidden','true');
                                                tb.disabled = false; tb.select(); tb.focus(); ;
                }
 
                function spawn(barcode) {
+            if (xul_param('perm_editor')) { spawn_perm_editor(barcode); } else { spawn_checkout(barcode); }
+        }
+
+               function spawn_checkout(barcode) {
                        try {
                                var loc = urls.XUL_PATRON_DISPLAY; // + '?barcode=' + window.escape(barcode);
-
                                if (typeof window.xulG == 'object' && typeof window.xulG.set_tab == 'function') {
-
                                        window.xulG.set_tab( loc, {}, { 'barcode' : barcode } );
                                } else {
-
                                        location.href = loc + '?barcode=' + window.escape(barcode);
-;
                                }
                        } catch(E) {
                                g.error.standard_unexpected_error_alert('spawning patron display',E);
                        }
                }
 
+               function spawn_perm_editor(barcode) {
+                       try {
+                               JSAN.use('patron.util'); var patron_obj = patron.util.retrieve_fleshed_au_via_barcode( ses(), barcode );
+                               var loc = urls.XUL_USER_PERM_EDITOR + '?ses=' + window.escape(ses()) + '&usr=' + patron_obj.id();
+                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab == 'function') {
+                                       window.xulG.set_tab( loc, {}, {} );
+                               } else {
+                                       location.href = loc;
+                               }
+                       } catch(E) {
+                               g.error.standard_unexpected_error_alert('spawning user perm editor',E);
+                       }
+               }
+
+
                function default_focus() { try { setTimeout( function() { document.getElementById('barcode_tb').focus(); }, 0); } catch(E) {} }
        ]]>
        </script>
index c960693..6e97a26 100644 (file)
@@ -56,7 +56,7 @@
                }
 
                function retrieve_mbts() {
-                       g.network.simple_request('FM_MBTS_RETRIEVE',[ses(),g.mbts_id],
+                       g.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),g.mbts_id],
                                function(req) {
                                        try {
                                                g.mbts = req.getResultObject();
                                                $('copy_summary').hidden=false;
 
                                                g.network.simple_request(
-                                                       'MODS_SLIM_RECORD_RETRIEVE_VIA_COPY',
+                                                       'MODS_SLIM_RECORD_RETRIEVE.authoritative_VIA_COPY',
                                                        [ r_circ.target_copy() ],
                                                        function (rreq) {
                                                                var r_mvr = rreq.getResultObject();
                }
 
                function retrieve_mb() {
-                       g.mb_list = g.network.simple_request( 'FM_MB_RETRIEVE_VIA_MBTS_ID', [ ses(), g.mbts_id ] );
+                       g.mb_list = g.network.simple_request( 'FM_MB_RETRIEVE_VIA_MBTS_ID.authoritative', [ ses(), g.mbts_id ] );
                        //g.error.sdump('D_DEBUG',g.error.pretty_print( js2JSON(g.mb_list) ));
 
                        var mb_funcs = [];
                }
 
                function retrieve_mp() {
-                       var mp_list = g.network.simple_request( 'FM_MP_RETRIEVE_VIA_MBTS_ID', [ ses(), g.mbts_id ]);
+                       var mp_list = g.network.simple_request( 'FM_MP_RETRIEVE_VIA_MBTS_ID.authoritative', [ ses(), g.mbts_id ]);
                        //g.error.sdump('D_DEBUG',g.error.pretty_print( js2JSON(mp_list) ));
 
                        var mp_funcs = [];
                                if (r == 0) {
                                        var robj = g.network.simple_request('FM_MB_VOID',[ses()].concat(util.functional.map_list(mb_list,function(o){return o.id();})));
                                        if (robj.ilsevent) {
-                                               switch(robj.ilsevent) {
+                                               switch(Number(robj.ilsevent)) {
                                                        default: 
                                                                g.error.standard_unexpected_error_alert('Error voiding bills.',robj); 
                                                                retrieve_mbts();
        ]]>
        </script>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+
        <vbox flex="1" class="my_overflow">
                <label id="patron_name" class="patronNameLarge"/>
 
index f4d9763..05066d4 100644 (file)
 
                function retrieve_mbts_for_list() {
                        //var method = 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_CHARGE';
-                       var method = 'FM_MBTS_IDS_RETRIEVE_FOR_HISTORY';
-                       if (xul_param('current')) method = 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE';
+                       var method = 'FM_MBTS_IDS_RETRIEVE_FOR_HISTORY.authoritative';
+                       if (xul_param('current')) method = 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE.authoritative';
                        g.mbts_ids = g.network.simple_request(method,[ses(),g.patron_id]);
                        if (g.mbts_ids.ilsevent) {
-                               switch(g.mbts_ids.ilsevent) {
+                               switch(Number(g.mbts_ids.ilsevent)) {
                                        case -1: g.error.standard_network_error_alert('Please close this window and try again.'); break;
                                        default: g.error.standard_unexpected_error_alert('Please close this window and try again.',g.mbts_ids); break;
                                }
                }
 
                function retrieve_specific_mbts() {
-                       if (g.mbts_id) g.network.simple_request('FM_MBTS_RETRIEVE',[ses(),g.mbts_id],
+                       if (g.mbts_id) g.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),g.mbts_id],
                                function(req) {
                                        try {
                                                g.mbts = req.getResultObject();
                                                if (g.mbts.ilsevent) {
-                                                       switch(g.mbts.ilsevent) {
+                                                       switch(Number(g.mbts.ilsevent)) {
                                                                case -1: g.error.standard_network_error_alert('mbts_id = ' + g.mbts_id); break;
                                                                default: g.error.standard_unexpected_error_alert('mbts_id = ' + g.mbts_id,g.mbts); break;
                                                        }
                                                $('copy_summary').hidden=false;
 
                                                g.network.simple_request(
-                                                       'MODS_SLIM_RECORD_RETRIEVE_VIA_COPY',
+                                                       'MODS_SLIM_RECORD_RETRIEVE.authoritative_VIA_COPY',
                                                        [ r_circ.target_copy() ],
                                                        function (rreq) {
                                                                var r_mvr = rreq.getResultObject();
                                        if (id) {
                                                if (typeof row.my == 'undefined') row.my = {};
                                                if ( typeof row.my.mbts == 'undefined' ) {
-                                                       var mbts_obj = g.network.simple_request('FM_MBTS_RETRIEVE',[ses(),id]);
+                                                       var mbts_obj = g.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),id]);
                                                        row.my.mbts = mbts_obj;
                                                }
                                        }
        ]]>
        </script>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+
        <vbox flex="1" class="my_overflow">
         <vbox id="v1" persist="height" flex="1">
                <label id="patron_name" class="patronNameLarge"/>
index a633947..0161d97 100644 (file)
@@ -38,7 +38,7 @@
                function $(id) { return document.getElementById(id); }
 
                function retrieve_mbts() {
-                       g.network.simple_request('FM_MBTS_RETRIEVE',[ses(),g.mbts_id],
+                       g.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),g.mbts_id],
                                function(req) {
                                        try {
                                                g.mbts = req.getResultObject();
@@ -73,7 +73,7 @@
                                                $('due').value = r_circ.due_date() ? r_circ.due_date().toString().substr(0,10) : '';
 
                                                g.network.simple_request(
-                                                       'MODS_SLIM_RECORD_RETRIEVE_VIA_COPY',
+                                                       'MODS_SLIM_RECORD_RETRIEVE.authoritative_VIA_COPY',
                                                        [ r_circ.target_copy() ],
                                                        function (rreq) {
                                                                var r_mvr = rreq.getResultObject();
index b94b1cb..74bfee7 100644 (file)
@@ -21,7 +21,7 @@ patron.bills.prototype = {
 
        'current_payments' : [],
 
-       'SHOW_ME_THE_BILLS' : 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE',
+       'SHOW_ME_THE_BILLS' : 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE.authoritative',
        //'SHOW_ME_THE_BILLS' : 'FM_MBTS_IDS_RETRIEVE_ALL_STILL_OPEN',
        //'SHOW_ME_THE_BILLS' : 'FM_MOBTS_HAVING_BALANCE',
        /*'SHOW_ME_THE_BILLS' : 'FM_MOBTS_OPEN',*/
@@ -29,6 +29,10 @@ patron.bills.prototype = {
        'refresh' : function(dont_show_me_the_money) {
                var obj = this;
                try {
+                if (document.getElementById('circulating_hint')) {
+                    document.getElementById('circulating_hint').hidden = true;
+                }
+
                                obj.bills = obj.network.simple_request(
                                        obj.SHOW_ME_THE_BILLS,
                                        [ ses(), obj.patron_id ]
@@ -41,7 +45,7 @@ patron.bills.prototype = {
                                        } else if (instanceOf(obj.bills[i],mbts)) {
                                                obj.bills[i] = { 'transaction' : obj.bills[i] }
                                        } else {
-                                               var robj = obj.network.simple_request('FM_MBTS_RETRIEVE',[ses(),obj.bills[i]]);
+                                               var robj = obj.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),obj.bills[i]]);
                                                //alert('refresh robj = ' + js2JSON(robj));
                                                obj.bills[i] = { 'transaction' : robj }
                                        }
@@ -123,18 +127,17 @@ patron.bills.prototype = {
 
                                JSAN.use('util.list'); obj.list = new util.list('bill_list');
 
-                               function getString(s) { return obj.OpenILS.data.entities[s]; }
                                obj.list.init(
                                        {
                                                'columns' : [
                                                /*
                                                                {
-                                                                       'id' : 'xact_dates', 'label' : getString('staff.bills_xact_dates_label'), 'flex' : 1,
+                                                                       'id' : 'xact_dates', 'label' : document.getElementById('commonStrings').getString('staff.bills_xact_dates_label'), 'flex' : 1,
                                                                        'primary' : false, 'hidden' : false, 'render' : 'obj.xact_dates_box(my.mobts)'
                                                                },
                                                */
                                                                {
-                                                                       'id' : 'notes', 'label' : getString('staff.bills_information'), 'flex' : 2,
+                                                                       'id' : 'notes', 'label' : document.getElementById('commonStrings').getString('staff.bills_information'), 'flex' : 2,
                                                                        'primary' : false, 'hidden' : false, 'render' : 'obj.info_box(my)'
                                                                },
                                                                {
@@ -142,7 +145,7 @@ patron.bills.prototype = {
                                                                        'primary' : false, 'hidden' : false, 'render' : 'obj.money_box(my.mobts)'
                                                                },
                                                                {
-                                                                       'id' : 'current_pay', 'label' : getString('staff.bills_current_payment_label'), 'flex' : 0, 
+                                                                       'id' : 'current_pay', 'label' : document.getElementById('commonStrings').getString('staff.bills_current_payment_label'), 'flex' : 0, 
                                                                        'render' : 'obj.payment_box()'
                                                                }
                                                ],
@@ -506,6 +509,10 @@ patron.bills.prototype = {
                                                );
                                        }
                                }
+                if ( payment_blob.payments.length == 0 && payment_blob.patron_credit == '0.00' ) {
+                    alert('No payments or patron credit applied.');
+                    return;
+                }
                                if ( obj.pay( payment_blob ) ) {
 
                                        obj.data.voided_billings = []; obj.data.stash('voided_billings');
@@ -576,7 +583,7 @@ patron.bills.prototype = {
                        );
                        if (robj == 1) { return true; } 
                        if (typeof robj.ilsevent != 'undefined') {
-                               switch(robj.ilsevent) {
+                               switch(Number(robj.ilsevent)) {
                                        case 0 /* SUCCESS */ : return true; break;
                                        case 1226 /* REFUND_EXCEEDS_DESK_PAYMENTS */ : alert(robj.desc + '\n\nAnother way to "zero" this transaction is to use Add Billing and add a misc bill to counter the negative balance.'); return false; break;
                                        default: throw(robj); break;
@@ -665,7 +672,7 @@ patron.bills.prototype = {
                                                } else if (instanceOf(obj.bills[i],mbts)) {
                                                        obj.bills[i] = { 'transaction' : obj.bills[i] }
                                                } else {
-                                                       var robj = obj.network.simple_request('FM_MBTS_RETRIEVE',[ses(),obj.bills[i]]);
+                                                       var robj = obj.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),obj.bills[i]]);
                                                        //alert('robj = ' + js2JSON(robj));
                                                        obj.bills[i] = { 'transaction' : robj }
                                                }
@@ -717,7 +724,6 @@ patron.bills.prototype = {
        'xact_dates_box' : function ( mobts ) {
                var obj = this;
                try {
-                               function getString(s) { return obj.OpenILS.data.entities[s]; }
                                var grid = document.createElement('grid');
                                        var cols = document.createElement('columns');
                                        grid.appendChild( cols );
@@ -734,7 +740,7 @@ patron.bills.prototype = {
                                                        row0.appendChild( hb_r0_1 );
                                                                var label_r0_1 = document.createElement('label');
                                                                hb_r0_1.appendChild( label_r0_1 );
-                                                               label_r0_1.setAttribute('value',getString('staff.mbts_id_label'));
+                                                               label_r0_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_id_label'));
                                                                var label_r0_2 = document.createElement('label');
                                                                hb_r0_1.appendChild( label_r0_2 );
                                                                label_r0_2.setAttribute('value',mobts.id());
@@ -742,7 +748,7 @@ patron.bills.prototype = {
                                                rows.appendChild( row1 );
                                                        var label_r1_1 = document.createElement('label');
                                                        row1.appendChild( label_r1_1 );
-                                                       label_r1_1.setAttribute('value',getString('staff.mbts_xact_start_label'));
+                                                       label_r1_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_xact_start_label'));
                                                        var label_r1_2 = document.createElement('label');
                                                        row1.appendChild( label_r1_2 );
                                                        label_r1_2.setAttribute('value',mobts.xact_start().toString().substr(0,10));
@@ -750,7 +756,7 @@ patron.bills.prototype = {
                                                rows.appendChild( row2 );
                                                        var label_r2_1 = document.createElement('label');
                                                        row2.appendChild( label_r2_1 );
-                                                       label_r2_1.setAttribute('value',getString('staff.mbts_xact_finish_label'));
+                                                       label_r2_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_xact_finish_label'));
                                                        var label_r2_2 = document.createElement('label');
                                                        row2.appendChild( label_r2_2 );
                                                        try { label_r2_2.setAttribute('value',mobts.xact_finish().toString().substr(0,10));
@@ -766,7 +772,6 @@ patron.bills.prototype = {
                var obj = this;
                try {
                                JSAN.use('util.money');
-                               function getString(s) { return obj.OpenILS.data.entities[s]; }
                                var grid = document.createElement('grid');
                                        var cols = document.createElement('columns');
                                        grid.appendChild( cols );
@@ -778,7 +783,7 @@ patron.bills.prototype = {
                                                rows.appendChild( row1 );
                                                        var label_r1_1 = document.createElement('label');
                                                        row1.appendChild( label_r1_1 );
-                                                       label_r1_1.setAttribute('value',getString('staff.mbts_total_owed_label'));
+                                                       label_r1_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_total_owed_label'));
                                                        var label_r1_2 = document.createElement('label');
                                                        row1.appendChild( label_r1_2 );
                                                        label_r1_2.setAttribute('value','$' + util.money.sanitize(mobts.total_owed() || '0') );
@@ -786,7 +791,7 @@ patron.bills.prototype = {
                                                rows.appendChild( row2 );
                                                        var label_r2_1 = document.createElement('label');
                                                        row2.appendChild( label_r2_1 );
-                                                       label_r2_1.setAttribute('value',getString('staff.mbts_total_paid_label'));
+                                                       label_r2_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_total_paid_label'));
                                                        var label_r2_2 = document.createElement('label');
                                                        row2.appendChild( label_r2_2 );
                                                        label_r2_2.setAttribute('value','$' + util.money.sanitize(mobts.total_paid() || '0') );
@@ -794,7 +799,7 @@ patron.bills.prototype = {
                                                rows.appendChild( row3 );
                                                        var label_r3_1 = document.createElement('label');
                                                        row3.appendChild( label_r3_1 );
-                                                       label_r3_1.setAttribute('value',getString('staff.mbts_balance_owed_label'));
+                                                       label_r3_1.setAttribute('value',document.getElementById('commonStrings').getString('staff.mbts_balance_owed_label'));
                                                        label_r3_1.setAttribute('style','font-weight: bold');
                                                        var label_r3_2 = document.createElement('label');
                                                        row3.appendChild( label_r3_2 );
@@ -810,7 +815,6 @@ patron.bills.prototype = {
        'info_box' : function ( my ) {
                var obj = this;
                try {
-                               function getString(s) { return obj.OpenILS.data.entities[s]; }
                                var vbox = document.createElement('vbox');
 
                                        var hbox = document.createElement('hbox');
@@ -882,7 +886,7 @@ patron.bills.prototype = {
                                                                                        }
                                                                                }
                                                                                obj.network.simple_request(
-                                                                                       'MODS_SLIM_RECORD_RETRIEVE_VIA_COPY',
+                                                                                       'MODS_SLIM_RECORD_RETRIEVE.authoritative_VIA_COPY',
                                                                                        [ r_circ.target_copy() ],
                                                                                        function (rreq) {
                                                                                                var r_mvr = rreq.getResultObject();
@@ -1040,7 +1044,7 @@ patron.bills.prototype = {
                        var obj = this;
                        JSAN.use('util.functional');
                        
-                       var mb_list = obj.network.simple_request( 'FM_MB_RETRIEVE_VIA_MBTS_ID', [ ses(), mobts_id ] );
+                       var mb_list = obj.network.simple_request( 'FM_MB_RETRIEVE_VIA_MBTS_ID.authoritative', [ ses(), mobts_id ] );
                        if (typeof mb_list.ilsevent != 'undefined') throw(mb_list);
 
                        mb_list = util.functional.filter_list( mb_list, function(o) { return ! get_bool( o.voided() ) });
@@ -1056,7 +1060,7 @@ patron.bills.prototype = {
                        if (r == 0) {
                                var robj = obj.network.simple_request('FM_MB_VOID',[ses()].concat(util.functional.map_list(mb_list,function(o){return o.id();})));
                                if (robj.ilsevent) {
-                                       switch(robj.ilsevent) {
+                                       switch(Number(robj.ilsevent)) {
                                                default: 
                                                        obj.error.standard_unexpected_error_alert('Error voiding bills.',robj); 
                                                        obj.refresh(); return; 
index 98545c3..42da10e 100644 (file)
@@ -80,6 +80,8 @@
                <command id="cmd_alternate_view" />
        </commandset>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+
        <box id="bills_main" />
 
 </window>
index 014c7d2..c17acfc 100644 (file)
@@ -392,7 +392,7 @@ patron.display.prototype = {
                                                }
 
                                                obj.network.simple_request(
-                                                       'FM_AHR_COUNT_RETRIEVE',
+                                                       'FM_AHR_COUNT_RETRIEVE.authoritative',
                                                        [ ses(), patron.id() ],
                                                        function(req) {
                                                                try {
index f147a7b..4a9361a 100644 (file)
                                                                        );
                                                                break;
                                                                default:
-                                                                       row.my.mvr = g.network.request(
-                                                                               api.MODS_SLIM_RECORD_RETRIEVE.app,
-                                                                               api.MODS_SLIM_RECORD_RETRIEVE.method,
+                                                                       row.my.mvr = g.network.simple_request(
+                                                                               'MODS_SLIM_RECORD_RETRIEVE.authoritative',
                                                                                [ row.my.ahr.target() ]
                                                                        );
                                                                        if (row.my.ahr.current_copy()) {
        ]]>
        </script>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+
        <stack hidden="true" id="notification_template" flex="1">
                <groupbox flex="1" style="background-color: black;"/>
                <groupbox flex="1" style="background-color: #FFDE00; -moz-border-radius-topright: 35px;" >
index ff6f4b0..ceb3ef8 100644 (file)
@@ -23,6 +23,11 @@ patron.holds.prototype = {
 
        'holds_map' : {},
 
+    'flatten_copy' : function(hold) {
+        try { if ( hold.current_copy() && typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('FIXME: Error flattening hold before hold update: ' + E); }
+        return hold;
+    },
+
        'init' : function( params ) {
 
                var obj = this;
@@ -54,13 +59,14 @@ patron.holds.prototype = {
                                'retrieve_row' : function(params) {
                                        var row = params.row;
                                        try {
-                                               obj.network.simple_request('FM_AHR_BLOB_RETRIEVE', [ ses(), row.my.hold_id ],
+                                               obj.network.simple_request('FM_AHR_BLOB_RETRIEVE.authoritative', [ ses(), row.my.hold_id ],
                                                        function(blob_req) {
                                                                try {
                                                                        var blob = blob_req.getResultObject();
                                                                        if (typeof blob.ilsevent != 'undefined') throw(blob);
                                                                        row.my.ahr = blob.hold;
                                                                        row.my.status = blob.status;
+                                    row.my.ahr.status( blob.status );
                                                                        row.my.acp = blob.copy;
                                                                        row.my.acn = blob.volume;
                                                                        row.my.mvr = blob.mvr;
@@ -121,7 +127,8 @@ patron.holds.prototype = {
                                                obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
                                                obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
                                                obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','false');
-                                               obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','false');
+                                               obj.controller.view.cmd_holds_activate.setAttribute('disabled','false');
+                                               obj.controller.view.cmd_holds_suspend.setAttribute('disabled','false');
                                                obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
                                                obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
                                                obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
@@ -137,7 +144,8 @@ patron.holds.prototype = {
                                                obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
                                                obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
                                                obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
-                                               obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','true');
+                                               obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
+                                               obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
                                                obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
                                                obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
                                                obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
@@ -290,7 +298,7 @@ patron.holds.prototype = {
                                                                        for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                                                                var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
                                                                                hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                                                                var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                        }
@@ -307,6 +315,17 @@ patron.holds.prototype = {
                                                function() {
                                                        try {
                                                                JSAN.use('util.widgets'); JSAN.use('util.functional'); 
+                                
+                                var deny_edit_because_of_transit = false;
+                                for (var i = 0; i < obj.retrieve_ids.length; i++) {
+                                    var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
+                                    if (hold.status() > 2 /* Which means holds that are In-Transit or Ready for Pickup */) deny_edit_because_of_transit = true;
+                                }
+                                if (deny_edit_because_of_transit) {
+                                    alert(document.getElementById('circStrings').getString('staff.circ.holds.error.may_not_edit_pickup_lib_for_hold_intransit'));
+                                    return;
+                                }
+
                                                                var list = util.functional.map_list(
                                                                        obj.data.list.aou,
                                                                        function(o) { 
@@ -349,7 +368,7 @@ patron.holds.prototype = {
                                                                        for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                                                                var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
                                                                                hold.pickup_lib(  pickup_lib ); hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                                                                var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                        }
@@ -392,7 +411,7 @@ patron.holds.prototype = {
                                                                        for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                                                                var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
                                                                                hold.phone_notify(  phone ); hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                                                                var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                        }
@@ -434,7 +453,7 @@ patron.holds.prototype = {
                                                                        for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                                                                var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
                                                                                hold.email_notify(  email ); hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                                                                var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                        }
@@ -445,53 +464,90 @@ patron.holds.prototype = {
                                                        }
                                                }
                                        ],
-                    'cmd_holds_edit_freeze' : [
+                    'cmd_holds_suspend' : [
                                                ['command'],
                                                function() {
                                                        try {
-                                                               var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
-                                                               xml += '<description>Freeze or un-freeze these holds?</description>';
-                                                               xml += '<hbox><button value="freeze" label="Freeze" accesskey="F" name="fancy_submit"/>';
-                                                               xml += '<button value="unfreeze" label="Un-Freeze" accesskey="U" name="fancy_submit"/></hbox>';
-                                                               xml += '</vbox>';
-                                                               var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
-                                                               bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
-                                                               netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
-                                                               //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
-                                                               //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
-                                                               JSAN.use('util.window'); var win = new util.window();
-                                                               var fancy_prompt_data = win.open(
-                                                                       urls.XUL_FANCY_PROMPT,
-                                                                       //+ '?xml_in_stash=temp_mid'
-                                                                       //+ '&bottom_xml_in_stash=temp_bot'
-                                                                       //+ '&title=' + window.escape('Set Email Notification for Holds'),
-                                                                       'fancy_prompt', 'chrome,resizable,modal',
-                                                                       { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
-                                                               );
-                                                               if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
-                                                               var freeze = fancy_prompt_data.fancy_submit == 'freeze' ? get_db_true() : get_db_false();
-                                                               var msg = 'Are you sure you would like to ' + ( get_bool( freeze ) ? 'freeze' : 'un-freeze' ) + ' hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
-                                                               var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
+                                var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', '); 
+                                                               var r = obj.error.yns_alert(
+                                    obj.retrieve_ids.length > 1 ?
+                                    document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt.plural',[hold_list]) :
+                                    document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt',[hold_list]),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
+                                    null,
+                                    document.getElementById('commonStrings').getString('common.confirm')
+                                );
                                                                if (r == 0) {
+                                    var already_suspended = [];
                                                                        for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                                                                var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
-                                                                               hold.frozen(  freeze ); 
-                                                                               if ( ! get_bool( freeze ) ) {
-                                                                                       hold.thaw_date( null );
-                                                                               }
+                                        if ( get_bool( hold.frozen() ) ) {
+                                            already_suspended.push( hold.id() );
+                                            continue; 
+                                        }
+                                                                               hold.frozen('t'); 
+                                                                               hold.thaw_date(null);
                                                                                hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                                                                var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                                                                if (typeof robj.ilsevent != 'undefined') throw(robj);
                                                                        }
+                                    if (already_suspended.length == 1) {
+                                        alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended',[already_suspended[0]]) );
+                                    } else if (already_suspended.length > 1) {
+                                        alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended.plural',[already_suspended.join(', ')]) );
+                                    }
                                                                        obj.clear_and_retrieve(true);
                                                                }
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_suspended'),E);
+                                                       }
+                                               }
+                                       ],
+                    'cmd_holds_activate' : [
+                                               ['command'],
+                                               function() {
+                                                       try {
+                                var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', '); 
+                                                               var r = obj.error.yns_alert(
+                                    obj.retrieve_ids.length > 1 ?
+                                    document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt.plural',[hold_list]) :
+                                    document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt',[hold_list]),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
+                                    document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
+                                    null,
+                                    document.getElementById('commonStrings').getString('common.confirm')
+                                );
+                                                               if (r == 0) {
+                                    var already_activated = [];
+                                                                       for (var i = 0; i < obj.retrieve_ids.length; i++) {
+                                                                               var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
+                                        if ( ! get_bool( hold.frozen() ) ) {
+                                            already_activated.push( hold.id() );
+                                            continue; 
+                                        }
+                                                                               hold.frozen('f'); 
+                                                                               hold.thaw_date(null);
+                                                                               hold.ischanged('1');
+                                        hold = obj.flatten_copy(hold);
+                                                                               var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
+                                                                               if (typeof robj.ilsevent != 'undefined') throw(robj);
+                                                                       }
+                                    if (already_activated.length == 1) {
+                                        alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated',[already_activated[0]]) );
+                                    } else if (already_activated.length > 1) {
+                                        alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated.plural',[already_activated.join(', ')]) );
+                                    }
+                                                                       obj.clear_and_retrieve(true);
+                                                               }
+                                                       } catch(E) {
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_activated'),E);
                                                        }
                                                }
                                        ],
-
                     'cmd_holds_edit_thaw_date' : [
                                                ['command'],
                                                function() {
@@ -499,9 +555,9 @@ patron.holds.prototype = {
                                 JSAN.use('util.date');
                                 function check_date(value) {
                                     try {
-                                        if (! util.date.check('YYYY-MM-DD',value) ) { throw('Invalid Date'); }
-                                        if (util.date.check_past('YYYY-MM-DD',value) ) { 
-                                            throw('Thaw date for frozen holds needs to be after today.'); 
+                                        if (! util.date.check('YYYY-MM-DD',value) ) { throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.invalid_date')); }
+                                        if (util.date.check_past('YYYY-MM-DD',value) || util.date.formatted_date(new Date(),'%F') == value ) { 
+                                            throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.too_early.error'));
                                         }
                                         return true;
                                     } catch(E) {
@@ -510,9 +566,12 @@ patron.holds.prototype = {
                                     }
                                 }
 
-                                                               var msg = 'Please enter a thaw date for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '\nOr set to blank to unset the thaw date for these holds.  Frozen holds without a thaw date will remain frozen until manually unfrozen, otherwise they unfreeze on the thaw date.';
+                                var hold_ids = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
+                                                               var msg_singular = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
+                                                               var msg_plural = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
+                                var msg = obj.retrieve_ids.length > 1 ? msg_plural : msg_singular;
                                 var value = 'YYYY-MM-DD';
-                                var title = 'Modifying Holds';
+                                var title = document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds');
                                                                var thaw_date; var invalid = true;
                                 while(invalid) {
                                     thaw_date = window.prompt(msg,value,title);
@@ -525,15 +584,16 @@ patron.holds.prototype = {
                                 if (thaw_date || thaw_date == '') {
                                     for (var i = 0; i < obj.retrieve_ids.length; i++) {
                                         var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
+                                        hold.frozen('t');
                                         hold.thaw_date(  thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
-                                        try { if ( typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('IFXME: Error flattening hold before hold update: ' + E); }
+                                        hold = obj.flatten_copy(hold);
                                         var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
                                         if (typeof robj.ilsevent != 'undefined') throw(robj);
                                     }
                                                                        obj.clear_and_retrieve(true);
                                 }
                                                        } catch(E) {
-                                                               obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
+                                                               obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_modified'),E);
                                                        }
                                                }
                                        ],
@@ -583,7 +643,7 @@ patron.holds.prototype = {
                                                 for (var i = 0; i < transits.length; i++) {
                                                     var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
                                                     if (typeof robj.ilsevent != 'undefined') {
-                                                        switch(robj.ilsevent) {
+                                                        switch(Number(robj.ilsevent)) {
                                                             case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
                                                                 alert(robj.desc);
                                                             break;
@@ -642,7 +702,7 @@ patron.holds.prototype = {
                                                                                        opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
                                                                                break;
                                                                                case 'V' :
-                                                                                       var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ htarget ]);
+                                                                                       var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', [ htarget ]);
                                                                                        opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
                                                                                break;
                                                                                case 'C' :
@@ -651,7 +711,7 @@ patron.holds.prototype = {
                                                                                        if (typeof my_acp.call_number() == 'object') {
                                                                                                my_acn = my.acp.call_number();
                                                                                        } else {
-                                                                                               my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', 
+                                                                                               my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', 
                                                                                                        [ my_acp.call_number() ]);
                                                                                        }
                                                                                        opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
@@ -681,7 +741,7 @@ patron.holds.prototype = {
                         ['command'],
                         function() {
                             obj.pull_from_shelf_interface.current.offset += obj.pull_from_shelf_interface.current.limit;
-                            obj.retrieve();
+                            obj.retrieve(true);
                         }
                     ],
                     'lib_filter_checkbox' : [
@@ -733,14 +793,15 @@ patron.holds.prototype = {
                     if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = true;
                 }
                 obj.controller.render();
-                obj.retrieve();
+                obj.retrieve(true);
 
                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
                                obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
-                               obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','true');
+                               obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
+                               obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
@@ -779,7 +840,7 @@ patron.holds.prototype = {
                        var method; var params = [ ses() ];
             switch(obj.hold_interface_type) {
                 case 'patron' :
-                                   method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU'; 
+                                   method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU.authoritative'; 
                                params.push( obj.patron_id ); 
                                obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
                 break;
index bf561dd..baddc14 100644 (file)
@@ -50,7 +50,7 @@
                                                'pull' : xul_param('pull'),
                                        } 
                                );
-                               window.refresh = function(p) { g.holds.retrieve(p); }
+                               window.refresh = function(p) { g.holds.list.clear(); g.holds.retrieve(p); }
 
                                default_focus();
 
@@ -67,6 +67,8 @@
        ]]>
        </script>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+
        <commandset id="holds_cmds">
                <command id="sel_mark_items_damaged" disabled="true"/>
                <command id="sel_mark_items_missing" disabled="true"/>
@@ -82,8 +84,9 @@
                <command id="cmd_holds_edit_phone_notify" />
                <command id="cmd_holds_edit_email_notify" />
                <command id="cmd_holds_edit_thaw_date" />
-               <command id="cmd_holds_edit_freeze" />
-               <command id="cmd_holds_edit_selection_depth" disabled="true" hidden="true"/>
+               <command id="cmd_holds_activate" />
+               <command id="cmd_holds_suspend" />
+               <command id="cmd_holds_edit_selection_depth" />
                <command id="cmd_broken" disabled="true" hidden="true"/>
                <command id="cmd_holds_retarget"/>
                <command id="cmd_holds_cancel" />
index 3911ffe..85198be 100644 (file)
 
 <popupset id="holds_popupset">
        <popup id="holds_actions" position="at_pointer"> 
-               <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-               <menuitem label="Show in Catalog" command="cmd_show_catalog" accesskey="S"/>
-               <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-               <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+               <menuitem command="sel_clip" label="&staff.circ.holds.copy_to_clipboard;" accesskey="&staff.circ.holds.copy_to_clipboard.accesskey;" />
+               <menuitem label="&staff.circ.holds.show_in_catalog;" command="cmd_show_catalog" accesskey="&staff.circ.holds.show_in_catalog.accesskey;"/>
+               <menuitem command="sel_copy_details" label="&staff.circ.holds.show_item_details;" accesskey="&staff.circ.holds.show_item_details.accesskey;" />
+               <menuitem command="sel_patron" label="&staff.circ.holds.show_last_few_circulations;" accesskey="&staff.circ.holds.show_last_few_circulations.accesskey;"/>
                <menuseparator />
-               <menuitem label="Retrieve Patron" command="cmd_retrieve_patron" accesskey="P"/>
-               <menuitem label="Show Notices" command="cmd_show_notifications" accesskey="N" />
+               <menuitem label="&staff.circ.holds.retrieve_patron;" command="cmd_retrieve_patron" accesskey="&staff.circ.holds.retrieve_patron.accesskey;"/>
+               <menuitem label="&staff.circ.holds.show_notices;" command="cmd_show_notifications" accesskey="&staff.circ.holds.show_notices.accesskey;" />
                <menuseparator />
-               <menuitem label="Edit Pickup Library" command="cmd_holds_edit_pickup_lib" accesskey="L"/>
-               <menuitem label="Edit Phone Notification" command="cmd_holds_edit_phone_notify" accesskey="P"/>
-               <menuitem label="Set Email Notification" command="cmd_holds_edit_email_notify" accesskey="E"/>
-               <menuitem label="Edit Thaw Date" command="cmd_holds_edit_thaw_date" accesskey="T"/>
-               <menuitem label="Set Freeze" command="cmd_holds_edit_freeze" accesskey="F"/>
-               <!--
-               <menuitem label="Edit Hold Range" command="cmd_holds_edit_selection_depth" accesskey="R"/>
-               <menuitem label="Edit Hold Focus" command="cmd_broken" accesskey="F"/>
-               -->
+               <menuitem label="&staff.circ.holds.edit_pickup_library;" command="cmd_holds_edit_pickup_lib" accesskey="&staff.circ.holds.edit_pickup_library.accesskey;"/>
+               <menuitem label="&staff.circ.holds.edit_phone_notification;" command="cmd_holds_edit_phone_notify" accesskey="&staff.circ.holds.edit_phone_notification.accesskey;"/>
+               <menuitem label="&staff.circ.holds.set_email_notification;" command="cmd_holds_edit_email_notify" accesskey="&staff.circ.holds.set_email_notification.accesskey;"/>
+               <menuitem label="&staff.circ.holds.edit_activation_date;" command="cmd_holds_edit_thaw_date" accesskey="&staff.circ.holds.edit_activation_date;"/>
+               <menuitem label="&staff.circ.holds.activate_hold;" command="cmd_holds_activate" accesskey="&staff.circ.holds.activate_hold.accesskey;"/>
+               <menuitem label="&staff.circ.holds.suspend_hold;" command="cmd_holds_suspend" accesskey="&staff.circ.holds.suspend_hold.accesskey;"/>
+               <menuitem label="&staff.circ.holds.edit_hold_range;" class="edit_hold_range" command="cmd_holds_edit_selection_depth" accesskey="&staff.circ.holds.edit_hold_range.accesskey;"/>
+               <menuitem label="&staff.circ.holds.edit_hold_focus;" class="edit_hold_focus" command="cmd_broken" accesskey="&staff.circ.holds.edit_hold_focus.accesskey;"/>
                <menuseparator />
-               <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-               <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="M"/>
-               <menuitem label="Find Another Target" command="cmd_holds_retarget" accesskey="T"/>
-               <menuitem label="Cancel Hold" command="cmd_holds_cancel" accesskey="C"/>
+               <menuitem command="sel_mark_items_damaged" label="&staff.circ.holds.mark_item_damaged;" accesskey="&staff.circ.holds.mark_item_damaged.accesskey;"/>
+               <menuitem command="sel_mark_items_missing" label="&staff.circ.holds.mark_item_missing;" accesskey="&staff.circ.holds.mark_item_missing.accesskey;"/>
+               <menuitem label="&staff.circ.holds.retarget;" command="cmd_holds_retarget" accesskey="&staff.circ.holds.retarget.accesskey;"/>
+               <menuitem label="&staff.circ.holds.cancel;" command="cmd_holds_cancel" accesskey="&staff.circ.holds.cancel.accesskey;"/>
                <menuseparator />
-               <menuitem command="save_columns" label="Save Columns"/>
+               <menuitem command="save_columns" label="&staff.circ.holds.save_columns;" accesskey="&staff.circ.holds.save_columns.accesskey;"/>
        </popup>
 </popupset>
 
     <menubar>
         <menu label="Actions for Selected Holds" accesskey="S">
             <menupopup>
-                <menuitem command="sel_clip" label="Copy to Clipboard" accesskey="C" />
-                <menuitem label="Show in Catalog" command="cmd_show_catalog"  accesskey="S"/>
-                <menuitem command="sel_copy_details" label="Show Item Details" accesskey="I" />
-                <menuitem command="sel_patron" label="Show Last Few Circulations" accesskey="L"/>
+                <menuitem command="sel_clip" label="&staff.circ.holds.copy_to_clipboard;" accesskey="&staff.circ.holds.copy_to_clipboard.accesskey;" />
+                <menuitem label="&staff.circ.holds.show_in_catalog;" command="cmd_show_catalog" accesskey="&staff.circ.holds.show_in_catalog.accesskey;"/>
+                <menuitem command="sel_copy_details" label="&staff.circ.holds.show_item_details;" accesskey="&staff.circ.holds.show_item_details.accesskey;" />
+                <menuitem command="sel_patron" label="&staff.circ.holds.show_last_few_circulations;" accesskey="&staff.circ.holds.show_last_few_circulations.accesskey;"/>
                 <menuseparator />
-                <menuitem label="Retrieve Patron" command="cmd_retrieve_patron" accesskey="P"/>
-                <menuitem label="Show Notices" command="cmd_show_notifications" accesskey="N" />
+                <menuitem label="&staff.circ.holds.retrieve_patron;" command="cmd_retrieve_patron" accesskey="&staff.circ.holds.retrieve_patron.accesskey;"/>
+                <menuitem label="&staff.circ.holds.show_notices;" command="cmd_show_notifications" accesskey="&staff.circ.holds.show_notices.accesskey;" />
                 <menuseparator />
-                <menuitem label="Edit Pickup Library" command="cmd_holds_edit_pickup_lib" accesskey="L"/>
-                <menuitem label="Edit Phone Notification" command="cmd_holds_edit_phone_notify" accesskey="P"/>
-                <menuitem label="Set Email Notification" command="cmd_holds_edit_email_notify" accesskey="E" />
-                <menuitem label="Edit Thaw Date" command="cmd_holds_edit_thaw_date" accesskey="T"/>
-                <menuitem label="Set Freeze" command="cmd_holds_edit_freeze" accesskey="F"/>
-                <!--
-                <menuitem label="Edit Hold Range" command="cmd_holds_edit_selection_depth" accesskey="R" />
-                <menuitem label="Edit Hold Focus" command="cmd_broken" accesskey="F" />
-                -->
+                <menuitem label="&staff.circ.holds.edit_pickup_library;" command="cmd_holds_edit_pickup_lib" accesskey="&staff.circ.holds.edit_pickup_library.accesskey;"/>
+                <menuitem label="&staff.circ.holds.edit_phone_notification;" command="cmd_holds_edit_phone_notify" accesskey="&staff.circ.holds.edit_phone_notification.accesskey;"/>
+                <menuitem label="&staff.circ.holds.set_email_notification;" command="cmd_holds_edit_email_notify" accesskey="&staff.circ.holds.set_email_notification.accesskey;"/>
+                <menuitem label="&staff.circ.holds.edit_activation_date;" command="cmd_holds_edit_thaw_date" accesskey="&staff.circ.holds.edit_activation_date;"/>
+                <menuitem label="&staff.circ.holds.activate_hold;" command="cmd_holds_activate" accesskey="&staff.circ.holds.activate_hold.accesskey;"/>
+                <menuitem label="&staff.circ.holds.suspend_hold;" command="cmd_holds_suspend" accesskey="&staff.circ.holds.suspend_hold.accesskey;"/>
+                <menuitem label="&staff.circ.holds.edit_hold_range;" class="edit_hold_range" command="cmd_holds_edit_selection_depth" accesskey="&staff.circ.holds.edit_hold_range.accesskey;"/>
+                <menuitem label="&staff.circ.holds.edit_hold_focus;" class="edit_hold_focus" command="cmd_broken" accesskey="&staff.circ.holds.edit_hold_focus.accesskey;"/>
                 <menuseparator />
-                <menuitem command="sel_mark_items_damaged" label="Mark Item Damaged" accesskey="D"/>
-                <menuitem command="sel_mark_items_missing" label="Mark Item Missing" accesskey="M"/>
-                <menuitem label="Find Another Target" command="cmd_holds_retarget" accesskey="T"/>
-                <menuitem label="Cancel Hold" command="cmd_holds_cancel"  accesskey="C"/>
+                <menuitem command="sel_mark_items_damaged" label="&staff.circ.holds.mark_item_damaged;" accesskey="&staff.circ.holds.mark_item_damaged.accesskey;"/>
+                <menuitem command="sel_mark_items_missing" label="&staff.circ.holds.mark_item_missing;" accesskey="&staff.circ.holds.mark_item_missing.accesskey;"/>
+                <menuitem label="&staff.circ.holds.retarget;" command="cmd_holds_retarget" accesskey="&staff.circ.holds.retarget.accesskey;"/>
+                <menuitem label="&staff.circ.holds.cancel;" command="cmd_holds_cancel" accesskey="&staff.circ.holds.cancel.accesskey;"/>
                 <menuseparator />
-                <menuitem command="save_columns" label="Save Columns"/>
+                <menuitem command="save_columns" label="&staff.circ.holds.save_columns;" accesskey="&staff.circ.holds.save_columns.accesskey;"/>
             </menupopup>
         </menu>
     </menubar>
index 7bf2d04..a08b8e8 100644 (file)
@@ -45,7 +45,7 @@
 
                                JSAN.use('util.error'); g.error = new util.error();
                                JSAN.use('util.network'); g.network = new util.network();
-                               JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util');
+                               JSAN.use('util.date'); JSAN.use('util.money'); 
                                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
 
                                g.error.sdump('D_TRACE','my_init() for patron_info.xul');
index 1bc5700..277eaa5 100644 (file)
@@ -67,7 +67,6 @@
                                g.OpenILS.data = new OpenILS.data(); g.OpenILS.data.init({'via':'stash'});
 
                                JSAN.use('util.list'); g.list = new util.list('patron_list');
-                               function getString(s) { return g.OpenILS.data.entities[s]; }
 
                                JSAN.use('patron.util');
                                var columns = patron.util.columns(
                                var p = patron.util.retrieve_au_via_id(ses(),g.patron_id);
                                if ((p == null) || (typeof p.ilsevent != 'undefined') ) throw(p);
                                var robj = g.network.simple_request(
-                                       'FM_AU_LIST_RETRIEVE_VIA_GROUP',
+                                       'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative',
                                        [ ses(), p.usrgroup() ]
                                );
                                if ((robj == null) || (typeof robj.ilsevent != 'undefined') ) throw(robj);
                </popup>
        </popupset>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+
        <vbox flex="1" class="my_overflow" id="group_panel">
                <groupbox flex="1">
                        <caption label="Group Members"/>
index 6f735fa..dd20308 100644 (file)
 
                function retrieve_notes() {
                        if (g.new_note) {
-                               g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
+                               g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
                                g.new_note = false;
                        } else {
-                               g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
+                               g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
                        }
                }
 
index 83c4a60..426e704 100644 (file)
@@ -43,7 +43,7 @@
 
                                JSAN.use('util.error'); g.error = new util.error();
                                JSAN.use('util.network'); g.network = new util.network();
-                               JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util'); JSAN.use('util.functional');
+                               JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('util.functional');
                                JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
 
                                g.error.sdump('D_TRACE','my_init() for patron_info_surveys.xul');
index deef6ec..04f1443 100644 (file)
@@ -140,7 +140,7 @@ patron.items.prototype = {
        'show_noncats' : function() {
                var obj = this; var checkout = {};
                try {
-                       var robj = obj.network.simple_request('FM_ANCC_RETRIEVE_VIA_USER',[ ses(), obj.patron_id ]);
+                       var robj = obj.network.simple_request('FM_ANCC_RETRIEVE_VIA_USER.authoritative',[ ses(), obj.patron_id ]);
                        if (typeof robj.ilsevent != 'undefined') throw(robj);
 
                        for (var ii = 0; ii < robj.length; ii++) {
@@ -375,8 +375,16 @@ patron.items.prototype = {
                                var barcode = retrieve_ids[i].barcode;
                                dump('Mark barcode lost = ' + barcode);
                                var robj = obj.network.simple_request( 'MARK_ITEM_LOST', [ ses(), { barcode: barcode } ]);
-                               if (typeof robj.ilsevent != 'undefined') { if (robj.ilsevent != 0) throw(robj); }
-                               obj.refresh(retrieve_ids[i].circ_id);
+                               if (typeof robj.ilsevent != 'undefined') { 
+                    switch(Number(robj.ilsevent)) {
+                        case 7018 /* COPY_MARKED_LOST */ :
+                            alert( 'Item Barcode ' + barcode + '\n' + robj.desc );
+                        break;
+                        default: throw(robj);
+                    }
+                } else {
+                               obj.refresh(retrieve_ids[i].circ_id,true);
+                }
                        }
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('The items were not likely marked lost.',E);
@@ -433,7 +441,7 @@ patron.items.prototype = {
                                        if (typeof robj.ilsevent != 'undefined') { if (robj.ilsevent != 0) throw(robj); }
                                }
                        }
-                       for (var i = 0; i < retrieve_ids.length; i++) obj.refresh(retrieve_ids[i].circ_id);
+                       for (var i = 0; i < retrieve_ids.length; i++) obj.refresh(retrieve_ids[i].circ_id,true);
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('The items were not likely marked Claimed Returned.',E);
                }
@@ -456,8 +464,8 @@ patron.items.prototype = {
                                        ses(), { 'copy_id' : copy_id }
                                );
                                /* circ.util.checkin_via_barcode handles errors currently */
-                               obj.refresh(retrieve_ids[i].circ_id);
                        }
+                       obj.retrieve();
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('Checkin probably did not happen.',E);
                }
@@ -552,7 +560,7 @@ patron.items.prototype = {
     
                        if (!row.my.circ) {
                                obj.network.simple_request(
-                                       'FM_CIRC_DETAILS',
+                                       'FM_CIRC_DETAILS.authoritative',
                                        [ row.my.circ_id ],
                                        function(req) {
                                                try { 
@@ -582,7 +590,7 @@ patron.items.prototype = {
                                                                params.on_retrieve(row);
                                                        }
                                                } catch(E) {
-                                                       obj.error.standard_unexpected_error_alert('Error in callback for FM_CIRC_DETAILS in patron/items.js',E);
+                                                       obj.error.standard_unexpected_error_alert('Error in callback for FM_CIRC_DETAILS.authoritative in patron/items.js',E);
                                                }
                                        }
                                );
@@ -660,19 +668,25 @@ patron.items.prototype = {
                );
        },
 
-       'refresh' : function(circ_id) {
+       'refresh' : function(circ_id,move_to_bottom_list) {
                var obj = this;
                try {
                        var nparams = obj.list_circ_map[circ_id];
-                       var which_list = nparams.which_list;
-                       switch(which_list) {
-                               case 1: case '1':
-                                       setTimeout(function(){try{obj.list2.refresh_row(nparams);}catch(E){obj.error.standard_unexpected_error_alert('2 Error refreshing row in list\ncirc_id = ' + circ_id + '\nnparams = ' + nparams,E);}},1000);
-                                       break;
-                               default:
-                                       setTimeout(function(){try{obj.list.refresh_row(nparams);}catch(E){obj.error.standard_unexpected_error_alert('2 Error refreshing row in list\ncirc_id = ' + circ_id + '\nnparams = ' + nparams,E);}},1000);
-                                       break;
-                       }
+            if (move_to_bottom_list) { 
+                obj.list_circ_map[circ_id].my_node.setAttribute('hidden','true');
+                               var nparams2 = obj.list2.append( { 'row' : { 'my' : { 'circ_id' : circ_id } },  'to_bottom' : true, 'which_list' : 1 } );
+                               obj.list_circ_map[circ_id] = nparams2; 
+            } else {
+                       var which_list = nparams.which_list;
+                switch(which_list) {
+                    case 1: case '1':
+                        setTimeout(function(){try{obj.list2.refresh_row(nparams);}catch(E){obj.error.standard_unexpected_error_alert('2 Error refreshing row in list\ncirc_id = ' + circ_id + '\nnparams = ' + nparams,E);}},1000);
+                        break;
+                    default:
+                        setTimeout(function(){try{obj.list.refresh_row(nparams);}catch(E){obj.error.standard_unexpected_error_alert('2 Error refreshing row in list\ncirc_id = ' + circ_id + '\nnparams = ' + nparams,E);}},1000);
+                        break;
+                }
+            }
                } catch(E) {
                        obj.error.standard_unexpected_error_alert('Error refreshing row in list\ncirc_id = ' + circ_id + '\nnparams = ' + nparams,E);
                }
@@ -686,7 +700,7 @@ patron.items.prototype = {
                        obj.checkouts = [];
                        obj.checkouts2 = [];
                        var robj = obj.network.simple_request(
-                               'FM_CIRC_RETRIEVE_VIA_USER',
+                               'FM_CIRC_RETRIEVE_VIA_USER.authoritative',
                                [ ses(), obj.patron_id ]
                        );
                        if (typeof robj.ilsevent!='undefined') {
@@ -699,7 +713,7 @@ patron.items.prototype = {
                                obj.checkouts2 = obj.checkouts2.concat( robj.long_overdue );
                        }
                        var robj = obj.network.simple_request(
-                               'FM_CIRC_IN_WITH_FINES_VIA_USER',
+                               'FM_CIRC_IN_WITH_FINES_VIA_USER.authoritative',
                                [ ses(), obj.patron_id ]
                        );
                        if (typeof robj.ilsevent!='undefined') {
index 77c20ff..4a8ce3c 100644 (file)
@@ -65,6 +65,8 @@
        ]]>
        </script>
 
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
+
        <commandset id="items_cmds">
                <command id="save_columns" />
                <command id="sel_bucket" disabled="true"/>
index 81fa90c..3ac8d09 100644 (file)
@@ -65,7 +65,7 @@
        </groupbox>
        <splitter><grippy/></splitter>
        <groupbox flex="1">
-               <caption label="Lost / Claimed Returned / Long Overdue" />
+               <caption label="&staff.patron_navbar.items.problem_items.caption;" />
                <vbox flex="0">
                        <hbox id="items_top_ui2" />
                </vbox>
index ff472ea..d2698d7 100644 (file)
@@ -22,7 +22,6 @@ patron.search_result.prototype = {
                obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
 
                JSAN.use('util.list'); obj.list = new util.list('patron_list');
-               function getString(s) { return obj.OpenILS.data.entities[s]; }
 
                JSAN.use('patron.util');
                var columns = patron.util.columns(
index 6a977ee..dda5d0f 100644 (file)
@@ -80,6 +80,8 @@
                <command id="cmd_save_cols" />
        </commandset>
 
+    <messagecatalog id="commonStrings" src="/xul/server/locale/<!--#echo var='locale'-->/common.properties"/>
+
        <box id="patron_search_result_main" />
 
 </window>
index 6c83512..6ba1747 100644 (file)
@@ -128,7 +128,7 @@ patron.summary.prototype = {
                                                        return function() { 
                                                                e.setAttribute('value','...');
                                                                obj.network.simple_request(
-                                                                       'FM_MOUS_RETRIEVE',
+                                                                       'FM_MOUS_RETRIEVE.authoritative',
                                                                        [ ses(), obj.patron.id() ],
                                                                        function(req) {
                                                                                JSAN.use('util.money');
@@ -138,7 +138,7 @@ patron.summary.prototype = {
                                                                );
                                                                /*
                                                                obj.network.simple_request(
-                                                                       'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE',
+                                                                       'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE.authoritative',
                                                                        [ ses(), obj.patron.id() ],
                                                                        function(req) {
                                                                                JSAN.use('util.money');
@@ -149,7 +149,7 @@ patron.summary.prototype = {
                                                                                }
                                                                                var sum = 0;
                                                                                for (var i = 0; i < list.length; i++) {
-                                                                                       var robj = typeof list[i] == 'object' ? list[i] : obj.network.simple_request('FM_MBTS_RETRIEVE',[ses(),list[i]]);
+                                                                                       var robj = typeof list[i] == 'object' ? list[i] : obj.network.simple_request('FM_MBTS_RETRIEVE.authoritative',[ses(),list[i]]);
                                                                                        sum += util.money.dollars_float_to_cents_integer( robj.balance_owed() );
                                                                                } 
                                                                                if (sum > 0) addCSSClass(document.documentElement,'PATRON_HAS_BILLS');
@@ -172,7 +172,7 @@ patron.summary.prototype = {
                                                                var e5 = document.getElementById( 'patron_lost' ); if (e5) e5.setAttribute('value','...');
                                                                var e6 = document.getElementById( 'patron_noncat' ); if (e6) e6.setAttribute('value','...');
                                                                obj.network.simple_request(
-                                                                       'FM_CIRC_COUNT_RETRIEVE_VIA_USER',
+                                                                       'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',
                                                                        [ ses(), obj.patron.id() ],
                                                                        function(req) {
                                                                                try {
@@ -188,7 +188,7 @@ patron.summary.prototype = {
                                                                        }
                                                                );
                                                                obj.network.simple_request(
-                                                                       'FM_ANCC_RETRIEVE_VIA_USER',
+                                                                       'FM_ANCC_RETRIEVE_VIA_USER.authoritative',
                                                                        [ ses(), obj.patron.id() ],
                                                                        function(req) {
                                                                                var robj = req.getResultObject();
@@ -214,7 +214,7 @@ patron.summary.prototype = {
                                                                var e2 = document.getElementById('patron_holds_available');
                                                                if (e2) e2.setAttribute('value','...');
                                                                obj.network.simple_request(
-                                                                       'FM_AHR_COUNT_RETRIEVE',
+                                                                       'FM_AHR_COUNT_RETRIEVE.authoritative',
                                                                        [ ses(), obj.patron.id() ],
                                                                        function(req) {
                                                                                e.setAttribute('value',
@@ -572,7 +572,7 @@ patron.summary.prototype = {
                                                var robj;
                                                if (obj.barcode && obj.barcode != 'null') {
                                                        robj = obj.network.simple_request(
-                                                               'FM_AU_RETRIEVE_VIA_BARCODE',
+                                                               'FM_AU_RETRIEVE_VIA_BARCODE.authoritative',
                                                                [ ses(), obj.barcode ]
                                                        );
                                                } else if (obj.id && obj.id != 'null') {
index 2e0d23e..d19e483 100644 (file)
                <row id="pdsgr0">
                        <label id="PatronSummaryContact_library_card_label" class="text_left card label"
                                value="&staff.patron_display.library_card.label;"/>
-                       <label id="patron_card" class="card value" style="text-decoration: underline; color: blue; -moz-user-focus: normal;" onclick="copy_to_clipboard(event)"/>
+                       <label id="patron_card" class="card value" style="text-decoration: underline; color: blue; -moz-user-focus: normal;" onclick="try { copy_to_clipboard(event); } catch(E) { alert(E); }"/>
                        <!--<textbox id="patron_card" class="plain" readonly="true" onclick="this.select()"/>-->
                </row>
                <row id="pdsgr1">
diff --git a/Open-ILS/xul/staff_client/server/patron/take_survey.js b/Open-ILS/xul/staff_client/server/patron/take_survey.js
deleted file mode 100644 (file)
index 13c6f31..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-var cgi;
-var orgTree;
-var responses = {};
-var survey_user;
-
-
-function save_responses (root) {
-
-       try {
-
-               var res = [];
-               for (var i in responses) {
-                       if (!i) continue;
-                       for (var j in responses[i]) {
-                               if (!j) continue;
-                               var r = new asvr();
-                               r.usr(survey_user);
-                               r.survey(i);
-                               r.question(j);
-                               r.answer(responses[i][j]);
-                               r.answer_date( findNodeByName(root,'effective_date').value );
-                               res.push(r);
-                       }
-               }
-
-               responses = {};
-
-               var meth = 'open-ils.circ.survey.submit.anon';
-               if (survey_user) meth = 'open-ils.circ.survey.submit.user_id';
-
-               var req = new RemoteRequest( 'open-ils.circ', meth, res );
-               req.send(true);
-               var ok = req.getResultObject();
-
-               if (ok) {
-                       alert('Survey response successfully saved!');
-               }
-
-       } catch (e) {
-               alert(e)
-       };
-
-       return false;
-}
-
-function init_survey (root, s_id, usr_id) {
-       
-       var x = findNodeByName(root,'editor');
-
-       survey_user = usr_id;
-
-       cgi = new CGI();
-       var adv = cgi.param('adv');
-
-       if (!s_id) {
-               alert('No survey id passed in!');
-               return false;
-       }
-
-       if (findNodeByName(root,'save_response')) {
-               findNodeByName(root,'save_response')
-                       .setAttribute(
-                               'onclick',
-                               "save_responses(document.getElementById('" + root.id + "')); return false;"
-                       );
-       }
-
-       var today = new Date()
-       var month = today.getMonth() + 1
-       var day = today.getDate()
-       var year = today.getFullYear()
-       var s = "-"
-       if (findNodeByName(root,'effective_date')) {
-               findNodeByName(root,'effective_date').value = '%04d%s%02d%s%02d'.sprintf(year,s,month,s,day);
-               findNodeByName(root,'effective_date').id = 'e_date_' + s_id;
-       }
-
-
-       if (adv) {
-               findNodeByName(root,'effective_date').parentNode.parentNode.setAttribute('adv','false');
-       }
-
-       var req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.fleshed.retrieve', s_id );
-       req.send(true);
-       sur = req.getResultObject();
-
-
-
-       if (findNodeByName(x,'sur.name'))
-               findNodeByName(x,'sur.name').appendChild( text( sur.name() ) );
-
-       if (findNodeByName(x,'sur.description'))
-               findNodeByName(x,'sur.description').appendChild( text( sur.description() ) );
-
-       if (findNodeByName(x,'sur.start_date'))
-               findNodeByName(x,'sur.start_date').appendChild( text( sur.start_date() ) );
-
-       if (findNodeByName(x,'sur.end_date'))
-               findNodeByName(x,'sur.end_date').appendChild( text( sur.end_date() ) );
-
-       q_tmpl = findNodeByName(root,'question-tmpl').getElementsByTagName('table')[0];
-
-       x = findNodeByName(x,'questions');
-       for (var i in sur.questions()) {
-               var q = sur.questions()[i];
-               var new_q = q_tmpl.cloneNode(true);
-               x.appendChild(new_q);
-
-               findNodeByName(new_q,'q.question').appendChild( text( q.question() ) );
-
-               var sel = findNodeByName(new_q,'answers-sel');
-               sel.options[0] = new Option('-- Select one --');
-
-               var rad = findNodeByName(new_q,'answers-rad');
-
-               if (!sur.poll()) {
-                       sel.className = '';
-                       for (var j in q.answers()) {
-                               var a = q.answers()[j];
-                               var opt = new Option(a.answer());
-
-                               opt.setAttribute('answer', a.id());
-                               opt.setAttribute('question', q.id());
-                               opt.setAttribute('survey', sur.id());
-
-                               sel.options[sel.options.length] = opt;
-                       }
-               } else {
-                       rad.parentNode.className = 'rad-value';
-                       for (var j in q.answers()) {
-                               var a = q.answers()[j];
-
-                               var opt = rad.cloneNode(true);
-                               opt.className = '';
-
-                               opt.firstChild.setAttribute('name','res_' + i );
-                               opt.firstChild.setAttribute('answer', a.id());
-                               opt.firstChild.setAttribute('question', q.id());
-                               opt.firstChild.setAttribute('survey', sur.id());
-
-                               opt.appendChild(text(a.answer()));
-                               rad.parentNode.appendChild(opt);
-                       }
-               }
-       }
-
-       return true;
-}
-
-function update_response (sel) {
-       var opt = sel.options[sel.selectedIndex];
-       if (!responses[opt.getAttribute('survey')])
-               responses[opt.getAttribute('survey')] = {};
-
-       responses[opt.getAttribute('survey')][opt.getAttribute('question')] = opt.getAttribute('answer');
-}
-function update_response_rad (opt) {
-       if (!responses[opt.getAttribute('survey')])
-               responses[opt.getAttribute('survey')] = {};
-
-       responses[opt.getAttribute('survey')][opt.getAttribute('question')] = opt.getAttribute('answer');
-}
-
index 172124a..6b63f0d 100644 (file)
@@ -52,12 +52,12 @@ var barredAlerted = false;
 
 function uEditUsrnameBlur(field) {
        var usrname = uEditNodeVal(field);
-       if(!usrname) return;
+       if (!usrname) { return; }
        var req = new Request(CHECK_USERNAME, SESSION, usrname);
        req.callback( 
                function(r) {
                        var res = r.getResultObject();
-                       if( res && res != patron.id() ) {
+                       if( res !== null && res != patron.id() ) {
                                field.widget.onblur = null; /* prevent alert storm */
                                alertId('ue_dup_username');
                                field.widget.onblur = uEditUsrnameBlur;
@@ -81,7 +81,7 @@ function uEditBarcodeBlur(field) {
        req.callback( 
                function(r) {
                        var res = r.getResultObject();
-                       if( res && res != patron.id() ) {
+                       if( res == 1 ) {
                                field.widget.onblur = null; /* prevent alert storm */
                                alertId('ue_dup_barcode');
                                field.widget.onblur = uEditBarcodeBlur;
index 9f78774..32a64e4 100644 (file)
@@ -286,6 +286,8 @@ function grep ( code, list ) {
 
 function trim_ou_tree (tree, list) {
        for (var i in tree) {
+               if (!tree[i]) continue;
+
                var type = grep( function(x) {return x.id() == tree[i].ou_type()}, ou_type_list )[0];
                if ( type && type.can_have_users() == 't' )
                        list.push(tree[i]);
index 2b5411f..773e696 100644 (file)
@@ -18,7 +18,6 @@
                 <script language='javascript' src='/opac/common/js/init.js'> </script>
                 <script language='javascript' src='/opac/common/js/RemoteRequest.js'> </script>
                 <script language='javascript' src='/opac/common/js/sprintf.js'> </script>
-               <script language='javascript' src='take_survey.js'> </script>
                 <script language='javascript' src='user_edit.js'> </script>
 
 
diff --git a/Open-ILS/xul/staff_client/server/patron/user_editor.js b/Open-ILS/xul/staff_client/server/patron/user_editor.js
deleted file mode 100644 (file)
index 8127b32..0000000
+++ /dev/null
@@ -1,1170 +0,0 @@
-
-var cgi                                                        = null;
-var patron                                             = null;
-var advanced                                   = false;
-var SC_FETCH_ALL                               = 'open-ils.circ:open-ils.circ.stat_cat.actor.retrieve.all';
-var SC_CREATE_MAP                              = 'open-ils.circ:open-ils.circ.stat_cat.actor.user_map.create';
-var SV_FETCH_ALL                               = 'open-ils.circ:open-ils.circ.survey.retrieve.all';
-var FETCH_ID_TYPES                     = 'open-ils.actor:open-ils.actor.user.ident_types.retrieve';
-var FETCH_GROUPS                               = 'open-ils.actor:open-ils.actor.groups.tree.retrieve';
-var UPDATE_PATRON                              = 'open-ils.actor:open-ils.actor.patron.update';
-var identTypes                                 = {};
-var groupTree                                  = null;
-var cachedSurveys                              = {};
-var cachedSurveyQuestions      = {};
-var cachedSurveyAnswers                = {};
-var ERRORS                                             = ""; /* global set of errors */
-var cachedStatCats                     = {};
-var deletedStatCats                    = {};
-var cachedAddresses                    = {};
-var deletedAddresses                   = {};
-var defaultState                               = 'GA';
-
-/* if they don't have these perms, they shouldn't be here */
-//var myPerms = [ 'CREATE_USER', 'UPDATE_USER', 'CREATE_PATRON_STAT_CAT_ENTRY_MAP' ];
-
-var pages              = [ 
-       'uedit_userid', 
-       'uedit_contact_info', 
-       'uedit_addresses', 
-       'uedit_groups', 
-       'uedit_stat_cats', 
-       'uedit_surveys',
-       'uedit_finalize',
-       ];
-
-/* ID's of objects that should be focused when their page is made visible */
-var pageFocus  = [
-       'ue_barcode',
-       'ue_email1',
-       'ue_addr_label_1',
-       'ue_profile',
-       'ue_stat_cat_selector_1',
-       'ue_survey_selector_1',
-       'ue_view_summary'
-];
-
-var regexes            = {};
-regexes.phone  = /\d{3}-\d{3}-\d{4}/;
-regexes.email  = /.+\@.+\..+/;
-regexes.date   = /^\d{4}-\d{2}-\d{2}/;
-regexes.isnum  = /^\d+$/;
-
-
-/* fetch the necessary data to start off */
-function uEditInit() {
-
-       cgi             = new CGI();
-       session = cgi.param('ses');
-       if(cgi.param('adv')) advanced = true 
-       if(!session) throw "User session is not defined";
-
-
-       fetchUser(session);
-       $('uedit_user').appendChild(text(USER.usrname()));
-       uEditShowPage('uedit_userid');
-
-       setTimeout( 
-               function() { 
-
-                       /* these can be asynch */
-                       /*fetchHighestPermOrgs( SESSION, USER.id(), myPerms );*/
-                       uEditFetchSurveys();
-
-                       /* these have to be synchronous */
-                       uEditBuildLibSelector();
-                       uEditFetchIDTypes();
-                       uEditBuildAddrs();
-                       uEditFetchGroups();
-                       uEditFetchStatCats();
-
-                       uEditDrawUser(fetchFleshedUser(cgi.param('usr')));
-
-               }, 20 
-       );
-}
-
-/* UI code ---------------------------------------------------- */
-
-function uEditNext() {
-       var i = _findActive();
-       if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
-}
-
-function uEditPrev() {
-       var i = _findActive();
-       if( i > 0 ) uEditShowPage(pages[i-1]);
-}
-
-function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
-
-function uEditShowPage(id) {
-       if( id == null ) return;
-
-       for( var p in pages ) {
-               var page = pages[p];
-               hideMe($(page));
-               removeCSSClass($(page+'_label'), 'label_active');
-       }
-
-       unHideMe($(id));
-       addCSSClass($(id+'_label'), 'label_active');
-       var idx = _findPageIdx(id);
-       var fpage = pageFocus[idx];
-       if(fpage) { $(fpage).focus(); try{$(fpage).select()}catch(e){} }
-
-       unHideMe($('ue_back'));
-       unHideMe($('ue_fwd'));
-
-       if(idx == 0) hideMe($('ue_back'));
-       if(idx == (pages.length-1)) hideMe($('ue_fwd'));
-}
-
-
-function _findActive() {
-       for( var p in pages ) {
-               if(! $(pages[p]).className.match(/hide_me/) )
-                       return parseInt(p);
-       }
-       return null;
-}
-function _findPageIdx(name) {
-       for( var i in pages ) {
-               var page = pages[i];
-               if( page == name ) return i;
-       }
-       return -1;
-}
-
-function uEditAddrHighlight( node, type ) {
-       var tbody = $('ue_address_tbody');
-       for( var c in tbody.childNodes ) {
-               var row = tbody.childNodes[c];
-               if(row.nodeType != XML_ELEMENT_NODE ) continue;
-               var div = $n(row,'ue_addr_'+type+'_yes').parentNode;
-               removeCSSClass(div, 'addr_info_checked');
-       }
-       addCSSClass(node.parentNode, 'addr_info_checked');
-}
-
-
-/* ------------------------------------------------------------------------------ */
-/* Fetch code
-/* ------------------------------------------------------------------------------ */
-function uEditFetchIDTypes() {
-       var req = new Request(FETCH_ID_TYPES);
-       req.send(true);
-       uEditDrawIDTypes(req.request);
-}
-
-function uEditFetchStatCats() {
-       var req = new Request(SC_FETCH_ALL, SESSION);
-       req.send(true);
-       uEditDrawStatCats(req.request);
-}
-
-function uEditFetchSurveys() {
-       var req = new Request(SV_FETCH_ALL, SESSION);
-       req.callback(uEditDrawSurveys);
-       req.send();
-}
-
-
-/* ------------------------------------------------------------------------------ */
-/* Save the user
-/* ------------------------------------------------------------------------------ */
-var uEditExistingStatEntries;
-var uEditExistingSurveyResponses;
-
-function uEditSaveUser() {
-       uEditCollectData();
-
-       if(ERRORS) { 
-               alert(ERRORS); 
-               ERRORS = ""; 
-               return;
-       }
-
-       //alert(js2JSON(patron));
-       //return;
-
-       var req = new Request(UPDATE_PATRON, SESSION, patron);
-       req.send(true);
-       var result = req.result();
-       if( checkILSEvent(result) ) alert(js2JSON(result));
-       else alert($('ue_success').innerHTML);
-
-       if (window.xulG && typeof window.xulG.save == 'function') {
-               window.xulG.on_save(patron); 
-       }
-}
-
-function uEditCollectData() {
-
-       var card        = null;
-
-       if(patron == null) { 
-               patron = new au(); 
-               patron.isnew(1);
-               patron.id(-1);
-               card = new ac();
-               patron.card(-1); /* attach to the virtual id of the card */
-               patron.cards([card]);
-
-       } else { 
-
-               /* if this function is called again, patron will exist */
-               if(!patron.isnew()) { 
-                       patron.ischanged(1); 
-                       patron.isnew(0);
-                       if(!uEditExistingStatEntries)
-                               uEditExistingStatEntries = patron.stat_cat_entries();
-                       if(!uEditExistingSurveyResponses)
-                               uEditExistingSurveyResponses = patron.survey_responses();
-               }
-       }
-
-       patron.stat_cat_entries([]);
-       patron.survey_responses([]);
-
-       uEditFleshCard(card);
-       uEditAddBasicPatronInfo(patron);
-       uEditAddPhones(patron);
-       uEditAddIdents(patron);
-       uEditAddAddresses(patron);
-       uEditAddGroupsAndPerms(patron);
-       uEditReapStatCats(patron);
-       uEditReapSurveys(patron);
-
-}
-
-
-
-/* ------------------------------------------------------------------------------ */
-/* Draw the user
-/* ------------------------------------------------------------------------------ */
-function uEditDrawUser(p) {
-
-       hideMe($('uedit_loading'));
-       unHideMe($('ue_maintd'));
-
-       if(!p) return;
-       patron = p;
-
-       $('ue_barcode').value                   = patron.card().barcode();
-       $('ue_username').value                  = patron.usrname();
-       $('ue_firstname').value                 = patron.first_given_name();
-       $('ue_middlename').value                = patron.second_given_name();
-       $('ue_lastname').value                  = patron.family_name();
-       $('ue_suffix').value                            = patron.suffix();
-       $('ue_dob').value                                       = patron.dob();
-       $('ue_primary_ident').value     = patron.ident_value();
-       $('ue_secondary_ident').value   = patron.ident_value2();
-       $('ue_email1').value                            = patron.email();
-       $('ue_expire').value                            = patron.expire_date();
-       $('ue_active').value                            = patron.active();
-       $('ue_barred').value                            = patron.barred();
-       $('ue_claims_returned').value   = patron.claims_returned_count();
-       $('ue_alert_message').value     = patron.alert_message();
-
-       setSelector( $('ue_primary_ident_type'), patron.ident_type() );
-       setSelector( $('ue_secondary_ident_type'), patron.ident_type2() );
-       setSelector( $('ue_org_selector'), patron.home_ou() );
-       setSelector( $('ue_profile'), patron.profile() );
-       
-       /* flesh out the phone numbers ------------------------- */
-       var dp = patron.day_phone();
-       var np = patron.evening_phone();
-       var op = patron.other_phone();
-
-       if(dp) {
-               var daynums = String(dp).split('-');
-               $('ue_day_phone_area').value            = daynums[0] || '';
-               $('ue_day_phone_prefix').value  = daynums[1] || '';
-               $('ue_day_phone_suffix').value  = daynums[2] || '';
-       }
-
-       if(np) {
-               var nightnums = String(np).split('-');
-               $('ue_night_phone_area').value  = nightnums[0] || '';
-               $('ue_night_phone_prefix').value        = nightnums[1] || '';
-               $('ue_night_phone_suffix').value        = nightnums[2] || '';
-       }
-
-       if(op) {
-               var othernums = String(op).split('-');
-               $('ue_other_phone_area').value  = othernums[0] || '';
-               $('ue_other_phone_prefix').value        = othernums[1] || '';
-               $('ue_other_phone_suffix').value        = othernums[2] || '';
-       }
-
-
-       /* Flesh the addresses ------------------------------------ */
-       var i = 0;
-       var tbody = $('ue_address_tbody');      
-       for( var i = 0; i != patron.addresses().length; i++ ) {
-               var addr = patron.addresses()[i];
-               cachedAddresses[addr.id()] = addr;
-
-               var row;
-               if( i == 0 ) row = getElementsByTagNameFlat(tbody, 'tr')[0];
-               else row = $('ue_address_new').onclick(); /* create a new row if necessary */
-
-               row.setAttribute('exists', addr.id() );
-
-               if( patron.mailing_address().id() == addr.id())
-                       $n(row, 'ue_addr_mailing_yes').checked = true;
-
-               if( patron.billing_address().id() == addr.id())
-                       $n(row, 'ue_addr_billing_yes').checked = true;
-               
-               if( addr.valid() ) $n(row, 'ue_addr_valid_yes').checked = true;
-
-       
-               $n(row, 'ue_addr_label').value  = addr.address_type();
-               $n(row, 'ue_addr_street1').value        = addr.street1();
-               $n(row, 'ue_addr_street2').value = addr.street2();
-               $n(row, 'ue_addr_city').value           = addr.city();
-               $n(row, 'ue_addr_county').value = addr.county();
-               $n(row, 'ue_addr_state').value  = addr.state();
-               $n(row, 'ue_addr_zip').value            = addr.post_code();
-               $n(row, 'ue_addr_country').value        = addr.country();
-
-       }
-
-       var stattbody = $('ue_stat_cat_tbody');
-       for( var m in patron.stat_cat_entries() ) {
-               var map = patron.stat_cat_entries()[m];
-               var row = grep( getElementsByTagNameFlat( stattbody, 'tr' ), 
-                       function(a) { return a.getAttribute('statcat') == map.stat_cat() })[0];
-               $n(row, 'ue_stat_cat_newval').value = map.stat_cat_entry();
-               setSelectorByName( $n(row, 'ue_stat_cat_selector'), map.stat_cat_entry() );
-       }
-}
-
-
-
-
-
-/* ------------------------------------------------------------------------------ */
-/* Draw the ID types
-/* ------------------------------------------------------------------------------ */
-function uEditDrawIDTypes(r) {
-
-       var types       = r.getResultObject();
-       var pri_sel = $('ue_primary_ident_type');
-       var sec_sel = $('ue_secondary_ident_type');
-
-       var idx = 1;
-       for( var t in types ) {
-               var type = types[t];
-               identTypes[type.id()] = type;
-
-               var action = function() {
-                       unHideMe($('ue_primary_ident'));
-                       hideMe($('ue_primary_ident_dl'));
-                       hideMe($('ue_primary_ident_ssn'));
-                       $('ue_primary_ident').focus();
-               }
-
-               if( type.name().match(/ssn/i) ) 
-                       action = function() {
-                               hideMe($('ue_primary_ident'));
-                               hideMe($('ue_primary_ident_dl'));
-                               unHideMe($('ue_primary_ident_ssn'));
-                               $('ue_primary_ident_ssn_1').focus();
-                       }
-
-               if( type.name().match(/driver/i) ) 
-                       action = function() {
-                               hideMe($('ue_primary_ident'));
-                               unHideMe($('ue_primary_ident_dl'));
-                               hideMe($('ue_primary_ident_ssn'));
-                               $('ue_primary_ident_dl_state').value = defaultState;
-                               $('ue_primary_ident_dl_val').focus();
-                       }
-
-               setSelectorVal( pri_sel, idx, type.name(), type.id(), action );
-
-               if(patron && patron.ident_type() != null ) 
-                       setSelector( pri_sel, patron.ident_type() );
-
-
-               action = function() {
-                       unHideMe($('ue_secondary_ident'));
-                       hideMe($('ue_secondary_ident_dl'));
-                       hideMe($('ue_secondary_ident_ssn'));
-                       $('ue_secondary_ident').focus();
-               }
-
-               if( type.name().match(/ssn/i) ) 
-                       action = function() {
-                               hideMe($('ue_secondary_ident'));
-                               hideMe($('ue_secondary_ident_dl'));
-                               unHideMe($('ue_secondary_ident_ssn'));
-                               $('ue_secondary_ident_ssn_1').focus();
-                       }
-
-               if( type.name().match(/driver/i) ) 
-                       action = function() {
-                               hideMe($('ue_secondary_ident'));
-                               unHideMe($('ue_secondary_ident_dl'));
-                               hideMe($('ue_secondary_ident_ssn'));
-                               $('ue_secondary_ident_dl_state').value = defaultState;
-                               $('ue_secondary_ident_dl_val').focus();
-                       }
-
-
-               setSelectorVal( sec_sel, idx++, type.name(), type.id(), action );
-
-               if(patron && patron.ident_type2() != null ) 
-                       setSelector( sec_sel, patron.ident_type2() );
-       }
-}
-
-
-
-/* ------------------------------------------------------------------------------ */
-/* Stat Cat handling code
-/* ------------------------------------------------------------------------------ */
-function uEditDrawStatCats(r) {
-       var cats = r.getResultObject();
-       var tbody = $('ue_stat_cat_tbody');
-       var templ = tbody.removeChild($('ue_stat_cat_row'));
-
-       for( var c in cats ) {
-               var row = templ.cloneNode(true);
-               uEditInsertCat( tbody, row, cats[c], c );
-               tbody.appendChild(row);
-       }
-}
-
-/* fleshes the stat cat with entries in the dropdown */
-function uEditInsertCat( tbody, row, cat, idx ) {
-
-       cat.entries().sort(  /* sort the entries by value */
-               function( a, b ) { 
-                       if( a.value().toLowerCase() > b.value().toLowerCase()) return 1;
-                       if( a.value().toLowerCase() < b.value().toLowerCase()) return -1;
-                       return 0;
-               }
-       );
-
-       cachedStatCats[cat.id()] = cat;
-
-       row.setAttribute('statcat', cat.id());
-       var newval = $n(row, 'ue_stat_cat_newval');
-       newval.onchange = function(){ 
-               findParentByNodeName(newval,'tr').setAttribute('changed', '1'); }
-
-       var selector = $n(row, 'ue_stat_cat_selector');
-       selector.onchange = function(){ 
-               findParentByNodeName(selector, 'tr').setAttribute('changed', '1'); 
-               newval.value = getSelectorName(selector);
-               newval.setAttribute('entry', getSelectorVal(selector));
-       }
-
-       if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1'; 
-
-       $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
-       $n(row, 'ue_stat_cat_owner').appendChild(
-               text(fetchOrgUnit(cat.owner()).shortname()));
-
-       var idx = 1;
-       for( var e in cat.entries() ) {
-               var entry = cat.entries()[e];
-               setSelectorVal( selector, idx++, entry.value(), entry.id() );
-       }
-}
-
-/* finds all the changed/new stat entries and updates the patron object*/
-function uEditReapStatCats(patron) {
-   var tbody = $('ue_stat_cat_tbody');
-       for( var r in tbody.childNodes ) {
-               var row = tbody.childNodes[r];
-               if( !row || row.nodeName != 'tr' ) continue;
-               if( row.getAttribute('changed') ) {
-                       var val = $n( row, 'ue_stat_cat_newval' );
-                       uEditCreateStatMap( patron, row.getAttribute('statcat'), 
-                               val.value, val.getAttribute('entry') );
-               }
-       }
-}
-
-
-function uEditCreateStatMap( patron, catid, newval, entryid ) {
-
-       if( ! patron.isnew() ) {
-
-               /* if the patron exists and we're editing an entry that's 
-               already been created for this user... */
-               for( var m in uEditExistingStatEntries ) {
-                       var map = uEditExistingStatEntries[m];
-                       if( map.stat_cat() == catid ) {
-                               if( newval ) map.ischanged(1);
-                               else map.isdeleted(1); 
-                               patron.stat_cat_entries().push(map);
-                               return;
-                       }
-               }
-       }
-
-       var map = new actscecm();
-       map.isnew(1);
-       map.stat_cat_entry(newval);
-       map.stat_cat(catid);
-       map.target_usr(patron.id());
-       patron.stat_cat_entries().push(map);
-}
-
-
-
-/* ------------------------------------------------------------------------------ */
-/* Survey handling code
-/* ------------------------------------------------------------------------------ */
-function uEditDrawSurveys(r) {
-
-       var surveys = r.getResultObject();
-       var div = $('uedit_surveys');
-       var table = div.removeChild($('ue_survey_table'));
-
-       var x = 0;
-       for( var s in surveys ) {
-               var survey = surveys[s];
-               cachedSurveys[survey.id()] = survey;
-               var clone = table.cloneNode(true);
-               uEditInsertSurvey( div, clone, survey, x++ );
-               div.appendChild(clone);
-       }
-}
-
-function uEditInsertSurvey( div, table, survey, sidx ) {
-       $n(table, 'ue_survey_name').appendChild(text(survey.name()));
-       $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
-       var tbody = $n(table, 'ue_survey_tbody');
-       var templ = tbody.removeChild($n(table, 'ue_survey_row'));
-
-       var polldiv             = $('ue_survey_answer_poll');
-
-       var idx = 1;
-       for( var q in survey.questions() ) {
-               var row = templ.cloneNode(true);
-               var quest = survey.questions()[q];
-               cachedSurveyQuestions[quest.id()] = quest;
-               uEditInsertSurveyQuestion( div, table, tbody, row, survey, quest, sidx );
-               tbody.appendChild(row);
-       }
-}
-
-function uEditInsertSurveyQuestion( div, table, tbody, row, survey, question, sidx ) {
-
-       $n(row, 'ue_survey_question').appendChild(text(question.question()));
-
-       var selector    = $n(row, 'ue_survey_answer');
-       var polldiv             = $n(row, 'ue_survey_answer_poll');
-       var idx                 = 1;
-       var polltbody   = $n(row, 'ue_survey_answer_poll_tbody');
-       var pollrow             = polltbody.removeChild($n(polltbody, 'ue_survey_answer_poll_row'));
-
-       table.setAttribute('survey', survey.id());
-       row.setAttribute('question', question.id());
-
-       selector.onchange = function() {
-               row.setAttribute('answer', getSelectorVal(selector));
-               row.setAttribute('changed', '1');
-       }
-
-       if( sidx == 0 ) selector.id = 'ue_survey_selector_1'; 
-
-       for( var a in question.answers() ) {
-
-               var answer = question.answers()[a];
-               cachedSurveyAnswers[answer.id()] = answer;
-
-               if( survey.poll() ) {
-
-                       unHideMe(polldiv);
-                       var prow = pollrow.cloneNode(true);
-
-
-                       $n(prow, 'ue_survey_answer_poll_answer').appendChild(text(answer.answer()));
-
-
-                       var input = elem('input', { 
-                                       type    : 'radio', 
-                                       name    : 'survey_poll_answer_'+survey.id(),
-                                       id              :  answer.id()
-                               });
-
-                       input.onchange  = function() {
-                               row.setAttribute('answer', answer.id());
-                               row.setAttribute('changed', '1');
-                       }
-
-                       $n(prow, 'ue_survey_answer_poll_radio').appendChild(input);
-                       polltbody.appendChild(prow);
-
-               } else {
-
-                       unHideMe(selector.parentNode);
-                       setSelectorVal( selector, idx++, answer.answer(), answer.id() );
-               }
-       }
-}
-
-
-function uEditReapSurveys(patron) {
-
-       var div = $('uedit_surveys');
-       var tables = getElementsByTagNameFlat(div, 'table');
-
-       for( var t in tables ) {
-
-               var table               = tables[t];
-               var survey              = cachedSurveys[table.getAttribute('survey')];
-               var tbody               = getElementsByTagNameFlat( table, 'tbody' )[0];
-               var rows                        = getElementsByTagNameFlat( tbody, 'tr' );
-
-               for( var r in rows ) {
-                       var row = rows[r];
-                       if(!row.getAttribute('changed')) continue;
-
-                       var resp        = new asvr();
-                       resp.isnew(1);
-                       resp.survey(survey.id());
-                       resp.usr(patron.id());
-                       resp.question(row.getAttribute('question'));
-                       resp.answer(row.getAttribute('answer'));
-                       patron.survey_responses().push( resp );
-               }
-       }
-}
-
-
-
-
-
-
-/* returns true if an error occurred */
-function uEditSetVal( obj, func, val, regxtype, errtype ) {
-
-       var error = uEditFetchError(errtype);
-       var iserr = false;
-
-       while(1) {
-
-               if( val == null ) { iserr = true; break; }
-
-               if(!instanceOf(val, String)) {
-                       try { val = val.value; } catch(e) { return; }
-               }
-
-               if(val == "" ) { iserr = true; break; }
-
-               if(regxtype && regexes[regxtype] 
-                       && !val.match(regexes[regxtype]) ) { iserr = true; break; }
-
-               try { obj[func](val); } catch(e) {
-                       alert("Error running function: " +func);
-               }
-
-               break;
-       }
-
-       if(iserr) { ERRORS += error; return true; }
-       return false;
-}
-
-
-function uEditAddBasicPatronInfo(patron) {
-
-
-
-       /* make sure passwords match */
-       var p1 = $('ue_password1').value;
-       var p2 = $('ue_password1').value;
-
-       if( p1 || patron.isnew() ) { /* existing patrons will have a blank password */
-               if( p1 != p2 || uEditSetVal( patron, "passwd", p1 )) 
-                       ERRORS += uEditFetchError('ue_bad_password');
-       }
-       
-       uEditSetVal(patron, "usrname", $('ue_username'), null, 'ue_bad_username' );
-       uEditSetVal(patron, "first_given_name", $('ue_firstname'), null, 'ue_bad_firstname' );
-       uEditSetVal(patron, "family_name", $('ue_lastname'), null, 'ue_bad_lastname' ); 
-       uEditSetVal(patron, "dob", $('ue_dob'), 'date', 'ue_bad_dob' );
-
-       patron.second_given_name($('ue_middlename').value);
-       patron.suffix($('ue_suffix').value); /* suffis isn't required */
-
-       patron.email($('ue_email1').value);
-       patron.home_ou(getSelectorVal($('ue_org_selector')));
-}
-
-function uEditAddPhones(patron) {
-
-       /* verifies the phone numbers are formatted correctly */
-       var verify = function(n1, n2, n3) {
-               if(!(a || p||s) ) return null;
-               var a = n1.value;
-               var p = n2.value;
-               var s = n3.value;
-               if( !a || !p || !s ) return false;
-               return a + '-' + p + '-' + s;
-       }
-
-       var er = 'ue_bad_phone'
-
-       var r1 = verify($('ue_day_phone_area'), $('ue_day_phone_prefix'),$('ue_day_phone_suffix'));
-       var r2 = verify($('ue_night_phone_area'), $('ue_night_phone_prefix'),$('ue_night_phone_suffix'));
-       var r3 = verify($('ue_other_phone_area'), $('ue_other_phone_prefix'),$('ue_other_phone_suffix'));
-
-       if(r1 != null) 
-               uEditSetVal( patron, "day_phone", r1, 'phone', er);
-
-       if(r2 != null) 
-               uEditSetVal( patron, "evening_phone", r2, 'phone', er);
-
-       if(r3 != null) 
-               uEditSetVal( patron, "other_phone", r3, 'phone', er);
-}
-
-function uEditFleshCard(card) {
-       if(!card) return "";
-
-       if(uEditSetVal( card, "barcode", $('ue_barcode'), null, 'ue_bad_barcode' ))
-               return; 
-
-       card.id(-1);
-       card.active(1);
-       card.isnew(1);
-       return "";
-}
-
-function uEditParseIdent(type, required) {
-       var err = 'ue_no_ident';
-       var error = [null, null, uEditFetchError(err)];
-       var selector = $('ue_' + type + '_ident_type');
-       var tname = getSelectorName(selector);
-       var tval = getSelectorVal(selector);
-       var val = "";
-
-       if( tname.match(/ssn/i) ) {
-               var ssn1 = $('ue_'+type+'_ident_ssn_1').value;
-               var ssn2 = $('ue_'+type+'_ident_ssn_2').value;
-               var ssn3 = $('ue_'+type+'_ident_ssn_3').value;
-
-               if(!(ssn1 && ssn2 && ssn3)) return error;
-               if(!ssn1.match(/^\d{3}$/)) return error;
-               if(!ssn2.match(/^\d{2}$/)) return error;
-               if(!ssn3.match(/^\d{4}$/)) return error;
-               val = ssn1+'-'+ssn2+'-'+ssn3;
-
-       } else if( tname.match(/driver/i) ) {
-               var state = $('ue_'+type+'_ident_dl_state').value;
-               var dlval = $('ue_'+type+'_ident_dl_val').value;
-               if(!(state && dlval)) return error;
-               val = state+'-'+dlval;
-
-       } else {
-               val = $('ue_'+type+'_ident').value;
-               if(!val) return error;
-       }
-
-       return [ tval, val ];
-}
-
-function uEditAddIdents(patron) {
-
-
-       /*
-       uEditSetVal( patron, "ident_type", 
-               getSelectorVal($('ue_primary_ident_type')), 'isnum', err );
-       uEditSetVal( patron, "ident_value", $('ue_primary_ident'), null, err );
-       */
-
-       //FIXME - I think this file is deprecated, but there's this syntax error sitting here 
-       //var identdata = uEditParseIdent(
-
-       var it1 = getSelectorVal($('ue_primary_ident_type'));
-       var name = getSelectorName($('ue_primary_ident_type'));
-
-       if(it1 && it1.match(regexes['isnum'])) {
-               patron.ident_type(it1);
-               if( name.match(/ssn/i) ) {
-                       var ssn1 = $('ue_secondary_ident_ssn_1');
-               } else if( name.match(/driver/i) ) {
-
-               } else {
-
-               }
-
-               var val = $('ue_primary_ident').value;
-               if(val) {
-                       patron.ident_value(val);
-               } else {
-                       if($('ue_primary_ident_verified')) {
-                               patron.ident_value("");
-                       } else {
-                               ERRORS += error;
-                       }
-               }
-       } else {
-               ERRORS += error;
-       }
-
-
-
-
-       var val = getSelectorVal($('ue_secondary_ident_type'));
-       if( val && val.match(/^\d+$/) ) {
-               patron.ident_type2(getSelectorVal($('ue_secondary_ident_type')));
-               patron.ident_value2($('ue_secondary_ident').value);
-       } else {
-               patron.ident_type2(null);
-               patron.ident_value2(null);
-       }
-}
-
-
-function uEditBuildLibSelector( node, depth, selector ) {
-       if(!selector) selector = $('ue_org_selector');
-       if(!node) { depth = 0; node = globalOrgTree; }
-       
-       var opt = insertSelectorVal( selector, -1, node.name(), node.id(), null, depth++ );
-
-       /* allow these orgs to be selectable via permission? */
-       if(!findOrgType(node.ou_type()).can_have_vols()) opt.disabled = true; 
-
-       if( node.id() == USER.home_ou() ) setSelector(selector, node.id());
-       for( var c in node.children() ) 
-               uEditBuildLibSelector(node.children()[c], depth, selector);
-}
-
-function uEditFetchGroups() {
-       var req = new Request(FETCH_GROUPS);
-       //req.callback(uEditDrawGroups);
-       req.send(true);
-       uEditDrawGroups(req.request);
-}
-
-function uEditDrawGroups(r, tree, depth, selector) {
-
-       if(!tree) {
-               tree = r.getResultObject();     
-               depth = 0;
-               groupTree = tree;
-               selector = $('ue_profile');
-       }
-
-       insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );       
-       for( var c in tree.children() ) 
-               uEditDrawGroups( null, tree.children()[c], depth, selector );
-}
-
-
-
-function uEditAddGroupsAndPerms(patron) {
-
-       uEditSetVal( patron, "profile", 
-               getSelectorVal($('ue_profile')), 'isnum', 'ue_no_profile');
-
-       var expire = $('ue_expire').value;
-       if(expire) 
-               uEditSetVal( patron, "expire_date", expire, 'date', 'ue_bad_expire' );
-
-       if($('ue_active').checked) patron.active(1);
-       if($('ue_barred').checked) patron.barred(1);
-       if($('ue_group_lead').checked) patron.master_account(1);
-
-       uEditSetVal( patron, "claims_returned_count", 
-               $('ue_claims_returned'), 'isnum', 'ue_bad_claims_returned');
-
-       patron.alert_message($('ue_alert_message').value);
-}
-
-
-
-function uEditAddAddresses(patron) {
-       var tbody = $('ue_address_tbody');      
-       patron.addresses([]);
-
-       /* shove the addresses living in the page into the patron */
-       for( var r in tbody.childNodes ) {
-               var row = tbody.childNodes[r];
-               if(!(row && row.nodeName == 'tr')) continue;
-               patron.addresses().push( uEditBuildAddress( patron, tbody, row ));      
-       }
-       for( var a in deletedAddresses ) {
-               var addr = deletedAddresses[a];
-               patron.addresses().push(addr);
-       }
-}
-
-/* extracts a single address from the page */
-var uEditVirtualAddrId = -1;
-function uEditBuildAddress( patron, tbody, row ) {
-
-       var addr = new aua();
-       var id = row.getAttribute('exists');
-
-       if(id) {
-               addr.id(id)
-               addr.ischanged(1);
-               addr.isnew(0);
-       } else {
-               addr.id(uEditVirtualAddrId--);
-               addr.isnew(1);
-       }
-
-       if($n(row, 'ue_addr_mailing_yes').checked) patron.mailing_address(addr.id());
-       if($n(row, 'ue_addr_billing_yes').checked) patron.billing_address(addr.id());
-       if($n(row, 'ue_addr_valid_yes').checked) addr.valid(1);
-       if($n(row, 'ue_addr_street2').value) addr.street2($n(row, 'ue_addr_street2').value);
-
-       uEditSetVal(addr, "address_type",       $n(row, 'ue_addr_label'),                       null, 'ue_bad_addr_label' );
-       uEditSetVal(addr, "street1",                    $n(row, 'ue_addr_street1'),             null, 'ue_bad_addr_street' );
-       uEditSetVal(addr, "city",                               $n(row, 'ue_addr_city'),                        null, 'ue_bad_addr_city' );
-       uEditSetVal(addr, "county",                     $n(row, 'ue_addr_county'),                      null, 'ue_bad_addr_county' );
-       uEditSetVal(addr, "state",                              $n(row, 'ue_addr_state'),                       null, 'ue_bad_addr_state' );
-       uEditSetVal(addr, "post_code",          $n(row, 'ue_addr_zip'),                         null, 'ue_bad_addr_zip' );
-       uEditSetVal(addr, "country",                    $n(row, 'ue_addr_country'),             null, 'ue_bad_addr_country' );
-
-       return addr;
-}
-
-function uEditRemoveAddress(node) {
-       if( confirm($("ue_delete_addr_warn").innerHTML) ) {
-               var td      = node.parentNode.parentNode;
-               var mytab   = td.parentNode.parentNode.parentNode;
-               var row                 = mytab.parentNode.parentNode;
-               if( row.getAttribute('exists') ) {
-                       var a =  cachedAddresses[row.getAttribute('exists')];
-                       a.isdeleted(1);
-                       deletedAddresses[a.id()] = a;
-               }
-               var tbody   = row.parentNode;
-               tbody.removeChild(mytab.parentNode.parentNode);
-       }
-
-}
-
-
-var uEditAddrTemplate;
-var uEditOrigAddrRow;
-function uEditBuildAddrs() {
-
-       var tbody = $('ue_address_tbody');
-       uEditAddrTemplate = tbody.removeChild($('ue_address_template'));
-
-       $('ue_address_new').onclick = 
-               function() { 
-                       /* we have to retain the mailing/billing radio input values */
-                       var rows = getElementsByTagNameFlat(tbody,'tr');
-                       var mailrow;
-                       var billrow;
-                       for( var r in rows ) {
-                               var row = rows[r];
-                               if($n(row,'ue_addr_mailing_yes').checked) mailrow = row;
-                               if($n(row,'ue_addr_billing_yes').checked) billrow = row;
-                       }
-                       var newrow = uEditAddrTemplate.cloneNode(true);
-                       tbody.appendChild(newrow); 
-                       $n(newrow, 'ue_addr_label').focus();
-                       if(mailrow) $n(mailrow,'ue_addr_mailing_yes').checked = true;
-                       if(billrow) $n(billrow,'ue_addr_billing_yes').checked = true;
-                       return newrow;
-               }
-
-       /* go ahead and add a blank addr */
-       if(!patron) {
-               var row = uEditAddrTemplate.cloneNode(true);
-               uEditOrigAddrRow = row;
-               $n( row, 'ue_addr_label').id = 'ue_addr_label_1';
-               tbody.appendChild(row); 
-               return;
-       }
-}
-
-
-/* Use this in XUL mode (default) */
-function uEditShowSummary() {
-       uEditCollectData();
-       var table = $('ue_summary_table').cloneNode(true);;
-       uEditFleshSummaryTable(table);
-       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite UniversalBrowserRead");
-       var serializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].getService(Components.interfaces.nsIDOMSerializer);
-       var win = window.open(
-               "data:application/xhtml+xml," + window.escape('<?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [ <!ENTITY nbsp " "> <!-- calendar needs this entity --> ]> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude"> <head><title>' + $('ue_summary_window').innerHTML + '</title></head><body>' + serializer.serializeToString(table) + '</body></html>'), 
-               $('ue_summary_window').innerHTML,
-               'chrome,resizable,width=700,height=500');
-       //win.document.body.innerHTML = "";
-       //win.document.body.appendChild(table);
-       ERRORS = "";
-}
-
-
-/* Use this when debugging in HTML mode */
-function _uEditShowSummary() {
-       uEditCollectData();
-       var table = $('ue_summary_table').cloneNode(true);;
-       uEditFleshSummaryTable(table);
-       var win = window.open('','','scrollbars=1,resizable,width=700,height=500');
-       win.document.body.innerHTML = "";
-       win.document.body.appendChild(table);
-       ERRORS = "";
-}
-
-function uEditFleshSummaryTable(table) {
-
-       var yes = $('yes').innerHTML;
-       var no = $('no').innerHTML;
-
-       var identt1 = "";
-       var identt2 = "";
-       var homeorg = "";
-       var profile     = "";
-
-       if( identt1 = identTypes[patron.ident_type()]) 
-               identt1 = identt1.name();
-       if( identt2 = identTypes[patron.ident_type2()] ) 
-               identt2 = identt2.name();
-       if( patron.home_ou() != null )
-               homeorg = findOrgUnit(patron.home_ou()).name();
-       if( patron.profile() != null )
-               profile = findTreeItemById(groupTree, patron.profile()).name();
-
-
-       $n(table, 'ue_summary_username').appendChild(text(patron.usrname()));
-       $n(table, 'ue_summary_firstname').appendChild(text(patron.first_given_name()));
-       $n(table, 'ue_summary_middlename').appendChild(text(patron.second_given_name()));
-       $n(table, 'ue_summary_lastname').appendChild(text(patron.family_name()));
-       $n(table, 'ue_summary_suffix').appendChild(text(patron.suffix()));
-       $n(table, 'ue_summary_dob').appendChild(text(patron.dob()));
-       $n(table, 'ue_summary_primary_ident_type').appendChild(text(identt1));
-       $n(table, 'ue_summary_primary_ident').appendChild(text(patron.ident_value()));
-       $n(table, 'ue_summary_secondary_ident_type').appendChild(text(identt2));
-       $n(table, 'ue_summary_secondary_ident').appendChild(text(patron.ident_value2()));
-       $n(table, 'ue_summary_email').appendChild(text(patron.email()));
-       $n(table, 'ue_summary_dayphone').appendChild(text(patron.day_phone()));
-       $n(table, 'ue_summary_nightphone').appendChild(text(patron.evening_phone()));
-       $n(table, 'ue_summary_otherphone').appendChild(text(patron.other_phone()));
-       $n(table, 'ue_summary_home_lib').appendChild(text(homeorg));
-       $n(table, 'ue_summary_profile').appendChild(text(profile));
-       $n(table, 'ue_summary_expire').appendChild(text(patron.expire_date()));
-       $n(table, 'ue_summary_family_lead').appendChild(text( (patron.master_account()) ? yes : no ));
-       $n(table, 'ue_summary_claims_returned').appendChild(text(patron.claims_returned_count()));
-       $n(table, 'ue_summary_alert_message').appendChild(text(patron.alert_message()));
-
-       uEditFleshSummaryAddresses( table, patron );
-       uEditFleshSummaryStatCats( table, patron );
-       uEditFleshSummarySurveys( table, patron );
-       uEditFleshSummaryErrors( table );
-
-
-}
-
-function uEditFleshSummaryAddresses( table, patron ) {
-
-       var addrtbody = $n(table, 'ue_summary_addr_tbody');
-       var rowtmpl = addrtbody.removeChild($n(addrtbody, 'ue_summary_addr_row'));
-
-       for( var a in patron.addresses() ) {
-               var address = patron.addresses()[a];
-               var row = rowtmpl.cloneNode(true);
-               uEditFleshSummaryAddr( address, patron, row );
-               addrtbody.appendChild(row);
-               if(address.isdeleted()) addCSSClass(row, 'deleted');
-       }
-}
-
-
-function uEditFleshSummaryAddr( address, patron, row ) {
-       var yes = $('yes').innerHTML;
-       var no = $('no').innerHTML;
-
-       $n(row, 'label').appendChild(text(address.address_type()));
-       $n(row, 'street1').appendChild(text(address.street1()));
-       $n(row, 'street2').appendChild(text(address.street2()));
-       $n(row, 'city').appendChild(text(address.city()));
-       $n(row, 'county').appendChild(text(address.county()));
-       $n(row, 'state').appendChild(text(address.state()));
-       $n(row, 'country').appendChild(text(address.country()));
-       $n(row, 'zip').appendChild(text(address.post_code()));
-       $n(row, 'valid').appendChild(text( (address.valid()) ? yes : no ));
-
-       $n(row, 'mailing').appendChild(text( 
-               (patron.mailing_address() == address.id()) ? yes : no ));
-
-       $n(row, 'billing').appendChild(text( 
-               (patron.billing_address() == address.id()) ? yes : no ));
-}
-
-
-function uEditFleshSummaryStatCats( table, patron ) {
-       var tbody = $n(table, 'ue_summary_stats_tbody');
-       var rowtmpl = tbody.removeChild($n(tbody, 'ue_summary_stats_row'));
-
-       for( var s in patron.stat_cat_entries() ) {
-               row = rowtmpl.cloneNode(true);
-               var entry = patron.stat_cat_entries()[s];
-               var cat = cachedStatCats[entry.stat_cat()];
-               $n(row, 'ue_summary_stat_name').appendChild(text(cat.name()));
-               $n(row, 'ue_summary_stat_value').appendChild(text(entry.stat_cat_entry()));
-               row.setAttribute('statcat', entry.stat_cat());
-               if( entry.isdeleted() ) addCSSClass(row, 'deleted'); 
-               tbody.appendChild(row);
-       }
-
-       for( var s in uEditExistingStatEntries ) {
-
-               var entry = uEditExistingStatEntries[s]; 
-               var rows = getElementsByTagNameFlat( tbody, 'tr' );
-               var test = function(a) { return a.getAttribute('statcat') == entry.stat_cat() };
-
-               if( ! grep( rows, test ) ) {
-
-                       row = rowtmpl.cloneNode(true);
-                       var cat = cachedStatCats[entry.stat_cat()];
-                       $n(row, 'ue_summary_stat_name').appendChild(text(cat.name()));
-                       $n(row, 'ue_summary_stat_value').appendChild(text(entry.stat_cat_entry()));
-                       row.setAttribute('statcat', entry.stat_cat());
-                       tbody.appendChild(row);
-               }
-       }
-
-
-       if( ! getElementsByTagNameFlat( tbody, 'tr' )[1] )
-               unHideMe($n(tbody, 'ue_summary_stat_cat_none'));
-}
-
-
-function uEditFleshSummarySurveys( table, patron ) {
-
-       var tbody       = $n(table, 'ue_summary_survey_tbody');
-       var rowtmpl = tbody.removeChild($n(tbody, 'ue_summary_survey_row'));
-
-       for( var r in patron.survey_responses() ) {
-               var row         = rowtmpl.cloneNode(rowtmpl);
-               var resp                = patron.survey_responses()[r];
-               var survey      = cachedSurveys[resp.survey()];
-               var quest       = cachedSurveyQuestions[resp.question()];
-               var answer      = cachedSurveyAnswers[resp.answer()];
-               $n(row, 'ue_summary_survey_name').appendChild(text(survey.name()));
-               $n(row, 'ue_summary_survey_question').appendChild(text(quest.question()));
-               $n(row, 'ue_summary_survey_answer').appendChild(text(answer.answer()));
-               tbody.appendChild(row);
-       }
-
-       if( ! getElementsByTagNameFlat(tbody, 'tr')[1])
-               unHideMe($n(tbody, 'ue_summary_survey_none'))
-}
-
-
-function uEditFleshSummaryErrors( table ) {
-       if(ERRORS) {
-               unHideMe($n(table, 'ue_summary_errors_row'));
-               var errors = ERRORS.replace(/\n/g, "<br/>");
-               $n(table, 'ue_summary_errors').innerHTML += errors;
-       }
-}
diff --git a/Open-ILS/xul/staff_client/server/patron/user_editor.xhtml b/Open-ILS/xul/staff_client/server/patron/user_editor.xhtml
deleted file mode 100644 (file)
index 5dd2409..0000000
+++ /dev/null
@@ -1,902 +0,0 @@
-<?xml version='1.0'?>
-
-<!DOCTYPE html PUBLIC 
-       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
-       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
-       <!ENTITY nbsp " "> <!-- calendar needs this entity -->
-]>
-
-
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
-
-       <head>
-               <title>Evergreen: User Editor</title>
-               <script language='javascript' src='/opac/common/js/utils.js'> </script>
-               <script language='javascript' src='/opac/common/js//config.js'> </script> 
-               <script language='javascript' src='/opac/common/js/CGI.js'> </script>
-               <script language='javascript' src='/opac/common/js/Cookie.js'> </script>
-       
-               <script language='javascript' src='/opac/common/js/slimtree.js'> </script>
-               <script language='javascript' src='/opac/common/js/JSON_v1.js'> </script>
-               <script language='javascript' src='/opac/common/js/fmall.js'> </script>
-               <script language='javascript' src='/opac/common/js/fmgen.js'> </script>
-               <script language='javascript' src='/opac/common/js/Cookies.js'> </script>
-               <script language='javascript' src='/opac/common/js/opac_utils.js'> </script>
-               <script language='javascript' src='/opac/common/js/OrgTree.js'> </script>
-               <script language='javascript' src='/opac/common/js/org_utils.js'> </script>
-               <script language='javascript' src='/opac/common/js/init.js'> </script>
-               <script language='javascript' src='/opac/common/js/RemoteRequest.js'> </script>
-               <script language='javascript' src='../admin/adminlib.js'> </script>
-               <script language='javascript' src='user_editor.js'> </script>
-               <link type='text/css' rel='stylesheet' href='../admin/admin.css'/>
-  
-               <link rel="stylesheet" type="text/css" media="all" 
-                       href="/opac/common/js/jscalendar/calendar-brown.css" title="win2k-cold-1" />
-               <script type="text/javascript" src="/opac/common/js/jscalendar/calendar.js"></script>
-               <script type="text/javascript" src="/opac/common/js/jscalendar/lang/calendar-en.js"></script>
-               <script type="text/javascript" src="/opac/common/js/jscalendar/calendar-setup.js"></script>
-
-
-               <style type='text/css'>
-                       .main_table { width: 98%; border-collapse: collapse;}
-                       .main_table td { border: 1px solid #E0F0E0; text-align: center; padding: 4px;}
-                       #uedit_nav_bar { border: 2px solid #E0F0E0; padding: 6px;}
-                       .nav_link { padding-left: 90px; padding-right: 90px; }
-                       .main_nav_link { -moz-border-radius: 7px; height: 13%;}
-                       .main_div { height: 480px; padding-left: 15px; 
-                               text-align: center; vertical-align: middle; overflow: auto;}
-                       .nav_link_table { height: 480px;}
-                       .label_active { background: #E0F0E0; }
-                       .right { text-align: right; padding-right: 3px;}
-                       .left { text-align: left; padding-left: 3px;}
-                       .wide { width: 98%;}
-                       .pad { padding-left: 3px; padding-right: 3px; }
-                       .no_border td { border: none; }
-                       .uedit_table { width: 80% }
-                       .address_table { 
-                               -moz-border-radius: 4px;
-                               border: 4px solid #E0E0F0;
-                               padding: 4px;
-                               }
-                       .address_table td { 
-                               border: none; 
-                               width: auto; 
-                               padding: 1px; 
-                               }
-                       .addr_info_checked { -moz-border-radius: 6px; background: #F0E0E0; }
-                       .button_row { width: 95%; text-align: center; margin-top: 7px; border: 1px solid #E0E0E0; }
-                       .required_field { background: #F0E0E0; }
-                       input:focus { background: #E0F0E0; }
-               </style>
-       </head>
-
-       <body onload='try{uEditInit();}catch(e){alert(js2JSON(e));}'>
-
-       <center>
-
-               <h2>Evergreen User Editor</h2>
-
-               <div style='position:absolute; top: 5px; right: 5px;'>
-                       <span>Welcome </span><b><span id='uedit_user'/></b>
-               </div>
-
-               <hr/><br/>
-
-               <div style='margin-bottom: 5px; width:100%; text-align: left;'>
-                       <b>
-                               <span>Note: required fields are </span>
-                               <span class='required_field'>marked with color</span>
-                       </b>
-               </div>
-
-               <table class='main_table'>
-                       <tbody>
-                               <tr>
-                                       <td width='15%' valign='top'>
-                                               <!-- ************************************************************** -->
-                                               <!--  Top Navigation Links -->
-                                               <!-- ************************************************************** -->
-                                               <table height='100%' class='nav_link_table'>
-                                                       <tbody>
-                                                               <tr>
-                                                                       <td id='uedit_userid_label' class='main_nav_link'>
-                                                                               <a href='javascript:uEditShowPage("uedit_userid");'>1. User Identification</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_contact_info_label' class='main_nav_link'>        
-                                                                               <a href='javascript:uEditShowPage("uedit_contact_info");'>2. Contact Info</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_addresses_label' class='main_nav_link'>           
-                                                                               <a href='javascript:uEditShowPage("uedit_addresses");'>3. Addresses</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_groups_label' class='main_nav_link'>                      
-                                                                               <a href='javascript:uEditShowPage("uedit_groups");'>4. Groups and Permissions</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_stat_cats_label' class='main_nav_link'>           
-                                                                               <a href='javascript:uEditShowPage("uedit_stat_cats");'>5. Statistical Categories</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_surveys_label' class='main_nav_link'>                     
-                                                                               <a href='javascript:uEditShowPage("uedit_surveys");'>6. Surveys</a>
-                                                                       </td>
-                                                               </tr>
-                                                               <tr>
-                                                                       <td id='uedit_finalize_label' class='main_nav_link'>                    
-                                                                               <a href='javascript:uEditShowPage("uedit_finalize");'>7. Finish</a>
-                                                                       </td>
-                                                               </tr>
-                                                       </tbody>
-                                               </table>
-                                       </td>
-
-                                       <td width='85%' id='uedit_loading'>
-                                               <div class='main_div has_color' 
-                                                       style='padding: 50px; vertical-align: middle;'>
-                                                       <b>Loading data...</b>
-                                               </div>
-                                       </td>
-
-
-                                       <td width='85%' id='ue_maintd' class='hide_me'>
-
-                                               <!-- ************************************************************** -->
-                                               <!--  Identification Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_userid' class='main_div'>
-                                                       <table class='uedit_table'>
-                                                               <tbody>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Barcode</div></td>
-                                                                               <td><div class='wide left'>
-
-                                                                                       <input type='text' id='ue_barcode' 
-                                                                                               onblur=' var un = $("ue_username");
-                                                                                                       if(!un.value) un.value = this.value;'/>
-
-                                                                               </div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Username</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_username'/></div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Password</div></td>
-                                                                               <td><div class='wide left'><input type='password' id='ue_password1'/></div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Verify Password</div></td>
-                                                                               <td><div class='wide left'><input type='password' id='ue_password2'/></div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>First Name</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_firstname'/></div></td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Middle Name</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_middlename'/></div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Last Name</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_lastname'/></div></td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Suffix</div></td>
-                                                                               <td><div class='wide left'>
-                                                                                       <input type='text' id='ue_suffix'/>
-                                                                                       <select id='ue_suffix_selector' style='width: 6em;'
-                                                                                               onclick='$("ue_suffix").value = this.options[this.selectedIndex].value'
-                                                                                               onchange='$("ue_suffix").value = this.options[this.selectedIndex].value'>
-                                                                                               <option value=''>- Pick -</option>
-                                                                                               <option value='Jr'>Jr</option>
-                                                                                               <option value='Sr'>Sr</option>
-                                                                                               <option value='II'>II</option>
-                                                                                               <option value='III'>III</option>
-                                                                                               <option value='AA'>AA</option>
-                                                                                               <option value='AS'>AS</option>
-                                                                                               <option value='AAS'>AAS</option>
-                                                                                               <option value='BA'>BA</option>
-                                                                                               <option value='BS'>BS</option>
-                                                                                               <option value='CFPIM'>CFPIM</option>
-                                                                                               <option value='CPA'>CPA</option>
-                                                                                               <option value='CPIM'>CPIM</option>
-                                                                                               <option value='CPM'>CPM</option>
-                                                                                               <option value='CXE'>CXE</option>
-                                                                                               <option value='DC'>DC</option>
-                                                                                               <option value='DDS'>DDS</option>
-                                                                                               <option value='DO '>DO</option>
-                                                                                               <option value='DPM'>DPM</option>
-                                                                                               <option value='DVM'>DVM</option>
-                                                                                               <option value='Esq'>Esq</option>
-                                                                                               <option value='FACAAI'>FACAAI</option>
-                                                                                               <option value='FACP'>FACP</option>
-                                                                                               <option value='FACS'>FACS</option>
-                                                                                               <option value='FACEP'>FACEP</option>
-                                                                                               <option value='FCP'>FCP</option>
-                                                                                               <option value='FICS'>FICS</option>
-                                                                                               <option value='GYN'>GYN</option>
-                                                                                               <option value='JD'>JD</option>
-                                                                                               <option value='LPN'>LPN</option>
-                                                                                               <option value='MA'>MA</option>
-                                                                                               <option value='MCSE'>MCSE</option>
-                                                                                               <option value='MD'></option>
-                                                                                               <option value='MS'></option>
-                                                                                               <option value='NMD'></option>
-                                                                                               <option value='OB'></option>
-                                                                                               <option value='PhD'></option>
-                                                                                               <option value='RN'></option>
-                                                                                       </select>
-                                                                               </div></td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Date of Birth</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-       
-                                                                                               <input type='text' id='ue_dob' size='10' maxlength='10' 
-                                                                                                       onfocus='/*$("ue_dob_trigger").onclick(event);*/'>1980-01-01</input>
-       
-                                                                                               <button style='padding: 0px;' id='ue_dob_trigger'>
-                                                                                                       <img src="/opac/common/js/jscalendar/img.gif" 
-                                                                                                               style="cursor: pointer; border: 1px solid red; padding: 0px; margin: -3px;" 
-                                                                                                               title="Date selector"
-                                                                                                               onmouseover="this.style.background='red';" 
-                                                                                                               onmouseout="this.style.background=''" />
-                                                                                               </button>
-
-                                                                                               <span class='pad' style='font-size: 8pt;'>(YYYY-MM-DD)</span>
-       
-                                                                                               <script type="text/javascript">
-                                                                                                       Calendar.setup({
-                                                                                                               inputField      : "ue_dob",                             // id of the input field
-                                                                                                               ifFormat                : "%Y-%m-%d",                   // format of the input field
-                                                                                                               button          : "ue_dob_trigger",  // trigger for the calendar (button ID)
-                                                                                                               align                   : "Tl",                                 // alignment (defaults to "Bl")
-                                                                                                               singleClick     : true
-                                                                                                       });
-                                                                                               </script>
-       
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Primary Identification Type</div></td>
-                                                                               <td><div class='wide left'>
-                                                                                               <select id='ue_primary_ident_type'>
-                                                                                                       <option> -- Required -- </option>
-                                                                                               </select>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Primary Identification</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input type='text' id='ue_primary_ident'/>
-                                                                                               <span class='hide_me' id='ue_primary_ident_dl'>
-                                                                                                       <input type='text' id='ue_primary_ident_dl_state' size='2' maxlength='2'/>
-                                                                                                       <input type='text' id='ue_primary_ident_dl_val'/>
-                                                                                               </span>
-                                                                                               <span class='hide_me' id='ue_primary_ident_ssn'>
-                                                                                                       <input type='text' id='ue_primary_ident_ssn_1' size='3' maxlength='3'/>
-                                                                                                       <input type='text' id='ue_primary_ident_ssn_2' size='2' maxlength='2'/>
-                                                                                                       <input type='text' id='ue_primary_ident_ssn_3' size='4' maxlength='4'/>
-                                                                                               </span>
-                                                                                               <span style='padding-left: 10px;'>Verified 
-                                                                                                       <input id='ue_primary_ident_verified' type='checkbox'/>
-                                                                                               </span>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Secondary Identification Type</div></td>
-                                                                               <td><div class='wide left'>
-                                                                                               <select id='ue_secondary_ident_type'>
-                                                                                                       <option> -- Select One -- </option>
-                                                                                               </select>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Secondary Identification</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input type='text' id='ue_secondary_ident'/>
-                                                                                               <span class='hide_me' id='ue_secondary_ident_dl'>
-                                                                                                       <input type='text' id='ue_secondary_ident_dl_state' size='2' maxlength='2'/>
-                                                                                                       <input type='text' id='ue_secondary_ident_dl_val'/>
-                                                                                               </span>
-                                                                                               <span class='hide_me' id='ue_secondary_ident_ssn'>
-                                                                                                       <input type='text' id='ue_secondary_ident_ssn_1' size='3' maxlength='3'/>
-                                                                                                       <input type='text' id='ue_secondary_ident_ssn_2' size='2' maxlength='2'/>
-                                                                                                       <input type='text' id='ue_secondary_ident_ssn_3' size='4' maxlength='4'/>
-                                                                                               </span>
-                                                                                               <span style='padding-left: 10px;'>Verified 
-                                                                                                       <input id='ue_secondary_ident_verified' type='checkbox'/>
-                                                                                               </span>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-                                               </div>
-
-                                               <!-- ************************************************************** -->
-                                               <!-- Contact Info Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_contact_info' class='main_div hide_me'>
-
-                                                       <table class='uedit_table'>
-                                                               <tbody>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Email Address</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_email1' size='32'/></div></td>
-                                                                       </tr>
-                                                                       <!--
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Verify Email Address</div></td>
-                                                                               <td><div class='wide left'><input type='text' id='ue_email2'/></div></td>
-                                                                       </tr>
-                                                                       -->
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Daytime Phone</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input class='pad' type='text' id='ue_day_phone_area' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_day_phone_prefix' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_day_phone_suffix' maxlength='4' size='4'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Evening Phone</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input class='pad' type='text' id='ue_night_phone_area' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_night_phone_prefix' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_night_phone_suffix' maxlength='4' size='4'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Other/Cell Phone</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input class='pad' type='text' id='ue_other_phone_area' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_other_phone_prefix' maxlength='3' size='3'/>
-                                                                                               <span>-</span>
-                                                                                               <input class='pad' type='text' id='ue_other_phone_suffix' maxlength='4' size='4'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Home Library</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <select style='width: 20em;' id='ue_org_selector'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-                                               </div>
-       
-                                               <!-- ************************************************************** -->
-                                               <!-- Addresses Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_addresses' class='main_div hide_me' >
-                                                       <table class='uedit_table' style='width: 98%; padding: 1px;'>
-                                                               <thead>
-                                                                       <tr>
-                                                                               <td>Address</td>
-                                                                               <td>Incorporated</td>
-                                                                               <td>Valid</td>
-                                                                               <td>Mailing Address</td>
-                                                                               <td>Physical Address</td>
-                                                                       </tr>
-                                                               </thead>
-                                                               <tbody id='ue_address_tbody'>
-                                                                       <tr id='ue_address_template'>
-                                                                               <td>
-                                                                                       <table class='address_table'>
-                                                                                               <tbody>
-                                                                                                       <tr>
-                                                                                                               <td><div class='wide right'>Label</div></td>
-                                                                                                               <td colspan='5'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_label' id='ue_addr_label'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                       </tr>
-                                                                                                       <tr>
-                                                                                                               <td><div class='wide right'>Street 1</div></td>
-                                                                                                               <td colspan='5'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_street1' size='42'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                       </tr>
-                                                                                                       <tr>
-                                                                                                               <td><div class='wide right'>Street 2</div></td>
-                                                                                                               <td colspan='5'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_street2' size='42'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                       </tr>
-                                                                                                       <tr>
-                                                                                                               <td><div class='wide right'>City</div></td>
-                                                                                                               <td colspan='3'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_city' size='17'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                               <td><div class='wide right'>County</div></td>
-                                                                                                               <td colspan='3'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_county' size='17'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                       </tr>
-                                                                                                       <tr>
-                                                                                                               <td><div class='wide right'>State</div></td>
-                                                                                                               <td>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_state' size='2' maxlength='2'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                               <td><div class='wide right'>Zip</div></td>
-                                                                                                               <td>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_zip' size='6' maxlength='6'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                               <td><div class='wide right'>Country</div></td>
-                                                                                                               <td colspan='3'>
-                                                                                                                       <div class='wide left'>
-                                                                                                                               <input type='text' name='ue_addr_country' size='6'/>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                       </tr>
-                                                                                                       <tr>
-                                                                                                               <td colspan='6'>
-                                                                                                                       <div class='button_row'>
-                                                                                                                               <input type='submit' name='ue_addr_delete' 
-                                                                                                                                       value='Delete this Address'
-                                                                                                                                       onclick='uEditRemoveAddress(this);'/>
-                                                                                                               </div>
-                                                                                                       </td>
-                                                                                               </tr>
-
-                                                                                               </tbody>
-                                                                                       </table>
-                                                                               </td>
-                                                                               <td><input type='checkbox' name='ue_addr_inc_yes' checked='checked'/></td>
-                                                                               <td><input type='checkbox' name='ue_addr_valid_yes' checked='checked'/></td>
-                                                                               <td>
-                                                                                       <div style='width: 100%; -moz-border-radius: 8px;'>
-                                                                                               <input type='radio' name='ue_addr_mailing_yes' checked='checked'
-                                                                                                       onclick='uEditAddrHighlight(this, "mailing");'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                               <td>
-                                                                                       <div style='width: 100%; -moz-border-radius: 8px;'>
-                                                                                               <input type='radio' name='ue_addr_billing_yes' checked='checked'
-                                                                                                       onclick='uEditAddrHighlight(this, "billing");'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-
-                                                       <div class='button_row' style='margin-top: 20px;'>
-                                                               <input type='submit' value='Create a New Address' id='ue_address_new'/>
-                                                       </div>
-                                               </div>
-       
-                                               <!-- ************************************************************** -->
-                                               <!-- Groups Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_groups' class='main_div hide_me'>
-                                                       <table class='uedit_table'>
-                                                               <tbody>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Profile Group</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <select id='ue_profile'>
-                                                                                                       <option> -- Required -- </option>
-                                                                                               </select>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr class='required_field'>
-                                                                               <td><div class='wide right'>Account Expiration Date</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input type='text' id='ue_expire' size='10' maxlength='10'/>
-       
-                                                                                               <button style='padding: 0px;' id='ue_expire_trigger'>
-                                                                                                       <img src="/opac/common/js/jscalendar/img.gif" 
-                                                                                                               style="cursor: pointer; border: 1px solid red; padding: 0px; margin: -3px;" 
-                                                                                                               title="Date selector"
-                                                                                                               onmouseover="this.style.background='red';" 
-                                                                                                               onmouseout="this.style.background=''" />
-                                                                                               </button>
-
-                                                                                               <span class='pad' style='font-size: 8pt;'>(YYYY-MM-DD)</span>
-                                                                                               <div style='margin-top: 5px;'>
-                                                                                                       Note: a default will be provided if none is selected
-                                                                                               </div>
-       
-                                                                                               <script type="text/javascript">
-                                                                                                       Calendar.setup({
-                                                                                                               inputField      : "ue_expire",                          // id of the input field
-                                                                                                               ifFormat                : "%Y-%m-%d",                           // format of the input field
-                                                                                                               button          : "ue_expire_trigger",  // trigger for the calendar (button ID)
-                                                                                                               align                   : "Tl",                                         // alignment (defaults to "Bl")
-                                                                                                               singleClick     : true
-                                                                                                       });
-                                                                                               </script>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Active</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input id='ue_active' type='checkbox' checked='checked'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Barred</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input id='ue_barred' type='checkbox'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Set as Family/Group Lead Account</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input id='ue_group_lead' type='checkbox'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Claims Returned Count</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <input id='ue_claims_returned' type='text' disabled='disabled' size='6'/>
-                                                                                               <script>$('ue_claims_returned').value = 0;</script>
-                                                                                               <input class='pad' id='ue_claims_returned_reset' type='submit' value='Reset'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                                       <tr>
-                                                                               <td><div class='wide right'>Alert Message</div></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <textarea wrap='soft' cols='30' rows='4' id='ue_alert_message'/>
-                                                                                               <input class='pad' id='ue_alert_message_reset' 
-                                                                                                       type='submit' value='Clear' onclick='$("ue_alert_message").value = "";'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-                                               </div>
-       
-                                               <!-- ************************************************************** -->
-                                               <!-- Stat Cats Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_stat_cats' class='main_div hide_me'>
-                                                       <table class='uedit_table' style='width: 98%'>
-                                                               <thead>
-                                                                       <tr style='font-weight: bold;'>
-                                                                               <td>Stat Cat Name</td>
-                                                                               <td>Owner</td>
-                                                                               <td>Value</td>
-                                                                       </tr>
-                                                               </thead>
-                                                               <tbody id='ue_stat_cat_tbody'>
-                                                                       <tr id='ue_stat_cat_row'>
-                                                                               <td><div class='wide right' name='ue_stat_cat_name'/></td>
-                                                                               <td><div class='wide right' style='font-size: 8pt' name='ue_stat_cat_owner'/></td>
-                                                                               <td>
-                                                                                       <div class='wide left'>
-                                                                                               <select name='ue_stat_cat_selector'>
-                                                                                                       <option> -- Select One -- </option>
-                                                                                               </select>
-                                                                                               <span class='pad'> or </span>
-                                                                                               <input class='pad' type='text' name='ue_stat_cat_newval'/>
-                                                                                       </div>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-
-                                               </div>
-       
-                                               <!-- ************************************************************** -->
-                                               <!-- Surveys Pane -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_surveys' class='main_div hide_me'>
-                                                       <table id='ue_survey_table' 
-                                                               class='uedit_table data_grid' style='width: 95%; margin-top: 17px;'>
-                                                               <thead>
-                                                                       <tr>
-                                                                               <td colspan='2' style='text-align: left; padding-left: 20px;'>
-                                                                                       <span class='pad' name='ue_survey_name' style='font-weight: bold;'/>
-                                                                                       <span class='pad' name='ue_survey_desc'> : </span>
-                                                                               </td>
-                                                                       </tr>
-                                                               </thead>
-                                                               <tbody name='ue_survey_tbody'>
-                                                                       <tr name='ue_survey_row'>
-                                                                               <td name='ue_survey_question' 
-                                                                                       style='width: 60%; text-align: left; padding-left: 40px;'/>
-                                                                               <td class='hide_me'>
-                                                                                       <select name='ue_survey_answer'>
-                                                                                               <option> -- Select One -- </option>
-                                                                                       </select>
-                                                                               </td>
-                                                                               <td class='hide_me' name='ue_survey_answer_poll'>
-                                                                                       <table>
-                                                                                               <tbody name='ue_survey_answer_poll_tbody'>
-                                                                                                       <tr name='ue_survey_answer_poll_row'>
-                                                                                                               <td>
-                                                                                                                       <div class='right' name='ue_survey_answer_poll_radio'>
-                                                                                                                       </div>
-                                                                                                               </td>
-                                                                                                               <td><div class='left' name='ue_survey_answer_poll_answer'/></td>
-                                                                                                       </tr>
-                                                                                               </tbody>
-                                                                                       </table>
-                                                                               </td>
-                                                                       </tr>
-                                                               </tbody>
-                                                       </table>
-                                               </div>
-
-                                               <!-- ************************************************************** -->
-                                               <!-- Finish Up -->
-                                               <!-- ************************************************************** -->
-                                               <div id='uedit_finalize' class='main_div hide_me'>
-                                                       <div class='has_color' style='width: 95%; margin-top: 40px; text-align: center'>
-                                                               <div style='padding: 5px;'>
-                                                                       You are now ready to save the user to the database.  <br/>
-                                                                       To view or print a summary of the changes, click on the "View Summary" link.  <br/>
-                                                                       To save the user, click on the 'Save User' button.
-                                                               </div>
-                                                               <br/>
-                                                               <a style='margin-right: 30px;' id='ue_view_summary' 
-                                                                       href='javascript:_uEditShowSummary();'>View Summary</a>
-                                                               <input style='margin-left: 30px;' 
-                                                                       type='submit' value='Save User' onclick='uEditSaveUser();'/>
-                                                       </div>
-                                               </div>
-                                       </td>
-                               </tr>
-
-                               <tr>
-                                       <td colspan='2'>
-                                               <!-- ************************************************************** -->
-                                               <!-- Bottome Navigation Links -->
-                                               <!-- ************************************************************** -->
-                                               <table width='100%' class='no_border'>
-                                                       <tbody>
-                                                               <tr id='uedit_nav_bar'>
-                                                                       <td width='10%'/>
-                                                                       <td width='40%'>
-                                                                               <a id='ue_back' class='nav_link hide_me' 
-                                                                                       href='javascript:uEditPrev()'>&lt;&lt; Back</a>
-                                                                       </td>
-                                                                       <td width='40%'>
-                                                                               <a id='ue_fwd' class='nav_link' 
-                                                                                       href='javascript:uEditNext()'>Forward &gt;&gt;</a>
-                                                                       </td>
-                                                                       <td width='10%'/>
-                                                               </tr>
-                                                       </tbody>
-                                               </table>
-                                       </td>
-                               </tr>
-                       </tbody>
-               </table>
-       </center>
-
-       <div id='ue_summary_page' class='hide_me'>
-               <table id='ue_summary_table' class='summary_grid' width='55%'>
-                       <style type='text/css'>
-                               .summary_grid { padding: 5px; }
-                               .summary_grid thead tr { background: #E0F0E0; font-weight: bold;}
-                               .summary_grid tbody tr td { border: 1px solid #E0F0E0; }
-                               .hide_me{ visibility: hidden; display: none }
-                               .deleted { background: #FF6666; }
-                       </style>
-                       <thead><tr>
-                               <td colspan='2'>
-                                       <span>User Summary Information (Deleted items are marked in</span>
-                                       <span class='deleted'>color</span><span>)</span>
-                               </td>
-                       </tr></thead>
-                       <tbody name='ue_summary_page_tbody'>
-                               <tr>
-                                       <td><input type='submit' value='Print Page' onclick='window.print();'/></td>
-                                       <td><input type='submit' value='Close Window' onclick='window.close();'/></td>
-                               </tr>
-                               <tr><td>Username</td><td name='ue_summary_username'/></tr>
-                               <tr><td>First Name</td><td name='ue_summary_firstname'/></tr>
-                               <tr><td>Middle Name</td><td name='ue_summary_middlename'/></tr>
-                               <tr><td>Last Name</td><td name='ue_summary_lastname'/></tr>
-                               <tr><td>Suffix</td><td name='ue_summary_suffix'/></tr>
-                               <tr><td>Date of Birth</td><td name='ue_summary_dob'/></tr>
-                               <tr><td>Primary Identification Type</td><td name='ue_summary_primary_ident_type'/></tr>
-                               <tr><td>Primary Identification</td><td name='ue_summary_primary_ident'/></tr>
-                               <tr><td>Secondary Identification Type</td><td name='ue_summary_secondary_ident_type'/></tr>
-                               <tr><td>Secondary Identification</td><td name='ue_summary_secondary_ident'/></tr>
-                               <tr><td>Email Address</td><td name='ue_summary_email'/></tr>
-                               <tr><td>Day Phone</td><td name='ue_summary_dayphone'/></tr>
-                               <tr><td>Evening Phone</td><td name='ue_summary_nightphone'/></tr>
-                               <tr><td>Other Phone</td><td name='ue_summary_otherphone'/></tr>
-                               <tr><td>Home Library</td><td name='ue_summary_home_lib'/></tr>
-                               <tr>
-                                       <td colspan='2'>
-                                               <table width='100%' style='margin-top: 15px; margin-bottom: 15px;'>
-                                                       <thead><tr><td>Addresses</td></tr></thead>
-                                                       <tbody name='ue_summary_addr_tbody'>
-                                                               <tr name='ue_summary_addr_row'>
-                                                                       <td>
-                                                                               <table name='ue_summary_addr_table' width='100%'>
-                                                                                       <thead><tr><td colspan='4'/><span> </span></tr></thead>
-                                                                                       <tbody>
-                                                                                               <tr>
-                                                                                                       <td>Address Label</td><td name='label'/>
-                                                                                                       <td>Zip Code</td><td name='zip'/>
-                                                                                               </tr>
-                                                                                               <tr>
-                                                                                                       <td>Street1</td><td name='street1'/>
-                                                                                                       <td>Country</td><td name='country'/>
-                                                                                               </tr>
-                                                                                               <tr>
-                                                                                                       <td>Street2</td><td name='street2'/>
-                                                                                                       <td>Mailing</td><td name='mailing'/>
-                                                                                               </tr>
-                                                                                               <tr>
-                                                                                                       <td>City</td><td name='city'/>
-                                                                                                       <td>Billing</td><td name='billing'/>
-                                                                                               </tr>
-                                                                                               <tr>
-                                                                                                       <td>County</td><td name='county'/>
-                                                                                                       <td>Valid</td><td name='valid'/>
-                                                                                               </tr>
-                                                                                               <tr>
-                                                                                                       <td>State</td><td name='state'/>
-                                                                                                       <td>Incorporated</td><td name='incorporated'/>
-                                                                                               </tr>
-                                                                                       </tbody>
-                                                                               </table>
-                                                                       </td>
-                                                               </tr>
-                                                       </tbody>
-                                               </table>
-                                       </td>
-                               </tr>
-                               <tr><td>Profile</td><td name='ue_summary_profile'/></tr>
-                               <tr><td>Expire Date</td><td name='ue_summary_expire'/></tr>
-                               <tr><td>Family Lead Account</td><td name='ue_summary_family_lead'/></tr>
-                               <tr><td>Claims Returned Count</td><td name='ue_summary_claims_returned'/></tr>
-                               <tr><td>Alert Message</td><td name='ue_summary_alert_message'/></tr>
-                               <tr name='ue_summary_stat_cat_td'>
-                                       <td colspan='2' >
-                                               <table width='100%' style='margin-top: 15px; margin-bottom: 15px;'>
-                                                       <thead><tr><td colspan='2'>Statistical Categories</td></tr></thead>
-                                                       <tbody name='ue_summary_stats_tbody'>
-                                                               <tr class='hide_me' name='ue_summary_stat_cat_none'>
-                                                                       <td colspan='2'>No Stat Cats have been set</td>
-                                                               </tr>
-                                                               <tr name='ue_summary_stats_row'>
-                                                                       <td name='ue_summary_stat_name'/><td name='ue_summary_stat_value'/>
-                                                               </tr>
-                                                       </tbody>
-                                               </table>
-                                       </td>
-                               </tr>
-                               <tr name='ue_summary_survey_td'>
-                                       <td colspan='2'>
-                                               <table width='100%' style='margin-top: 15px; margin-bottom: 15px;'>
-                                                       <thead><tr><td>Survey</td><td>Question</td><td>Answer</td></tr></thead>
-                                                       <tbody name='ue_summary_survey_tbody'>
-
-                                                               <tr class='hide_me' name='ue_summary_survey_none'>
-                                                                       <td colspan='3'>No new survey entries were created</td>
-                                                               </tr>
-
-                                                               <tr name='ue_summary_survey_row'>
-                                                                       <td name='ue_summary_survey_name'/>
-                                                                       <td name='ue_summary_survey_question'/>
-                                                                       <td name='ue_summary_survey_answer'/>
-                                                               </tr>
-                                                       </tbody>
-                                               </table>
-                                       </td>
-                               </tr>
-                               <tr name='ue_summary_errors_row' class='hide_me'>
-                                       <td colspan='2'>
-                                               <table width='100%' style='margin-top: 15px; margin-bottom: 15px;'>
-                                                       <thead>
-                                                               <tr>
-                                                                       <td style='color: red;' ><b>Errors you would see if you saved now...</b></td>
-                                                               </tr>
-                                                       </thead>
-                                                       <tbody><tr><td name='ue_summary_errors'/></tr></tbody>
-                                               </table>
-                                       </td>
-                               </tr>
-                               <tr>
-                                       <td><input type='submit' value='Print Page' onclick='window.print();'/></td>
-                                       <td><input type='submit' value='Close Window' onclick='window.close();'/></td>
-                               </tr>
-                       </tbody>
-               </table>
-       </div>
-
-       <!-- ************************************************************** -->
-       <!-- This holds all of the strings we may have to alert to the user -->
-       <!-- ************************************************************** -->
-       <div class='hide_me'>
-               <span id='ue_bad_dob'>The date of birth field is not formatted correctly.  We're expecting YYYY-MM-DD</span>
-               <span id='ue_bad_username'>Username is invalid</span>
-               <span id='ue_bad_password'>Passwords do not match or are invalid</span>
-               <span id='ue_bad_firstname'>First name is invalid</span>
-               <span id='ue_bad_middlename'>Middle name is invalid</span>
-               <span id='ue_bad_lastname'>Last name is invalid</span>
-               <span id='ue_bad_barcode'>Barcode is invalid</span>
-               <span id='ue_duplicate_barcode'>The selected barcode already exists in the database</span>
-               <span id='ue_new_barcode_warn'>
-                       This will de-activate the existing barcode for this user!  If you wish to continue, 
-                       enter the new barcode below.  Otherwise, click the Cancel button.
-               </span>
-               <span id='ue_no_ident'>You must select two types of identification</span>
-               <span id='ue_bad_email'>The email addresses do not match or are invalid</span>
-               <span id='ue_bad_phone'>An invalid phone number was entered</span>
-               <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>
-               <span id='ue_bad_addr_city'>Address city is invalid</span>
-               <span id='ue_bad_addr_county'>Address county is invalid</span>
-               <span id='ue_bad_addr_state'>Address state is invalid</span>
-               <span id='ue_bad_addr_country'>Address country is invalid</span>
-               <span id='ue_bad_addr_zip'>Address zip is invalid</span>
-               <span id='ue_delete_addr_warn'>
-                       This will remove this address from the user.  
-                       Are you sure you wish to continue?
-               </span>
-               <span id='yes'>Yes</span>
-               <span id='no'>No</span>
-               <span id='ue_summary_window'>Patron Summary</span>
-               <span id='ue_success'>User update succeeded</span>
-       </div>
-
-       </body>
-</html>
-
index aaaee6a..945635c 100644 (file)
@@ -14,67 +14,66 @@ patron.util.mbts_columns = function(modify,params) {
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
        JSAN.use('util.money'); JSAN.use('util.date');
 
-       function getString(s) { return data.entities[s]; }
-
+    var commonStrings = document.getElementById('commonStrings');
 
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : 'Id', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'usr', 'label' : 'User', 'flex' : 1,
+                       '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() : ""; },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_type', 'label' : 'Type', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'balance_owed', 'label' : 'Balance Owed', 'flex' : 1,
+                       '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',
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'total_owed', 'label' : 'Total Billed', 'flex' : 1,
+                       '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',
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'total_paid', 'label' : 'Total Paid', 'flex' : 1,
+                       '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',
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_billing_note', 'label' : 'Last Billing Note', 'flex' : 2,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_billing_type', 'label' : 'Last Billing Type', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_billing_ts', 'label' : 'Last Billed', 'flex' : 1,
+                       '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(), "" ); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_payment_note', 'label' : 'Last Payment Note', 'flex' : 2,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_payment_type', 'label' : 'Last Payment Type', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'last_payment_ts', 'label' : 'Last Payment', 'flex' : 1,
+                       '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(), "" ); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_start', 'label' : 'Created', 'flex' : 1,
+                       '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) : ""; },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact_finish', 'label' : 'Closed', 'flex' : 1,
+                       '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) : ""; },
                },
        ];
@@ -113,45 +112,44 @@ patron.util.mb_columns = function(modify,params) {
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
        JSAN.use('util.money'); JSAN.use('util.date');
 
-       function getString(s) { return data.entities[s]; }
-
+    var commonStrings = document.getElementById('commonStrings');
 
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : 'Id', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'voided', 'label' : 'Voided', 'flex' : 1,
+                       '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"; },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'voider', 'label' : 'Voider', 'flex' : 1,
+                       '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() : ""; },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'void_time', 'label' : 'Void Time', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'amount', 'label' : 'Amount', 'flex' : 1,
+                       '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',
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'billing_type', 'label' : 'Type', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'billing_ts', 'label' : 'When', 'flex' : 1,
+                       '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(), "" ); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'note', 'label' : 'Note', 'flex' : 2,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'xact', 'label' : 'Transaction ID', 'flex' : 1,
+                       '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(); },
                },
        ];
@@ -191,41 +189,40 @@ patron.util.mp_columns = function(modify,params) {
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
        JSAN.use('util.money'); JSAN.use('util.date'); JSAN.use('patron.util');
 
-       function getString(s) { return data.entities[s]; }
-
+    var commonStrings = document.getElementById('commonStrings');
 
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_id', 'label' : 'ID', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_amount', 'label' : 'Amount', 'flex' : 1,
+                       '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',
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_payment_type', 'label' : 'Type', 'flex' : 1,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_payment_ts', 'label' : 'When', 'flex' : 1,
+                       '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(), "" ); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_note', 'label' : 'Note', 'flex' : 2,
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_ws', 'label' : 'Workstation', 'flex' : 1,
+                       '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(); }, 
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_staff', 'label' : 'Staff', '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.card().barcode() + " @ " + data.hash.aou[ s.home_ou() ].shortname(); },
+                       '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(); },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'mp_xact', 'label' : 'Transaction ID', 'flex' : 1,
+                       '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(); },
                },
        ];
@@ -264,125 +261,129 @@ patron.util.columns = function(modify,params) {
        
        JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
 
-       function getString(s) { return data.entities[s]; }
+    var commonStrings = document.getElementById('commonStrings');
 
        var c = [
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'barcode', 'label' : 'Barcode', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'usrname', 'label' : 'Login Name', 'flex' : 1, 
-                       'primary' : false, 'hidden' : true, 'render' : function(my) { my.au.usrname(); },
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'profile', 'label' : 'Group', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'active', 'label' : getString('staff.au_label_active'), 'flex' : 1, 
+                       '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"; },
                },
                {
-                       'persist' : 'hidden width ordinal', 'id' : 'barred', 'label' : 'Barred', 'flex' : 1,
+                       '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"; },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : getString('staff.au_label_id'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'prefix', 'label' : getString('staff.au_label_prefix'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'family_name', 'label' : getString('staff.au_label_family_name'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'first_given_name', 'label' : getString('staff.au_label_first_given_name'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'second_given_name', 'label' : getString('staff.au_label_second_given_name'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'suffix', 'label' : getString('staff.au_label_suffix'), 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'alert_message', 'label' : 'Alert', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'claims_returned_count', 'label' : 'Returns Claimed', 'flex' : 1, 
+                       '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',
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'create_date', 'label' : 'Created On', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'expire_date', 'label' : 'Expires On', 'flex' : 1, 
+                       '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); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'home_ou', 'label' : 'Home Lib', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'credit_forward_balance', 'label' : 'Credit', 'flex' : 1, 
+                       '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(); },
+               },
+               { 
+                       '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',
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'day_phone', 'label' : 'Day Phone', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'evening_phone', 'label' : 'Evening Phone', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'other_phone', 'label' : 'Other Phone', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'email', 'label' : 'Email', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'dob', 'label' : 'Birth Date', 'flex' : 1, 
+                       '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); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'ident_type', 'label' : 'Ident Type', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'ident_value', 'label' : 'Ident Value', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'ident_type2', 'label' : 'Ident Type 2', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'ident_value2', 'label' : 'Ident Value 2', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'net_access_level', 'label' : 'Net Access', 'flex' : 1, 
+                       '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(); },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'master_account', 'label' : 'Group Lead', 'flex' : 1, 
+                       '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"; },
                },
                { 
-                       'persist' : 'hidden width ordinal', 'id' : 'usrgroup', 'label' : 'Group ID', 'flex' : 1, 
+                       '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(); },
                },
        ];
@@ -416,29 +417,7 @@ patron.util.columns = function(modify,params) {
        }
        return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
 }
-/*
-patron.util.std_map_row_to_column = function(error_value) {
-       return function(row,col) {
-               // row contains { 'my' : { 'au' : {} } }
-               // col contains one of the objects listed above in columns
-               
-               var obj = {}; obj.OpenILS = {}; 
-               JSAN.use('util.error'); obj.error = new util.error();
-               JSAN.use('OpenILS.data'); obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
-               JSAN.use('util.date'); JSAN.use('util.money');
 
-               var my = row.my;
-               var value;
-               try { 
-                       value = eval( col.render );
-               } catch(E) {
-                       obj.error.sdump('D_WARN','map_row_to_column: ' + E);
-                       if (error_value) { value = error_value; } else { value = '   ' };
-               }
-               return value;
-       }
-}
-*/
 patron.util.std_map_row_to_columns = function(error_value) {
        return function(row,cols) {
                // row contains { 'my' : { 'au' : {} } }
@@ -455,7 +434,7 @@ patron.util.std_map_row_to_columns = function(error_value) {
                try { 
                        for (var i = 0; i < cols.length; i++) {
                                switch (typeof cols[i].render) {
-                                       case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; dump(E+'\n'); } break;
+                                       case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; obj.error.sdump('D_COLUMN_RENDER_ERROR',E); } break;
                                        case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break;
                                        default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; ';
                                }
@@ -505,7 +484,7 @@ patron.util.retrieve_fleshed_au_via_barcode = function(session, id) {
        JSAN.use('util.network');
        var network = new util.network();
        var patron_obj = network.simple_request(
-               'FM_AU_RETRIEVE_VIA_BARCODE',
+               'FM_AU_RETRIEVE_VIA_BARCODE.authoritative',
                [ session, id ]
        );
        patron.util.set_penalty_css(patron_obj);
@@ -546,10 +525,10 @@ patron.util.set_penalty_css = function(patron) {
                                                        removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_3');
 
                JSAN.use('util.network'); var net = new util.network();
-               net.simple_request('FM_MOUS_RETRIEVE',[ ses(), patron.id() ], function(req) {
+               net.simple_request('FM_MOUS_RETRIEVE.authoritative',[ ses(), patron.id() ], function(req) {
                        if (req.getResultObject().balance_owed() > 0) addCSSClass(document.documentElement,'PATRON_HAS_BILLS');
                });
-               net.simple_request('FM_CIRC_COUNT_RETRIEVE_VIA_USER',[ ses(), patron.id() ], function(req) {
+               net.simple_request('FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',[ ses(), patron.id() ], function(req) {
                        try {
                                var co = req.getResultObject();
                                if (co.overdue > 0 || co.long_overdue > 0) addCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
@@ -557,7 +536,7 @@ patron.util.set_penalty_css = function(patron) {
                                alert(E);
                        }
                });
-               net.simple_request('FM_AUN_RETRIEVE_ALL',[ ses(), { 'patronid' : patron.id() } ], function(req) {
+               net.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : patron.id() } ], function(req) {
                        var notes = req.getResultObject();
                        if (notes.length > 0) addCSSClass(document.documentElement,'PATRON_HAS_NOTES');
                });
index 78f1ca7..1e35ecd 100644 (file)
@@ -89,3 +89,17 @@ listitem { border-bottom: solid thin black; }
 
 .copy_editor_field_changed { background: lightgreen; }
 
+/*
+ * oops, disable these until the native evergreen catalog z-source is in trunk/ 
+ */
+
+checkbox[id="native-evergreen-catalog_service"] { display: none; }
+textbox[id="native-evergreen-catalog_username"] { display: none; }
+textbox[id="native-evergreen-catalog_password"] { display: none; }
+
+/*
+ * disable Edit Hold Range and Edit Hold Focus by default; should probably be using perms/settings for this
+ */
+.edit_hold_range { display: none; }
+.edit_hold_focus { display: none; }
+
diff --git a/Open-ILS/xul/staff_client/server/skin/media/images/down_arrow.png b/Open-ILS/xul/staff_client/server/skin/media/images/down_arrow.png
new file mode 100644 (file)
index 0000000..e70b9c9
Binary files /dev/null and b/Open-ILS/xul/staff_client/server/skin/media/images/down_arrow.png differ
diff --git a/Open-ILS/xul/staff_client/server/skin/media/images/left_arrow.png b/Open-ILS/xul/staff_client/server/skin/media/images/left_arrow.png
new file mode 100644 (file)
index 0000000..35d0444
Binary files /dev/null and b/Open-ILS/xul/staff_client/server/skin/media/images/left_arrow.png differ
diff --git a/Open-ILS/xul/staff_client/server/skin/media/images/right_arrow.png b/Open-ILS/xul/staff_client/server/skin/media/images/right_arrow.png
new file mode 100644 (file)
index 0000000..33bf674
Binary files /dev/null and b/Open-ILS/xul/staff_client/server/skin/media/images/right_arrow.png differ
diff --git a/Open-ILS/xul/staff_client/server/skin/media/images/up_arrow.png b/Open-ILS/xul/staff_client/server/skin/media/images/up_arrow.png
new file mode 100644 (file)
index 0000000..43140b8
Binary files /dev/null and b/Open-ILS/xul/staff_client/server/skin/media/images/up_arrow.png differ
index 52165d5..3e79ba4 100644 (file)
@@ -1,17 +1,24 @@
+POTSRC=po/en-US
 POOUTDIR=po
 POINDIR=po
 PROJECT=locale
 LOCALE=fr-CA
 DTDDIR=../../Open-ILS/web/opac/locale
-PROPSDIR=../../Open-ILS/xul/staff_client/chrome/locale
+CHROME_PROPSDIR=../../Open-ILS/xul/staff_client/chrome/locale
+SERVER_PROPSDIR=../../Open-ILS/xul/staff_client/server/locale
 FMIDLSRC=../../Open-ILS/examples/fm_IDL.xml
 FMIDLOUT=fm_IDL.pot
 FMIDLENT=fm_IDL.xml
 FMIDLENTITY=fm_IDL.xml.ent
 FMIDLPO=fm_IDL.po
+EVTSRC=../../Open-ILS/src/extras/ils_events.xml
+EVTOUT=ils_events.xml.pot
+EVTPO=ils_events.xml.po
+EVTXML=ils_events.xml
 SQLSRC=../../Open-ILS/src/sql/Pg/950.data.seed-values.sql
-SQLOUT=db.seed.pot
+SQLPOT=db.seed.pot
 SQLPO=db.seed.po
+SQLOUT=950.data.seed-values.sql
 PROGRESS=--progress none
 
 # This Makefile can be used to generate and update PO files for Evergreen,
@@ -30,47 +37,61 @@ PROGRESS=--progress none
 #   make LOCALE=ll-LL updatepo
 #
 # To create a new set of project files (DTDs, JavaScript message catalogs):
-#   make LOCALE=ll-LL updatepo
+#   make LOCALE=ll-LL newproject
 
 # Generate PO files from all POT files in POOUTDIR for locale LOCALE
 newpo: 
-       @pot2po $(PROGRESS) -i $(POOUTDIR) -o $(POOUTDIR)/$(LOCALE) 
+       @pot2po $(PROGRESS) -i $(POTSRC) -o $(POOUTDIR)/$(LOCALE) 
        @echo "Generated new PO files for locale $(LOCALE)"
 
 # Generate a new set of POT files and entityized fieldmapper IDL
-newpot: dtds2pot fmidl2pot fmidl2fmidlent props2pot sql2pot
+newpot: dtds2pot fmidl2pot fmidl2fmidlent ils2pot props2pot sql2pot
        @echo "Generated new POT files"
 
 # Generate DTD, JavaScript message catalogs, fieldmapper IDL,
 # and SQL insert files from PO for locale LOCALE
-newproject: po2dtds po2props po2sql fmidlpo2entity
+newproject: po2dtds po2props po2sql fmidlpo2entity po2ils
        @echo "Generated project files for locale $(LOCALE)"
 
 # Update PO files with new and changed strings from POT files
 updatepo: 
-       @pot2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(POOUTDIR) -t $(POOUTDIR)/$(LOCALE) 2>&1
+       pot2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(POTSRC) -t $(POOUTDIR)/$(LOCALE) 2>&1
        @echo "Updated PO files for locale $(LOCALE)"
 
+# Update PO files with new and changed strings from POT files
+updateopac: 
+       @msgmerge -U $(POOUTDIR)/$(LOCALE)/opac.dtd.po $(POTSRC)/opac.dtd.pot 2>&1
+       @echo "Updated PO file opac.dtd.po for locale $(LOCALE)"
+
 dtds2po:
        @moz2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(DTDDIR)/en-US/ 2>&1
 
 props2po:
-       @moz2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(PROPSDIR)/en-US/ 2>&1
+       @moz2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(CHROME_PROPSDIR)/en-US/ 2>&1
+       @moz2po $(PROGRESS) -o $(POOUTDIR)/$(LOCALE) -i $(SERVER_PROPSDIR)/en-US/ 2>&1
 
 dtds2pot:
-       @moz2po -P $(PROGRESS) -o $(POOUTDIR) -i $(DTDDIR)/en-US/ 2>&1
+       @moz2po -P $(PROGRESS) -o $(POTSRC) -i $(DTDDIR)/en-US/ 2>&1
+
+ils2pot:
+       @scripts/ils_events.py --pot $(EVTSRC) --output $(POTSRC)/$(EVTOUT)
+
+po2ils:
+       @scripts/ils_events.py --create $(POINDIR)/$(LOCALE)/$(EVTPO) --locale $(LOCALE) --output $(PROJECT)/$(LOCALE)/$(EVTXML) 
 
 props2pot:
-       @moz2po -P $(PROGRESS) -o $(POOUTDIR) -i $(PROPSDIR)/en-US/ 2>&1
+       @moz2po -P $(PROGRESS) -o $(POTSRC) -i $(CHROME_PROPSDIR)/en-US/ 2>&1
+       @moz2po -P $(PROGRESS) -o $(POTSRC) -i $(SERVER_PROPSDIR)/en-US/ 2>&1
 
 po2dtds:
        @po2moz $(PROGRESS) -o $(PROJECT)/$(LOCALE) -t $(DTDDIR)/en-US/ -i $(POINDIR)/$(LOCALE) 2>&1
 
 po2props:
-       @po2moz $(PROGRESS) -o $(PROJECT)/$(LOCALE) -t $(PROPSDIR)/en-US/ -i $(POINDIR)/$(LOCALE) 2>&1
+       @po2moz $(PROGRESS) -o $(PROJECT)/$(LOCALE) -t $(CHROME_PROPSDIR)/en-US/ -i $(POINDIR)/$(LOCALE) 2>&1
+       @po2moz $(PROGRESS) -o $(PROJECT)/$(LOCALE) -t $(SERVER_PROPSDIR)/en-US/ -i $(POINDIR)/$(LOCALE) 2>&1
 
 sql2pot:
-       @scripts/db-seed-i18n.py --pot $(SQLSRC) --output $(POOUTDIR)/$(SQLOUT)
+       @scripts/db-seed-i18n.py --pot $(SQLSRC) --output $(POTSRC)/$(SQLPOT)
 
 po2sql:
        scripts/db-seed-i18n.py --sql $(POINDIR)/$(LOCALE)/$(SQLPO) --locale $(LOCALE) --output $(PROJECT)/$(LOCALE)/$(SQLOUT)
@@ -81,8 +102,8 @@ fmidl2fmidlent:
 
 # Generate a POT file for translating the entity values
 fmidl2pot:
-       @scripts/fieldmapper.py --pot $(FMIDLSRC) --output $(POOUTDIR)/$(FMIDLOUT)
+       @scripts/fieldmapper.py --pot $(FMIDLSRC) --output $(POTSRC)/$(FMIDLOUT)
 
 # Generate a set of entity declarations from a PO file
 fmidlpo2entity:
-       @scripts/fieldmapper.py --entity $(POINDIR)/$(FMIDLOUT) --output $(PROJECT)/$(LOCALE)/$(FMIDLENTITY)
+       @scripts/fieldmapper.py --entity $(POINDIR)/$(LOCALE)/$(FMIDLPO) --output $(PROJECT)/$(LOCALE)/$(FMIDLENTITY)
diff --git a/build/i18n/po/admin.properties.pot b/build/i18n/po/admin.properties.pot
deleted file mode 100644 (file)
index 3b62f9a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/admin.properties
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-11-19 13:21-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-#: staff.admin.survey.save_response.label
-msgid "Save this response"
-msgstr ""
-
-#: staff.admin.survey.save_response.accesskey
-msgid "R"
-msgstr ""
diff --git a/build/i18n/po/cat.properties.pot b/build/i18n/po/cat.properties.pot
deleted file mode 100644 (file)
index 96173dd..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/cat.properties
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-11-19 13:21-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-#: cat.bib_record
-msgid "Bib Record: %1$s"
-msgstr ""
-
-#: cat.save_record
-msgid "Save Record"
-msgstr ""
-
-#: cat.save.success
-msgid "Record successfully saved."
-msgstr ""
-
-#: cat.save.failure
-msgid "Record not likely updated."
-msgstr ""
-
-#: cat.record.counter
-msgid "Record %1$s of %2$s"
-msgstr ""
-
-#: cat.preference.error
-msgid "Preference not likely updated."
-msgstr ""
diff --git a/build/i18n/po/circ.properties.pot b/build/i18n/po/circ.properties.pot
deleted file mode 100644 (file)
index 2b42ced..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/circ.properties
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-11-19 13:21-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-#: circ.bad_checkdigit
-msgid "This barcode has a bad check digit."
-msgstr ""
-
-#: circ.barcode.enter
-msgid "Please enter a patron barcode first."
-msgstr ""
-
-#: circ.barcode.warning
-msgid "Barcode Warning"
-msgstr ""
-
-#: circ.standalone
-msgid "Standalone"
-msgstr ""
-
-#: circ.duplicate_scan.msg
-msgid "This barcode has already been scanned."
-msgstr ""
-
-#: circ.duplicate_scan.field
-msgid "Duplicate Scan"
-msgstr ""
-
-#: circ.offline_checkout.nonbarcoded
-msgid "or choose a non-barcoded option..."
-msgstr ""
-
-#: circ.offline_checkout.items
-msgid "Enter the number of items:"
-msgstr ""
-
-#: circ.offline_checkout.download.warning
-msgid ""
-"WARNING: The non-barcode types have not been downloaded from the server.  "
-"You should log in to retrieve these."
-msgstr ""
-
-#: circ.offline_checkout.barcode.flagged.lost
-msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Lost."
-msgstr ""
-
-#: circ.offline_checkout.barcode.flagged.expired
-msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Expired."
-msgstr ""
-
-#: circ.offline_checkout.barcode.flagged.barred
-msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Barred."
-msgstr ""
-
-#: circ.offline_checkout.barcode.flagged.blocked
-msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Blocked."
-msgstr ""
-
-#: circ.offline_checkout.barcode.flagged.unknown
-msgid ""
-"Warning: As of %1$s, this barcode (%2$s) was flagged with an unknown code: "
-"%3$s."
-msgstr ""
-
-#: circ.offline_checkout.date.early
-msgid "Due date needs to be after today."
-msgstr ""
-
-#: circ.offline_checkout.required_field
-msgid "Required Field"
-msgstr ""
-
-#: circ.offline_checkout.valid_count
-msgid "Please try again and enter a valid count."
-msgstr ""
-
-#: circ.offline_checkout.required_value
-msgid "Required Value"
-msgstr ""
-
-#: circ.offline_register.future.birth.date
-msgid "Patron needs to be born yesterday."
-msgstr ""
-
-#: circ.offline_register.invalid.birth.date
-msgid "Happy birthday!  You need to be more than 0 days old."
-msgstr ""
-
-#: circ.offline_register.survey.prompt
-msgid "Choose a response..."
-msgstr ""
-
-#: circ.offline_register.missing.post_code
-msgid "Missing Address : Postal Code"
-msgstr ""
-
-#: circ.offline_register.missing.state
-msgid "Missing Address : State"
-msgstr ""
-
-#: circ.offline_register.missing.city
-msgid "Missing Address : City"
-msgstr ""
-
-#: circ.offline_register.missing.street1
-msgid "Missing Address : Line 1"
-msgstr ""
-
-#: circ.offline_register.missing.ident_value
-msgid "Missing Identification Value"
-msgstr ""
-
-#: circ.offline_register.missing.ident_type
-msgid "Missing Identification Type"
-msgstr ""
-
-#: circ.offline_register.missing.dob
-msgid "Missing Date of Birth"
-msgstr ""
-
-#: circ.offline_register.missing.first_given_name
-msgid "Missing First Name"
-msgstr ""
-
-#: circ.offline_register.missing.family_name
-msgid "Missing Last Name"
-msgstr ""
-
-#: circ.offline_register.missing.passwd
-msgid "Missing Password"
-msgstr ""
-
-#: circ.offline_register.missing.barcode
-msgid "Missing Barcode"
-msgstr ""
-
-#: circ.offline_register.missing.profile
-msgid "Missing Profile"
-msgstr ""
-
-#: circ.offline_register.missing.home_ou
-msgid "Missing Home Library"
-msgstr ""
-
-#: circ.offline_register.missing.alert
-msgid "Please fix the following:"
-msgstr ""
-
-#: circ.offline_register.patron.saved
-msgid "Patron Registration Saved"
-msgstr ""
-
-#: circ.offline_register.missing.library.list
-msgid "Missing library list."
-msgstr ""
-
-#: circ.offline_register.missing.profile.list
-msgid "Missing profile list."
-msgstr ""
-
-#: circ.offline_register.missing.id.type.list
-msgid "Missing identification type list."
-msgstr ""
-
-#: circ.offline_register.missing.required.surveys
-msgid "Missing required surveys."
-msgstr ""
-
-#: circ.offline_register.missing.files.error
-msgid ""
-"ERROR: Offline patron registration requires some server-generated files.  "
-"Please login periodically to retrieve these files."
-msgstr ""
diff --git a/build/i18n/po/common.properties.pot b/build/i18n/po/common.properties.pot
deleted file mode 100644 (file)
index 5e6a975..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/common.properties
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-11-19 13:21-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-#: common.exception
-msgid ""
-"!! This software has encountered an error.  Please tell your friendly system "
-"administrator or software developer the following:\n"
-"%1$s\n"
-"%2$s\n"
-msgstr ""
-
-#: common.jsan.missing
-msgid "The JSAN library object is missing."
-msgstr ""
-
-#: common.ok
-msgid "Ok"
-msgstr ""
-
-#: common.clear
-msgid "Clear"
-msgstr ""
-
-#: common.confirm
-msgid "Check here to confirm this message."
-msgstr ""
-
-#: common.error.default
-msgid "Please report that this happened."
-msgstr ""
-
-#: common.barcode.status.warning
-msgid "Warning: As of %1$s, this barcode (%2$s) was flagged %3."
-msgstr ""
-
-#: common.barcode.status.warning.lost
-msgid "Lost"
-msgstr ""
-
-#: common.barcode.status.warning.expired
-msgid "Expired"
-msgstr ""
-
-#: common.barcode.status.warning.barred
-msgid "Barred"
-msgstr ""
-
-#: common.barcode.status.warning.blocked
-msgid "Blocked"
-msgstr ""
-
-#: common.barcode.status.warning.unknown
-msgid "with an unknown code: %1$s"
-msgstr ""
-
-#: common.date.invalid
-msgid "Invalid Date"
-msgstr ""
diff --git a/build/i18n/po/db.seed.pot b/build/i18n/po/db.seed.pot
deleted file mode 100644 (file)
index d684da8..0000000
+++ /dev/null
@@ -1,2844 +0,0 @@
-# 
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-12-11 13:27:40-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: config.bib_source:3
-msgid "oclc"
-msgstr ""
-
-#: config.bib_source:4
-msgid "System Local"
-msgstr ""
-
-#: config.bib_source:5
-msgid "Project Gutenberg"
-msgstr ""
-
-#: config.standing:7
-msgid "Good"
-msgstr ""
-
-#: config.standing:8
-msgid "Barred"
-msgstr ""
-
-#: config.non_cataloged_type:30
-msgid "Paperback Book"
-msgstr ""
-
-#: config.identification_type:33
-msgid "Drivers License"
-msgstr ""
-
-#: config.identification_type:34
-msgid "SSN"
-msgstr ""
-
-#: config.identification_type:35
-msgid "Other"
-msgstr ""
-
-#: config.rule_circ_duration:38
-msgid "7_days_0_renew"
-msgstr ""
-
-#: config.rule_circ_duration:39
-msgid "28_days_2_renew"
-msgstr ""
-
-#: config.rule_circ_duration:40
-msgid "3_months_0_renew"
-msgstr ""
-
-#: config.rule_circ_duration:41
-msgid "3_days_1_renew"
-msgstr ""
-
-#: config.rule_circ_duration:42
-msgid "2_months_2_renew"
-msgstr ""
-
-#: config.rule_circ_duration:43
-msgid "35_days_1_renew"
-msgstr ""
-
-#: config.rule_circ_duration:44
-msgid "7_days_2_renew"
-msgstr ""
-
-#: config.rule_circ_duration:45
-msgid "1_hour_2_renew"
-msgstr ""
-
-#: config.rule_circ_duration:46
-msgid "28_days_0_renew"
-msgstr ""
-
-#: config.rule_circ_duration:47
-msgid "14_days_2_renew"
-msgstr ""
-
-#: config.rule_circ_duration:48
-msgid "default"
-msgstr ""
-
-#: config.rule_max_fine:51
-msgid "default"
-msgstr ""
-
-#: config.rule_max_fine:52
-msgid "overdue_min"
-msgstr ""
-
-#: config.rule_max_fine:53
-msgid "overdue_mid"
-msgstr ""
-
-#: config.rule_max_fine:54
-msgid "overdue_max"
-msgstr ""
-
-#: config.rule_max_fine:55
-msgid "overdue_equip_min"
-msgstr ""
-
-#: config.rule_max_fine:56
-msgid "overdue_equip_mid"
-msgstr ""
-
-#: config.rule_max_fine:57
-msgid "overdue_equip_max"
-msgstr ""
-
-#: config.rule_recuring_fine:60
-msgid "default"
-msgstr ""
-
-#: config.rule_recuring_fine:61
-msgid "10_cent_per_day"
-msgstr ""
-
-#: config.rule_recuring_fine:62
-msgid "50_cent_per_day"
-msgstr ""
-
-#: config.rule_age_hold_protect:64
-msgid "3month"
-msgstr ""
-
-#: config.rule_age_hold_protect:65
-msgid "6month"
-msgstr ""
-
-#: config.copy_status:67
-msgid "Available"
-msgstr ""
-
-#: config.copy_status:69
-msgid "Checked out"
-msgstr ""
-
-#: config.copy_status:71
-msgid "Bindery"
-msgstr ""
-
-#: config.copy_status:72
-msgid "Lost"
-msgstr ""
-
-#: config.copy_status:73
-msgid "Missing"
-msgstr ""
-
-#: config.copy_status:75
-msgid "In process"
-msgstr ""
-
-#: config.copy_status:76
-msgid "In transit"
-msgstr ""
-
-#: config.copy_status:77
-msgid "Reshelving"
-msgstr ""
-
-#: config.copy_status:78
-msgid "On holds shelf"
-msgstr ""
-
-#: config.copy_status:79
-msgid "On order"
-msgstr ""
-
-#: config.copy_status:81
-msgid "ILL"
-msgstr ""
-
-#: config.copy_status:82
-msgid "Cataloging"
-msgstr ""
-
-#: config.copy_status:83
-msgid "Reserves"
-msgstr ""
-
-#: config.copy_status:84
-msgid "Discard/Weed"
-msgstr ""
-
-#: config.copy_status:85
-msgid "Damaged"
-msgstr ""
-
-#: config.net_access_level:90
-msgid "Filtered"
-msgstr ""
-
-#: config.net_access_level:91
-msgid "Unfiltered"
-msgstr ""
-
-#: config.net_access_level:92
-msgid "No Access"
-msgstr ""
-
-#: config.audience_map:95
-msgid "Unknown or unspecified"
-msgstr ""
-
-#: config.audience_map:96
-msgid "Preschool"
-msgstr ""
-
-#: config.audience_map:97
-msgid "Primary"
-msgstr ""
-
-#: config.audience_map:98
-msgid "Pre-adolescent"
-msgstr ""
-
-#: config.audience_map:99
-msgid "Adolescent"
-msgstr ""
-
-#: config.audience_map:100
-msgid "Adult"
-msgstr ""
-
-#: config.audience_map:101
-msgid "Specialized"
-msgstr ""
-
-#: config.audience_map:102
-msgid "General"
-msgstr ""
-
-#: config.audience_map:103
-msgid "Juvenile"
-msgstr ""
-
-#: config.lit_form_map:106
-msgid "Not fiction (not further specified)"
-msgstr ""
-
-#: config.lit_form_map:107
-msgid "Fiction (not further specified)"
-msgstr ""
-
-#: config.lit_form_map:108
-msgid "Comic strips"
-msgstr ""
-
-#: config.lit_form_map:109
-msgid "Dramas"
-msgstr ""
-
-#: config.lit_form_map:110
-msgid "Essays"
-msgstr ""
-
-#: config.lit_form_map:111
-msgid "Novels"
-msgstr ""
-
-#: config.lit_form_map:112
-msgid "Humor, satires, etc."
-msgstr ""
-
-#: config.lit_form_map:113
-msgid "Letters"
-msgstr ""
-
-#: config.lit_form_map:114
-msgid "Short stories"
-msgstr ""
-
-#: config.lit_form_map:115
-msgid "Mixed forms"
-msgstr ""
-
-#: config.lit_form_map:116
-msgid "Poetry"
-msgstr ""
-
-#: config.lit_form_map:117
-msgid "Speeches"
-msgstr ""
-
-#: config.lit_form_map:118
-msgid "Unknown"
-msgstr ""
-
-#: config.language_map:122
-msgid "Afar"
-msgstr ""
-
-#: config.language_map:123
-msgid "Abkhaz"
-msgstr ""
-
-#: config.language_map:124
-msgid "Achinese"
-msgstr ""
-
-#: config.language_map:125
-msgid "Acoli"
-msgstr ""
-
-#: config.language_map:126
-msgid "Adangme"
-msgstr ""
-
-#: config.language_map:127
-msgid "Adygei"
-msgstr ""
-
-#: config.language_map:128
-msgid "Afroasiatic (Other)"
-msgstr ""
-
-#: config.language_map:129
-msgid "Afrihili (Artificial language)"
-msgstr ""
-
-#: config.language_map:130
-msgid "Afrikaans"
-msgstr ""
-
-#: config.language_map:131
-msgid "Aljamía"
-msgstr ""
-
-#: config.language_map:132
-msgid "Akan"
-msgstr ""
-
-#: config.language_map:133
-msgid "Akkadian"
-msgstr ""
-
-#: config.language_map:134
-msgid "Albanian"
-msgstr ""
-
-#: config.language_map:135
-msgid "Aleut"
-msgstr ""
-
-#: config.language_map:136
-msgid "Algonquian (Other)"
-msgstr ""
-
-#: config.language_map:137
-msgid "Amharic"
-msgstr ""
-
-#: config.language_map:138
-msgid "English, Old (ca. 450-1100)"
-msgstr ""
-
-#: config.language_map:139
-msgid "Apache languages"
-msgstr ""
-
-#: config.language_map:140
-msgid "Arabic"
-msgstr ""
-
-#: config.language_map:141
-msgid "Aramaic"
-msgstr ""
-
-#: config.language_map:142
-msgid "Aragonese Spanish"
-msgstr ""
-
-#: config.language_map:143
-msgid "Armenian"
-msgstr ""
-
-#: config.language_map:144
-msgid "Mapuche"
-msgstr ""
-
-#: config.language_map:145
-msgid "Arapaho"
-msgstr ""
-
-#: config.language_map:146
-msgid "Artificial (Other)"
-msgstr ""
-
-#: config.language_map:147
-msgid "Arawak"
-msgstr ""
-
-#: config.language_map:148
-msgid "Assamese"
-msgstr ""
-
-#: config.language_map:149
-msgid "Bable"
-msgstr ""
-
-#: config.language_map:150
-msgid "Athapascan (Other)"
-msgstr ""
-
-#: config.language_map:151
-msgid "Australian languages"
-msgstr ""
-
-#: config.language_map:152
-msgid "Avaric"
-msgstr ""
-
-#: config.language_map:153
-msgid "Avestan"
-msgstr ""
-
-#: config.language_map:154
-msgid "Awadhi"
-msgstr ""
-
-#: config.language_map:155
-msgid "Aymara"
-msgstr ""
-
-#: config.language_map:156
-msgid "Azerbaijani"
-msgstr ""
-
-#: config.language_map:157
-msgid "Banda"
-msgstr ""
-
-#: config.language_map:158
-msgid "Bamileke languages"
-msgstr ""
-
-#: config.language_map:159
-msgid "Bashkir"
-msgstr ""
-
-#: config.language_map:160
-msgid "Baluchi"
-msgstr ""
-
-#: config.language_map:161
-msgid "Bambara"
-msgstr ""
-
-#: config.language_map:162
-msgid "Balinese"
-msgstr ""
-
-#: config.language_map:163
-msgid "Basque"
-msgstr ""
-
-#: config.language_map:164
-msgid "Basa"
-msgstr ""
-
-#: config.language_map:165
-msgid "Baltic (Other)"
-msgstr ""
-
-#: config.language_map:166
-msgid "Beja"
-msgstr ""
-
-#: config.language_map:167
-msgid "Belarusian"
-msgstr ""
-
-#: config.language_map:168
-msgid "Bemba"
-msgstr ""
-
-#: config.language_map:169
-msgid "Bengali"
-msgstr ""
-
-#: config.language_map:170
-msgid "Berber (Other)"
-msgstr ""
-
-#: config.language_map:171
-msgid "Bhojpuri"
-msgstr ""
-
-#: config.language_map:172
-msgid "Bihari"
-msgstr ""
-
-#: config.language_map:173
-msgid "Bikol"
-msgstr ""
-
-#: config.language_map:174
-msgid "Edo"
-msgstr ""
-
-#: config.language_map:175
-msgid "Bislama"
-msgstr ""
-
-#: config.language_map:176
-msgid "Siksika"
-msgstr ""
-
-#: config.language_map:177
-msgid "Bantu (Other)"
-msgstr ""
-
-#: config.language_map:178
-msgid "Bosnian"
-msgstr ""
-
-#: config.language_map:179
-msgid "Braj"
-msgstr ""
-
-#: config.language_map:180
-msgid "Breton"
-msgstr ""
-
-#: config.language_map:181
-msgid "Batak"
-msgstr ""
-
-#: config.language_map:182
-msgid "Buriat"
-msgstr ""
-
-#: config.language_map:183
-msgid "Bugis"
-msgstr ""
-
-#: config.language_map:184
-msgid "Bulgarian"
-msgstr ""
-
-#: config.language_map:185
-msgid "Burmese"
-msgstr ""
-
-#: config.language_map:186
-msgid "Caddo"
-msgstr ""
-
-#: config.language_map:187
-msgid "Central American Indian (Other)"
-msgstr ""
-
-#: config.language_map:188
-msgid "Khmer"
-msgstr ""
-
-#: config.language_map:189
-msgid "Carib"
-msgstr ""
-
-#: config.language_map:190
-msgid "Catalan"
-msgstr ""
-
-#: config.language_map:191
-msgid "Caucasian (Other)"
-msgstr ""
-
-#: config.language_map:192
-msgid "Cebuano"
-msgstr ""
-
-#: config.language_map:193
-msgid "Celtic (Other)"
-msgstr ""
-
-#: config.language_map:194
-msgid "Chamorro"
-msgstr ""
-
-#: config.language_map:195
-msgid "Chibcha"
-msgstr ""
-
-#: config.language_map:196
-msgid "Chechen"
-msgstr ""
-
-#: config.language_map:197
-msgid "Chagatai"
-msgstr ""
-
-#: config.language_map:198
-msgid "Chinese"
-msgstr ""
-
-#: config.language_map:199
-msgid "Truk"
-msgstr ""
-
-#: config.language_map:200
-msgid "Mari"
-msgstr ""
-
-#: config.language_map:201
-msgid "Chinook jargon"
-msgstr ""
-
-#: config.language_map:202
-msgid "Choctaw"
-msgstr ""
-
-#: config.language_map:203
-msgid "Chipewyan"
-msgstr ""
-
-#: config.language_map:204
-msgid "Cherokee"
-msgstr ""
-
-#: config.language_map:205
-msgid "Church Slavic"
-msgstr ""
-
-#: config.language_map:206
-msgid "Chuvash"
-msgstr ""
-
-#: config.language_map:207
-msgid "Cheyenne"
-msgstr ""
-
-#: config.language_map:208
-msgid "Chamic languages"
-msgstr ""
-
-#: config.language_map:209
-msgid "Coptic"
-msgstr ""
-
-#: config.language_map:210
-msgid "Cornish"
-msgstr ""
-
-#: config.language_map:211
-msgid "Corsican"
-msgstr ""
-
-#: config.language_map:212
-msgid "Creoles and Pidgins, English-based (Other)"
-msgstr ""
-
-#: config.language_map:213
-msgid "Creoles and Pidgins, French-based (Other)"
-msgstr ""
-
-#: config.language_map:214
-msgid "Creoles and Pidgins, Portuguese-based (Other)"
-msgstr ""
-
-#: config.language_map:215
-msgid "Cree"
-msgstr ""
-
-#: config.language_map:216
-msgid "Crimean Tatar"
-msgstr ""
-
-#: config.language_map:217
-msgid "Creoles and Pidgins (Other)"
-msgstr ""
-
-#: config.language_map:218
-msgid "Cushitic (Other)"
-msgstr ""
-
-#: config.language_map:219
-msgid "Czech"
-msgstr ""
-
-#: config.language_map:220
-msgid "Dakota"
-msgstr ""
-
-#: config.language_map:221
-msgid "Danish"
-msgstr ""
-
-#: config.language_map:222
-msgid "Dargwa"
-msgstr ""
-
-#: config.language_map:223
-msgid "Dayak"
-msgstr ""
-
-#: config.language_map:224
-msgid "Delaware"
-msgstr ""
-
-#: config.language_map:225
-msgid "Slave"
-msgstr ""
-
-#: config.language_map:226
-msgid "Dogrib"
-msgstr ""
-
-#: config.language_map:227
-msgid "Dinka"
-msgstr ""
-
-#: config.language_map:228
-msgid "Divehi"
-msgstr ""
-
-#: config.language_map:229
-msgid "Dogri"
-msgstr ""
-
-#: config.language_map:230
-msgid "Dravidian (Other)"
-msgstr ""
-
-#: config.language_map:231
-msgid "Duala"
-msgstr ""
-
-#: config.language_map:232
-msgid "Dutch, Middle (ca. 1050-1350)"
-msgstr ""
-
-#: config.language_map:233
-msgid "Dutch"
-msgstr ""
-
-#: config.language_map:234
-msgid "Dyula"
-msgstr ""
-
-#: config.language_map:235
-msgid "Dzongkha"
-msgstr ""
-
-#: config.language_map:236
-msgid "Efik"
-msgstr ""
-
-#: config.language_map:237
-msgid "Egyptian"
-msgstr ""
-
-#: config.language_map:238
-msgid "Ekajuk"
-msgstr ""
-
-#: config.language_map:239
-msgid "Elamite"
-msgstr ""
-
-#: config.language_map:240
-msgid "English"
-msgstr ""
-
-#: config.language_map:241
-msgid "English, Middle (1100-1500)"
-msgstr ""
-
-#: config.language_map:242
-msgid "Esperanto"
-msgstr ""
-
-#: config.language_map:243
-msgid "Eskimo languages"
-msgstr ""
-
-#: config.language_map:244
-msgid "Esperanto"
-msgstr ""
-
-#: config.language_map:245
-msgid "Estonian"
-msgstr ""
-
-#: config.language_map:246
-msgid "Ethiopic"
-msgstr ""
-
-#: config.language_map:247
-msgid "Ewe"
-msgstr ""
-
-#: config.language_map:248
-msgid "Ewondo"
-msgstr ""
-
-#: config.language_map:249
-msgid "Fang"
-msgstr ""
-
-#: config.language_map:250
-msgid "Faroese"
-msgstr ""
-
-#: config.language_map:251
-msgid "Faroese"
-msgstr ""
-
-#: config.language_map:252
-msgid "Fanti"
-msgstr ""
-
-#: config.language_map:253
-msgid "Fijian"
-msgstr ""
-
-#: config.language_map:254
-msgid "Finnish"
-msgstr ""
-
-#: config.language_map:255
-msgid "Finno-Ugrian (Other)"
-msgstr ""
-
-#: config.language_map:256
-msgid "Fon"
-msgstr ""
-
-#: config.language_map:257
-msgid "French"
-msgstr ""
-
-#: config.language_map:258
-msgid "Frisian"
-msgstr ""
-
-#: config.language_map:259
-msgid "French, Middle (ca. 1400-1600)"
-msgstr ""
-
-#: config.language_map:260
-msgid "French, Old (ca. 842-1400)"
-msgstr ""
-
-#: config.language_map:261
-msgid "Frisian"
-msgstr ""
-
-#: config.language_map:262
-msgid "Fula"
-msgstr ""
-
-#: config.language_map:263
-msgid "Friulian"
-msgstr ""
-
-#: config.language_map:264
-msgid "Gã"
-msgstr ""
-
-#: config.language_map:265
-msgid "Scottish Gaelic"
-msgstr ""
-
-#: config.language_map:266
-msgid "Galician"
-msgstr ""
-
-#: config.language_map:267
-msgid "Oromo"
-msgstr ""
-
-#: config.language_map:268
-msgid "Gayo"
-msgstr ""
-
-#: config.language_map:269
-msgid "Gbaya"
-msgstr ""
-
-#: config.language_map:270
-msgid "Germanic (Other)"
-msgstr ""
-
-#: config.language_map:271
-msgid "Georgian"
-msgstr ""
-
-#: config.language_map:272
-msgid "German"
-msgstr ""
-
-#: config.language_map:273
-msgid "Ethiopic"
-msgstr ""
-
-#: config.language_map:274
-msgid "Gilbertese"
-msgstr ""
-
-#: config.language_map:275
-msgid "Scottish Gaelic"
-msgstr ""
-
-#: config.language_map:276
-msgid "Irish"
-msgstr ""
-
-#: config.language_map:277
-msgid "Galician"
-msgstr ""
-
-#: config.language_map:278
-msgid "Manx"
-msgstr ""
-
-#: config.language_map:279
-msgid "German, Middle High (ca. 1050-1500)"
-msgstr ""
-
-#: config.language_map:280
-msgid "German, Old High (ca. 750-1050)"
-msgstr ""
-
-#: config.language_map:281
-msgid "Gondi"
-msgstr ""
-
-#: config.language_map:282
-msgid "Gorontalo"
-msgstr ""
-
-#: config.language_map:283
-msgid "Gothic"
-msgstr ""
-
-#: config.language_map:284
-msgid "Grebo"
-msgstr ""
-
-#: config.language_map:285
-msgid "Greek, Ancient (to 1453)"
-msgstr ""
-
-#: config.language_map:286
-msgid "Greek, Modern (1453- )"
-msgstr ""
-
-#: config.language_map:287
-msgid "Guarani"
-msgstr ""
-
-#: config.language_map:288
-msgid "Guarani"
-msgstr ""
-
-#: config.language_map:289
-msgid "Gujarati"
-msgstr ""
-
-#: config.language_map:290
-msgid "Gwich'in"
-msgstr ""
-
-#: config.language_map:291
-msgid "Haida"
-msgstr ""
-
-#: config.language_map:292
-msgid "Haitian French Creole"
-msgstr ""
-
-#: config.language_map:293
-msgid "Hausa"
-msgstr ""
-
-#: config.language_map:294
-msgid "Hawaiian"
-msgstr ""
-
-#: config.language_map:295
-msgid "Hebrew"
-msgstr ""
-
-#: config.language_map:296
-msgid "Herero"
-msgstr ""
-
-#: config.language_map:297
-msgid "Hiligaynon"
-msgstr ""
-
-#: config.language_map:298
-msgid "Himachali"
-msgstr ""
-
-#: config.language_map:299
-msgid "Hindi"
-msgstr ""
-
-#: config.language_map:300
-msgid "Hittite"
-msgstr ""
-
-#: config.language_map:301
-msgid "Hmong"
-msgstr ""
-
-#: config.language_map:302
-msgid "Hiri Motu"
-msgstr ""
-
-#: config.language_map:303
-msgid "Hungarian"
-msgstr ""
-
-#: config.language_map:304
-msgid "Hupa"
-msgstr ""
-
-#: config.language_map:305
-msgid "Iban"
-msgstr ""
-
-#: config.language_map:306
-msgid "Igbo"
-msgstr ""
-
-#: config.language_map:307
-msgid "Icelandic"
-msgstr ""
-
-#: config.language_map:308
-msgid "Ido"
-msgstr ""
-
-#: config.language_map:309
-msgid "Sichuan Yi"
-msgstr ""
-
-#: config.language_map:310
-msgid "Ijo"
-msgstr ""
-
-#: config.language_map:311
-msgid "Inuktitut"
-msgstr ""
-
-#: config.language_map:312
-msgid "Interlingue"
-msgstr ""
-
-#: config.language_map:313
-msgid "Iloko"
-msgstr ""
-
-#: config.language_map:314
-msgid "Interlingua (International Auxiliary Language Association)"
-msgstr ""
-
-#: config.language_map:315
-msgid "Indic (Other)"
-msgstr ""
-
-#: config.language_map:316
-msgid "Indonesian"
-msgstr ""
-
-#: config.language_map:317
-msgid "Indo-European (Other)"
-msgstr ""
-
-#: config.language_map:318
-msgid "Ingush"
-msgstr ""
-
-#: config.language_map:319
-msgid "Interlingua (International Auxiliary Language Association)"
-msgstr ""
-
-#: config.language_map:320
-msgid "Inupiaq"
-msgstr ""
-
-#: config.language_map:321
-msgid "Iranian (Other)"
-msgstr ""
-
-#: config.language_map:322
-msgid "Irish"
-msgstr ""
-
-#: config.language_map:323
-msgid "Iroquoian (Other)"
-msgstr ""
-
-#: config.language_map:324
-msgid "Italian"
-msgstr ""
-
-#: config.language_map:325
-msgid "Javanese"
-msgstr ""
-
-#: config.language_map:326
-msgid "Japanese"
-msgstr ""
-
-#: config.language_map:327
-msgid "Judeo-Persian"
-msgstr ""
-
-#: config.language_map:328
-msgid "Judeo-Arabic"
-msgstr ""
-
-#: config.language_map:329
-msgid "Kara-Kalpak"
-msgstr ""
-
-#: config.language_map:330
-msgid "Kabyle"
-msgstr ""
-
-#: config.language_map:331
-msgid "Kachin"
-msgstr ""
-
-#: config.language_map:332
-msgid "Kalâtdlisut"
-msgstr ""
-
-#: config.language_map:333
-msgid "Kamba"
-msgstr ""
-
-#: config.language_map:334
-msgid "Kannada"
-msgstr ""
-
-#: config.language_map:335
-msgid "Karen"
-msgstr ""
-
-#: config.language_map:336
-msgid "Kashmiri"
-msgstr ""
-
-#: config.language_map:337
-msgid "Kanuri"
-msgstr ""
-
-#: config.language_map:338
-msgid "Kawi"
-msgstr ""
-
-#: config.language_map:339
-msgid "Kazakh"
-msgstr ""
-
-#: config.language_map:340
-msgid "Kabardian"
-msgstr ""
-
-#: config.language_map:341
-msgid "Khasi"
-msgstr ""
-
-#: config.language_map:342
-msgid "Khoisan (Other)"
-msgstr ""
-
-#: config.language_map:343
-msgid "Khmer"
-msgstr ""
-
-#: config.language_map:344
-msgid "Khotanese"
-msgstr ""
-
-#: config.language_map:345
-msgid "Kikuyu"
-msgstr ""
-
-#: config.language_map:346
-msgid "Kinyarwanda"
-msgstr ""
-
-#: config.language_map:347
-msgid "Kyrgyz"
-msgstr ""
-
-#: config.language_map:348
-msgid "Kimbundu"
-msgstr ""
-
-#: config.language_map:349
-msgid "Konkani"
-msgstr ""
-
-#: config.language_map:350
-msgid "Komi"
-msgstr ""
-
-#: config.language_map:351
-msgid "Kongo"
-msgstr ""
-
-#: config.language_map:352
-msgid "Korean"
-msgstr ""
-
-#: config.language_map:353
-msgid "Kusaie"
-msgstr ""
-
-#: config.language_map:354
-msgid "Kpelle"
-msgstr ""
-
-#: config.language_map:355
-msgid "Kru"
-msgstr ""
-
-#: config.language_map:356
-msgid "Kurukh"
-msgstr ""
-
-#: config.language_map:357
-msgid "Kuanyama"
-msgstr ""
-
-#: config.language_map:358
-msgid "Kumyk"
-msgstr ""
-
-#: config.language_map:359
-msgid "Kurdish"
-msgstr ""
-
-#: config.language_map:360
-msgid "Kusaie"
-msgstr ""
-
-#: config.language_map:361
-msgid "Kutenai"
-msgstr ""
-
-#: config.language_map:362
-msgid "Ladino"
-msgstr ""
-
-#: config.language_map:363
-msgid "Lahnda"
-msgstr ""
-
-#: config.language_map:364
-msgid "Lamba"
-msgstr ""
-
-#: config.language_map:365
-msgid "Occitan (post-1500)"
-msgstr ""
-
-#: config.language_map:366
-msgid "Lao"
-msgstr ""
-
-#: config.language_map:367
-msgid "Sami"
-msgstr ""
-
-#: config.language_map:368
-msgid "Latin"
-msgstr ""
-
-#: config.language_map:369
-msgid "Latvian"
-msgstr ""
-
-#: config.language_map:370
-msgid "Lezgian"
-msgstr ""
-
-#: config.language_map:371
-msgid "Limburgish"
-msgstr ""
-
-#: config.language_map:372
-msgid "Lingala"
-msgstr ""
-
-#: config.language_map:373
-msgid "Lithuanian"
-msgstr ""
-
-#: config.language_map:374
-msgid "Mongo-Nkundu"
-msgstr ""
-
-#: config.language_map:375
-msgid "Lozi"
-msgstr ""
-
-#: config.language_map:376
-msgid "Letzeburgesch"
-msgstr ""
-
-#: config.language_map:377
-msgid "Luba-Lulua"
-msgstr ""
-
-#: config.language_map:378
-msgid "Luba-Katanga"
-msgstr ""
-
-#: config.language_map:379
-msgid "Ganda"
-msgstr ""
-
-#: config.language_map:380
-msgid "Luiseño"
-msgstr ""
-
-#: config.language_map:381
-msgid "Lunda"
-msgstr ""
-
-#: config.language_map:382
-msgid "Luo (Kenya and Tanzania)"
-msgstr ""
-
-#: config.language_map:383
-msgid "Lushai"
-msgstr ""
-
-#: config.language_map:384
-msgid "Macedonian"
-msgstr ""
-
-#: config.language_map:385
-msgid "Madurese"
-msgstr ""
-
-#: config.language_map:386
-msgid "Magahi"
-msgstr ""
-
-#: config.language_map:387
-msgid "Marshallese"
-msgstr ""
-
-#: config.language_map:388
-msgid "Maithili"
-msgstr ""
-
-#: config.language_map:389
-msgid "Makasar"
-msgstr ""
-
-#: config.language_map:390
-msgid "Malayalam"
-msgstr ""
-
-#: config.language_map:391
-msgid "Mandingo"
-msgstr ""
-
-#: config.language_map:392
-msgid "Maori"
-msgstr ""
-
-#: config.language_map:393
-msgid "Austronesian (Other)"
-msgstr ""
-
-#: config.language_map:394
-msgid "Marathi"
-msgstr ""
-
-#: config.language_map:395
-msgid "Masai"
-msgstr ""
-
-#: config.language_map:396
-msgid "Manx"
-msgstr ""
-
-#: config.language_map:397
-msgid "Malay"
-msgstr ""
-
-#: config.language_map:398
-msgid "Mandar"
-msgstr ""
-
-#: config.language_map:399
-msgid "Mende"
-msgstr ""
-
-#: config.language_map:400
-msgid "Irish, Middle (ca. 1100-1550)"
-msgstr ""
-
-#: config.language_map:401
-msgid "Micmac"
-msgstr ""
-
-#: config.language_map:402
-msgid "Minangkabau"
-msgstr ""
-
-#: config.language_map:403
-msgid "Miscellaneous languages"
-msgstr ""
-
-#: config.language_map:404
-msgid "Mon-Khmer (Other)"
-msgstr ""
-
-#: config.language_map:405
-msgid "Malagasy"
-msgstr ""
-
-#: config.language_map:406
-msgid "Malagasy"
-msgstr ""
-
-#: config.language_map:407
-msgid "Maltese"
-msgstr ""
-
-#: config.language_map:408
-msgid "Manchu"
-msgstr ""
-
-#: config.language_map:409
-msgid "Manipuri"
-msgstr ""
-
-#: config.language_map:410
-msgid "Manobo languages"
-msgstr ""
-
-#: config.language_map:411
-msgid "Mohawk"
-msgstr ""
-
-#: config.language_map:412
-msgid "Moldavian"
-msgstr ""
-
-#: config.language_map:413
-msgid "Mongolian"
-msgstr ""
-
-#: config.language_map:414
-msgid "Mooré"
-msgstr ""
-
-#: config.language_map:415
-msgid "Multiple languages"
-msgstr ""
-
-#: config.language_map:416
-msgid "Munda (Other)"
-msgstr ""
-
-#: config.language_map:417
-msgid "Creek"
-msgstr ""
-
-#: config.language_map:418
-msgid "Marwari"
-msgstr ""
-
-#: config.language_map:419
-msgid "Mayan languages"
-msgstr ""
-
-#: config.language_map:420
-msgid "Nahuatl"
-msgstr ""
-
-#: config.language_map:421
-msgid "North American Indian (Other)"
-msgstr ""
-
-#: config.language_map:422
-msgid "Neapolitan Italian"
-msgstr ""
-
-#: config.language_map:423
-msgid "Nauru"
-msgstr ""
-
-#: config.language_map:424
-msgid "Navajo"
-msgstr ""
-
-#: config.language_map:425
-msgid "Ndebele (South Africa)"
-msgstr ""
-
-#: config.language_map:426
-msgid "Ndebele (Zimbabwe)  "
-msgstr ""
-
-#: config.language_map:427
-msgid "Ndonga"
-msgstr ""
-
-#: config.language_map:428
-msgid "Low German"
-msgstr ""
-
-#: config.language_map:429
-msgid "Nepali"
-msgstr ""
-
-#: config.language_map:430
-msgid "Newari"
-msgstr ""
-
-#: config.language_map:431
-msgid "Nias"
-msgstr ""
-
-#: config.language_map:432
-msgid "Niger-Kordofanian (Other)"
-msgstr ""
-
-#: config.language_map:433
-msgid "Niuean"
-msgstr ""
-
-#: config.language_map:434
-msgid "Norwegian (Nynorsk)"
-msgstr ""
-
-#: config.language_map:435
-msgid "Norwegian (Bokmål)"
-msgstr ""
-
-#: config.language_map:436
-msgid "Nogai"
-msgstr ""
-
-#: config.language_map:437
-msgid "Old Norse"
-msgstr ""
-
-#: config.language_map:438
-msgid "Norwegian"
-msgstr ""
-
-#: config.language_map:439
-msgid "Northern Sotho"
-msgstr ""
-
-#: config.language_map:440
-msgid "Nubian languages"
-msgstr ""
-
-#: config.language_map:441
-msgid "Nyanja"
-msgstr ""
-
-#: config.language_map:442
-msgid "Nyamwezi"
-msgstr ""
-
-#: config.language_map:443
-msgid "Nyankole"
-msgstr ""
-
-#: config.language_map:444
-msgid "Nyoro"
-msgstr ""
-
-#: config.language_map:445
-msgid "Nzima"
-msgstr ""
-
-#: config.language_map:446
-msgid "Occitan (post-1500)"
-msgstr ""
-
-#: config.language_map:447
-msgid "Ojibwa"
-msgstr ""
-
-#: config.language_map:448
-msgid "Oriya"
-msgstr ""
-
-#: config.language_map:449
-msgid "Oromo"
-msgstr ""
-
-#: config.language_map:450
-msgid "Osage"
-msgstr ""
-
-#: config.language_map:451
-msgid "Ossetic"
-msgstr ""
-
-#: config.language_map:452
-msgid "Turkish, Ottoman"
-msgstr ""
-
-#: config.language_map:453
-msgid "Otomian languages"
-msgstr ""
-
-#: config.language_map:454
-msgid "Papuan (Other)"
-msgstr ""
-
-#: config.language_map:455
-msgid "Pangasinan"
-msgstr ""
-
-#: config.language_map:456
-msgid "Pahlavi"
-msgstr ""
-
-#: config.language_map:457
-msgid "Pampanga"
-msgstr ""
-
-#: config.language_map:458
-msgid "Panjabi"
-msgstr ""
-
-#: config.language_map:459
-msgid "Papiamento"
-msgstr ""
-
-#: config.language_map:460
-msgid "Palauan"
-msgstr ""
-
-#: config.language_map:461
-msgid "Old Persian (ca. 600-400 B.C.)"
-msgstr ""
-
-#: config.language_map:462
-msgid "Persian"
-msgstr ""
-
-#: config.language_map:463
-msgid "Philippine (Other)"
-msgstr ""
-
-#: config.language_map:464
-msgid "Phoenician"
-msgstr ""
-
-#: config.language_map:465
-msgid "Pali"
-msgstr ""
-
-#: config.language_map:466
-msgid "Polish"
-msgstr ""
-
-#: config.language_map:467
-msgid "Ponape"
-msgstr ""
-
-#: config.language_map:468
-msgid "Portuguese"
-msgstr ""
-
-#: config.language_map:469
-msgid "Prakrit languages"
-msgstr ""
-
-#: config.language_map:470
-msgid "Provençal (to 1500)"
-msgstr ""
-
-#: config.language_map:471
-msgid "Pushto"
-msgstr ""
-
-#: config.language_map:472
-msgid "Quechua"
-msgstr ""
-
-#: config.language_map:473
-msgid "Rajasthani"
-msgstr ""
-
-#: config.language_map:474
-msgid "Rapanui"
-msgstr ""
-
-#: config.language_map:475
-msgid "Rarotongan"
-msgstr ""
-
-#: config.language_map:476
-msgid "Romance (Other)"
-msgstr ""
-
-#: config.language_map:477
-msgid "Raeto-Romance"
-msgstr ""
-
-#: config.language_map:478
-msgid "Romani"
-msgstr ""
-
-#: config.language_map:479
-msgid "Romanian"
-msgstr ""
-
-#: config.language_map:480
-msgid "Rundi"
-msgstr ""
-
-#: config.language_map:481
-msgid "Russian"
-msgstr ""
-
-#: config.language_map:482
-msgid "Sandawe"
-msgstr ""
-
-#: config.language_map:483
-msgid "Sango (Ubangi Creole)"
-msgstr ""
-
-#: config.language_map:484
-msgid "Yakut"
-msgstr ""
-
-#: config.language_map:485
-msgid "South American Indian (Other)"
-msgstr ""
-
-#: config.language_map:486
-msgid "Salishan languages"
-msgstr ""
-
-#: config.language_map:487
-msgid "Samaritan Aramaic"
-msgstr ""
-
-#: config.language_map:488
-msgid "Sanskrit"
-msgstr ""
-
-#: config.language_map:489
-msgid "Samoan"
-msgstr ""
-
-#: config.language_map:490
-msgid "Sasak"
-msgstr ""
-
-#: config.language_map:491
-msgid "Santali"
-msgstr ""
-
-#: config.language_map:492
-msgid "Serbian"
-msgstr ""
-
-#: config.language_map:493
-msgid "Scots"
-msgstr ""
-
-#: config.language_map:494
-msgid "Croatian"
-msgstr ""
-
-#: config.language_map:495
-msgid "Selkup"
-msgstr ""
-
-#: config.language_map:496
-msgid "Semitic (Other)"
-msgstr ""
-
-#: config.language_map:497
-msgid "Irish, Old (to 1100)"
-msgstr ""
-
-#: config.language_map:498
-msgid "Sign languages"
-msgstr ""
-
-#: config.language_map:499
-msgid "Shan"
-msgstr ""
-
-#: config.language_map:500
-msgid "Shona"
-msgstr ""
-
-#: config.language_map:501
-msgid "Sidamo"
-msgstr ""
-
-#: config.language_map:502
-msgid "Sinhalese"
-msgstr ""
-
-#: config.language_map:503
-msgid "Siouan (Other)"
-msgstr ""
-
-#: config.language_map:504
-msgid "Sino-Tibetan (Other)"
-msgstr ""
-
-#: config.language_map:505
-msgid "Slavic (Other)"
-msgstr ""
-
-#: config.language_map:506
-msgid "Slovak"
-msgstr ""
-
-#: config.language_map:507
-msgid "Slovenian"
-msgstr ""
-
-#: config.language_map:508
-msgid "Southern Sami"
-msgstr ""
-
-#: config.language_map:509
-msgid "Northern Sami"
-msgstr ""
-
-#: config.language_map:510
-msgid "Sami"
-msgstr ""
-
-#: config.language_map:511
-msgid "Lule Sami"
-msgstr ""
-
-#: config.language_map:512
-msgid "Inari Sami"
-msgstr ""
-
-#: config.language_map:513
-msgid "Samoan"
-msgstr ""
-
-#: config.language_map:514
-msgid "Skolt Sami"
-msgstr ""
-
-#: config.language_map:515
-msgid "Shona"
-msgstr ""
-
-#: config.language_map:516
-msgid "Sindhi"
-msgstr ""
-
-#: config.language_map:517
-msgid "Sinhalese"
-msgstr ""
-
-#: config.language_map:518
-msgid "Soninke"
-msgstr ""
-
-#: config.language_map:519
-msgid "Sogdian"
-msgstr ""
-
-#: config.language_map:520
-msgid "Somali"
-msgstr ""
-
-#: config.language_map:521
-msgid "Songhai"
-msgstr ""
-
-#: config.language_map:522
-msgid "Sotho"
-msgstr ""
-
-#: config.language_map:523
-msgid "Spanish"
-msgstr ""
-
-#: config.language_map:524
-msgid "Sardinian"
-msgstr ""
-
-#: config.language_map:525
-msgid "Serer"
-msgstr ""
-
-#: config.language_map:526
-msgid "Nilo-Saharan (Other)"
-msgstr ""
-
-#: config.language_map:527
-msgid "Sotho"
-msgstr ""
-
-#: config.language_map:528
-msgid "Swazi"
-msgstr ""
-
-#: config.language_map:529
-msgid "Sukuma"
-msgstr ""
-
-#: config.language_map:530
-msgid "Sundanese"
-msgstr ""
-
-#: config.language_map:531
-msgid "Susu"
-msgstr ""
-
-#: config.language_map:532
-msgid "Sumerian"
-msgstr ""
-
-#: config.language_map:533
-msgid "Swahili"
-msgstr ""
-
-#: config.language_map:534
-msgid "Swedish"
-msgstr ""
-
-#: config.language_map:535
-msgid "Swazi"
-msgstr ""
-
-#: config.language_map:536
-msgid "Syriac"
-msgstr ""
-
-#: config.language_map:537
-msgid "Tagalog"
-msgstr ""
-
-#: config.language_map:538
-msgid "Tahitian"
-msgstr ""
-
-#: config.language_map:539
-msgid "Tai (Other)"
-msgstr ""
-
-#: config.language_map:540
-msgid "Tajik"
-msgstr ""
-
-#: config.language_map:541
-msgid "Tamil"
-msgstr ""
-
-#: config.language_map:542
-msgid "Tatar"
-msgstr ""
-
-#: config.language_map:543
-msgid "Tatar"
-msgstr ""
-
-#: config.language_map:544
-msgid "Telugu"
-msgstr ""
-
-#: config.language_map:545
-msgid "Temne"
-msgstr ""
-
-#: config.language_map:546
-msgid "Terena"
-msgstr ""
-
-#: config.language_map:547
-msgid "Tetum"
-msgstr ""
-
-#: config.language_map:548
-msgid "Tajik"
-msgstr ""
-
-#: config.language_map:549
-msgid "Tagalog"
-msgstr ""
-
-#: config.language_map:550
-msgid "Thai"
-msgstr ""
-
-#: config.language_map:551
-msgid "Tibetan"
-msgstr ""
-
-#: config.language_map:552
-msgid "Tigré"
-msgstr ""
-
-#: config.language_map:553
-msgid "Tigrinya"
-msgstr ""
-
-#: config.language_map:554
-msgid "Tiv"
-msgstr ""
-
-#: config.language_map:555
-msgid "Tokelauan"
-msgstr ""
-
-#: config.language_map:556
-msgid "Tlingit"
-msgstr ""
-
-#: config.language_map:557
-msgid "Tamashek"
-msgstr ""
-
-#: config.language_map:558
-msgid "Tonga (Nyasa)"
-msgstr ""
-
-#: config.language_map:559
-msgid "Tongan"
-msgstr ""
-
-#: config.language_map:560
-msgid "Tok Pisin"
-msgstr ""
-
-#: config.language_map:561
-msgid "Truk"
-msgstr ""
-
-#: config.language_map:562
-msgid "Tsimshian"
-msgstr ""
-
-#: config.language_map:563
-msgid "Tswana"
-msgstr ""
-
-#: config.language_map:564
-msgid "Tsonga"
-msgstr ""
-
-#: config.language_map:565
-msgid "Tswana"
-msgstr ""
-
-#: config.language_map:566
-msgid "Turkmen"
-msgstr ""
-
-#: config.language_map:567
-msgid "Tumbuka"
-msgstr ""
-
-#: config.language_map:568
-msgid "Tupi languages"
-msgstr ""
-
-#: config.language_map:569
-msgid "Turkish"
-msgstr ""
-
-#: config.language_map:570
-msgid "Altaic (Other)"
-msgstr ""
-
-#: config.language_map:571
-msgid "Tuvaluan"
-msgstr ""
-
-#: config.language_map:572
-msgid "Twi"
-msgstr ""
-
-#: config.language_map:573
-msgid "Tuvinian"
-msgstr ""
-
-#: config.language_map:574
-msgid "Udmurt"
-msgstr ""
-
-#: config.language_map:575
-msgid "Ugaritic"
-msgstr ""
-
-#: config.language_map:576
-msgid "Uighur"
-msgstr ""
-
-#: config.language_map:577
-msgid "Ukrainian"
-msgstr ""
-
-#: config.language_map:578
-msgid "Umbundu"
-msgstr ""
-
-#: config.language_map:579
-msgid "Undetermined"
-msgstr ""
-
-#: config.language_map:580
-msgid "Urdu"
-msgstr ""
-
-#: config.language_map:581
-msgid "Uzbek"
-msgstr ""
-
-#: config.language_map:582
-msgid "Vai"
-msgstr ""
-
-#: config.language_map:583
-msgid "Venda"
-msgstr ""
-
-#: config.language_map:584
-msgid "Vietnamese"
-msgstr ""
-
-#: config.language_map:585
-msgid "Volapük"
-msgstr ""
-
-#: config.language_map:586
-msgid "Votic"
-msgstr ""
-
-#: config.language_map:587
-msgid "Wakashan languages"
-msgstr ""
-
-#: config.language_map:588
-msgid "Walamo"
-msgstr ""
-
-#: config.language_map:589
-msgid "Waray"
-msgstr ""
-
-#: config.language_map:590
-msgid "Washo"
-msgstr ""
-
-#: config.language_map:591
-msgid "Welsh"
-msgstr ""
-
-#: config.language_map:592
-msgid "Sorbian languages"
-msgstr ""
-
-#: config.language_map:593
-msgid "Walloon"
-msgstr ""
-
-#: config.language_map:594
-msgid "Wolof"
-msgstr ""
-
-#: config.language_map:595
-msgid "Kalmyk"
-msgstr ""
-
-#: config.language_map:596
-msgid "Xhosa"
-msgstr ""
-
-#: config.language_map:597
-msgid "Yao (Africa)"
-msgstr ""
-
-#: config.language_map:598
-msgid "Yapese"
-msgstr ""
-
-#: config.language_map:599
-msgid "Yiddish"
-msgstr ""
-
-#: config.language_map:600
-msgid "Yoruba"
-msgstr ""
-
-#: config.language_map:601
-msgid "Yupik languages"
-msgstr ""
-
-#: config.language_map:602
-msgid "Zapotec"
-msgstr ""
-
-#: config.language_map:603
-msgid "Zenaga"
-msgstr ""
-
-#: config.language_map:604
-msgid "Zhuang"
-msgstr ""
-
-#: config.language_map:605
-msgid "Zande"
-msgstr ""
-
-#: config.language_map:606
-msgid "Zulu"
-msgstr ""
-
-#: config.language_map:607
-msgid "Zuni"
-msgstr ""
-
-#: config.item_form_map:610
-msgid "Microfilm"
-msgstr ""
-
-#: config.item_form_map:611
-msgid "Microfiche"
-msgstr ""
-
-#: config.item_form_map:612
-msgid "Microopaque"
-msgstr ""
-
-#: config.item_form_map:613
-msgid "Large print"
-msgstr ""
-
-#: config.item_form_map:614
-msgid "Braille"
-msgstr ""
-
-#: config.item_form_map:615
-msgid "Regular print reproduction"
-msgstr ""
-
-#: config.item_form_map:616
-msgid "Electronic"
-msgstr ""
-
-#: config.item_type_map:619
-msgid "Language material"
-msgstr ""
-
-#: config.item_type_map:620
-msgid "Manuscript language material"
-msgstr ""
-
-#: config.item_type_map:621
-msgid "Projected medium"
-msgstr ""
-
-#: config.item_type_map:622
-msgid "Two-dimensional nonprojectable graphic"
-msgstr ""
-
-#: config.item_type_map:623
-msgid "Three-dimensional artifact or naturally occurring object"
-msgstr ""
-
-#: config.item_type_map:624
-msgid "Kit"
-msgstr ""
-
-#: config.item_type_map:625
-msgid "Mixed materials"
-msgstr ""
-
-#: config.item_type_map:626
-msgid "Cartographic material"
-msgstr ""
-
-#: config.item_type_map:627
-msgid "Manuscript cartographic material"
-msgstr ""
-
-#: config.item_type_map:628
-msgid "Notated music"
-msgstr ""
-
-#: config.item_type_map:629
-msgid "Manuscript notated music"
-msgstr ""
-
-#: config.item_type_map:630
-msgid "Nonmusical sound recording"
-msgstr ""
-
-#: config.item_type_map:631
-msgid "Musical sound recording"
-msgstr ""
-
-#: config.item_type_map:632
-msgid "Computer file"
-msgstr ""
-
-#: actor.org_unit_type:638
-msgid "Consortium"
-msgstr ""
-
-#: actor.org_unit_type:639
-msgid "System"
-msgstr ""
-
-#: actor.org_unit_type:641
-msgid "Branch"
-msgstr ""
-
-#: actor.org_unit_type:642
-msgid "Sub-lib"
-msgstr ""
-
-#: actor.org_unit_type:643
-msgid "Bookmobile"
-msgstr ""
-
-#: actor.org_unit:646
-msgid "Example Consortium"
-msgstr ""
-
-#: actor.org_unit:647
-msgid "Example System 1"
-msgstr ""
-
-#: actor.org_unit:648
-msgid "Example System 2"
-msgstr ""
-
-#: actor.org_unit:649
-msgid "Example Branch 1"
-msgstr ""
-
-#: actor.org_unit:650
-msgid "Example Branch 2"
-msgstr ""
-
-#: actor.org_unit:651
-msgid "Example Branch 3"
-msgstr ""
-
-#: actor.org_unit:652
-msgid "Example Branch 4"
-msgstr ""
-
-#: actor.org_unit:653
-msgid "Example Sub-lib 1"
-msgstr ""
-
-#: actor.org_unit:654
-msgid "Example Bookmobile 1"
-msgstr ""
-
-#: actor.org_address:656
-msgid "123 Main St."
-msgstr ""
-
-#: actor.usr:661
-msgid "Administrator"
-msgstr ""
-
-#: permission.perm_list:674
-msgid "User is allowed to place a hold on a specific copy"
-msgstr ""
-
-#: permission.perm_list:677
-msgid "Allows a user to view another user's holds"
-msgstr ""
-
-#: permission.perm_list:679
-msgid "Allows a user to update another user's hold"
-msgstr ""
-
-#: permission.perm_list:684
-msgid "User is allowed to create new MARC records"
-msgstr ""
-
-#: permission.perm_list:704
-msgid "User may create new billable transactions"
-msgstr ""
-
-#: permission.perm_list:705
-msgid "Allows a user to create a new bill on a transaction"
-msgstr ""
-
-#: permission.perm_list:706
-msgid "Allows a user to view another user's containers (buckets)"
-msgstr ""
-
-#: permission.perm_list:707
-msgid "Allows a user to create a new container for another user"
-msgstr ""
-
-#: permission.perm_list:708
-msgid "User is allowed to create a new copy object"
-msgstr ""
-
-#: permission.perm_list:709
-msgid "Allows a user to change org unit settings"
-msgstr ""
-
-#: permission.perm_list:710
-msgid "Allows a user to see what another use has checked out"
-msgstr ""
-
-#: permission.perm_list:711
-msgid "User may view another user's transactions"
-msgstr ""
-
-#: permission.perm_list:712
-msgid "Allows a user to delete another user container"
-msgstr ""
-
-#: permission.perm_list:713
-msgid "Create a container item for another user"
-msgstr ""
-
-#: permission.perm_list:714
-msgid "User can add other users to permission groups"
-msgstr ""
-
-#: permission.perm_list:715
-msgid "User can remove other users from permission groups"
-msgstr ""
-
-#: permission.perm_list:716
-msgid "Allow user to view others' permission groups"
-msgstr ""
-
-#: permission.perm_list:717
-msgid "Allows a user to determine of another user can checkout an item"
-msgstr ""
-
-#: permission.perm_list:718
-msgid "Allows a user to edit copies in batch"
-msgstr ""
-
-#: permission.perm_list:719
-msgid "User may create a new patron statistical category"
-msgstr ""
-
-#: permission.perm_list:720
-msgid "User may create a copy stat cat"
-msgstr ""
-
-#: permission.perm_list:721
-msgid "User may create a new patron stat cat entry"
-msgstr ""
-
-#: permission.perm_list:722
-msgid "User may create a new copy stat cat entry"
-msgstr ""
-
-#: permission.perm_list:723
-msgid "User may update a patron stat cat"
-msgstr ""
-
-#: permission.perm_list:724
-msgid "User may update a copy stat cat"
-msgstr ""
-
-#: permission.perm_list:725
-msgid "User may update a patron stat cat entry"
-msgstr ""
-
-#: permission.perm_list:726
-msgid "User may update a copy stat cat entry"
-msgstr ""
-
-#: permission.perm_list:727
-msgid "User may link a copy to a stat cat entry"
-msgstr ""
-
-#: permission.perm_list:728
-msgid "User may link another user to a stat cat entry"
-msgstr ""
-
-#: permission.perm_list:729
-msgid "User may delete a patron stat cat"
-msgstr ""
-
-#: permission.perm_list:730
-msgid "User may delete a copy stat cat"
-msgstr ""
-
-#: permission.perm_list:731
-msgid "User may delete a patron stat cat entry"
-msgstr ""
-
-#: permission.perm_list:732
-msgid "User may delete a copy stat cat entry"
-msgstr ""
-
-#: permission.perm_list:733
-msgid "User may delete a patron stat cat entry map"
-msgstr ""
-
-#: permission.perm_list:734
-msgid "User may delete a copy stat cat entry map"
-msgstr ""
-
-#: permission.perm_list:735
-msgid "Allows a user to create a new non-cataloged item type"
-msgstr ""
-
-#: permission.perm_list:736
-msgid "Allows a user to update a non cataloged type"
-msgstr ""
-
-#: permission.perm_list:737
-msgid "Allows a user to create a new in-house-use "
-msgstr ""
-
-#: permission.perm_list:738
-msgid "Allows a user to check out a copy"
-msgstr ""
-
-#: permission.perm_list:739
-msgid "Allows a user to create a new copy location"
-msgstr ""
-
-#: permission.perm_list:740
-msgid "Allows a user to update a copy location"
-msgstr ""
-
-#: permission.perm_list:741
-msgid "Allows a user to delete a copy location"
-msgstr ""
-
-#: permission.perm_list:742
-msgid "Allows a user to create a transit_copy object for transiting a copy"
-msgstr ""
-
-#: permission.perm_list:743
-msgid "Allows a user to close out a transit on a copy"
-msgstr ""
-
-#: permission.perm_list:744
-msgid "Allows a user to see if another user has permission to place a hold on a given copy"
-msgstr ""
-
-#: permission.perm_list:745
-msgid "Allows a user to view which users have checked out a given copy"
-msgstr ""
-
-#: permission.perm_list:746
-msgid "Allows a user to perform z3950 queries against remote servers"
-msgstr ""
-
-#: permission.perm_list:747
-msgid "Allows a user to register a new workstation"
-msgstr ""
-
-#: permission.perm_list:748
-msgid "Allows a user to view all notes attached to a copy"
-msgstr ""
-
-#: permission.perm_list:749
-msgid "Allows a user to view all notes attached to a volume"
-msgstr ""
-
-#: permission.perm_list:750
-msgid "Allows a user to view all notes attached to a title"
-msgstr ""
-
-#: permission.perm_list:751
-msgid "Allows a user to create a new volume note"
-msgstr ""
-
-#: permission.perm_list:752
-msgid "Allows a user to create a new copy note"
-msgstr ""
-
-#: permission.perm_list:753
-msgid "Allows a user to create a new title note"
-msgstr ""
-
-#: permission.perm_list:754
-msgid "Allows a user to delete someone elses copy notes"
-msgstr ""
-
-#: permission.perm_list:755
-msgid "Allows a user to delete someone elses volume note"
-msgstr ""
-
-#: permission.perm_list:756
-msgid "Allows a user to delete someone elses title note"
-msgstr ""
-
-#: permission.perm_list:757
-msgid "Allows a user to update another users container"
-msgstr ""
-
-#: permission.perm_list:758
-msgid "Allows a user to create a container for themselves"
-msgstr ""
-
-#: permission.perm_list:759
-msgid "Allows a user to view notifications attached to a hold"
-msgstr ""
-
-#: permission.perm_list:760
-msgid "Allows a user to create new hold notifications"
-msgstr ""
-
-#: permission.perm_list:761
-msgid "Allows a user to update an org unit setting"
-msgstr ""
-
-#: permission.perm_list:762
-msgid "Allows a user to upload an offline script"
-msgstr ""
-
-#: permission.perm_list:763
-msgid "Allows a user to view uploaded offline script information"
-msgstr ""
-
-#: permission.perm_list:764
-msgid "Allows a user to execute an offline script batch"
-msgstr ""
-
-#: permission.perm_list:765
-msgid "Allows a user to change set the due date on an item to any date"
-msgstr ""
-
-#: permission.perm_list:766
-msgid "Allows a user to bypass the circ permit call for checkout"
-msgstr ""
-
-#: permission.perm_list:767
-msgid "Allows a user to override the copy_is_reference event"
-msgstr ""
-
-#: permission.perm_list:768
-msgid "Allows a user to void a bill"
-msgstr ""
-
-#: permission.perm_list:769
-msgid "Allows a person to check in/out an item that is claims returned"
-msgstr ""
-
-#: permission.perm_list:770
-msgid "Allows a user to check out an item in a non-circulatable status"
-msgstr ""
-
-#: permission.perm_list:771
-msgid "Allows a user to check in/out an item that has an alert message"
-msgstr ""
-
-#: permission.perm_list:772
-msgid "Allows a user to remove the lost status from a copy"
-msgstr ""
-
-#: permission.perm_list:773
-msgid "Allows a user to change the missing status on a copy"
-msgstr ""
-
-#: permission.perm_list:774
-msgid "Allows a user to abort a copy transit if the user is at the transit destination or source"
-msgstr ""
-
-#: permission.perm_list:775
-msgid "Allows a user to abort a copy transit if the user is not at the transit source or dest"
-msgstr ""
-
-#: permission.perm_list:776
-msgid "Allowsa user to query the zip code data method"
-msgstr ""
-
-#: permission.perm_list:778
-msgid "Allows a user to create duplicate holds (e.g. two holds on the same title)"
-msgstr ""
-
-#: permission.perm_list:779
-msgid "Allows a user to update a closed date interval for a given location"
-msgstr ""
-
-#: permission.perm_list:780
-msgid "Allows a user to remove a closed date interval for a given location"
-msgstr ""
-
-#: permission.perm_list:781
-msgid "Allows a user to create a new closed date for a location"
-msgstr ""
-
-#: permission.perm_list:782
-msgid "Allows a user to delete a non cataloged type"
-msgstr ""
-
-#: permission.perm_list:783
-msgid "Allows a user to put someone into collections"
-msgstr ""
-
-#: permission.perm_list:784
-msgid "Allows a user to remove someone from collections"
-msgstr ""
-
-#: permission.perm_list:785
-msgid "Allows a user to bar a patron"
-msgstr ""
-
-#: permission.perm_list:786
-msgid "Allows a user to un-bar a patron"
-msgstr ""
-
-#: permission.perm_list:787
-msgid "Allows a user to remove an existing workstation so a new one can replace it"
-msgstr ""
-
-#: permission.perm_list:788
-msgid "Allows a user to add/remove users to/from the "User" group"
-msgstr ""
-
-#: permission.perm_list:789
-msgid "Allows a user to add/remove users to/from the "Patron" group"
-msgstr ""
-
-#: permission.perm_list:790
-msgid "Allows a user to add/remove users to/from the "Staff" group"
-msgstr ""
-
-#: permission.perm_list:791
-msgid "Allows a user to add/remove users to/from the "Circulator" group"
-msgstr ""
-
-#: permission.perm_list:792
-msgid "Allows a user to add/remove users to/from the "Cataloger" group"
-msgstr ""
-
-#: permission.perm_list:793
-msgid "Allows a user to add/remove users to/from the "GlobalAdmin" group"
-msgstr ""
-
-#: permission.perm_list:794
-msgid "Allows a user to add/remove users to/from the "LocalAdmin" group"
-msgstr ""
-
-#: permission.perm_list:795
-msgid "Allows a user to add/remove users to/from the "LibraryManager" group"
-msgstr ""
-
-#: permission.perm_list:796
-msgid "Allows a user to add/remove users to/from the "Cat1" group"
-msgstr ""
-
-#: permission.perm_list:797
-msgid "Allows a user to add/remove users to/from the "Supercat" group"
-msgstr ""
-
-#: permission.perm_list:798
-msgid "Allows a user to add/remove users to/from the "SIP-Client" group"
-msgstr ""
-
-#: permission.perm_list:799
-msgid "Allows a user to add/remove users to/from the "Vendor" group"
-msgstr ""
-
-#: permission.perm_list:800
-msgid "Allows a user to place a hold on an age-protected item"
-msgstr ""
-
-#: permission.perm_list:801
-msgid "Allows a user to renew an item past the maximun renewal count"
-msgstr ""
-
-#: permission.perm_list:802
-msgid "Allow staff to override checkout count failure"
-msgstr ""
-
-#: permission.perm_list:803
-msgid "Allow staff to override overdue count failure"
-msgstr ""
-
-#: permission.perm_list:804
-msgid "Allow staff to override fine amount checkout failure"
-msgstr ""
-
-#: permission.perm_list:807
-msgid "Allow staff to force checkout of Missing/Lost type items"
-msgstr ""
-
-#: permission.perm_list:808
-msgid "allows users to place multiple holds on a single title"
-msgstr ""
-
-#: permission.perm_list:809
-msgid "Allows a users to run reports"
-msgstr ""
-
-#: permission.perm_list:810
-msgid "Allows a user to share report his own folders"
-msgstr ""
-
-#: permission.perm_list:811
-msgid "Allow user to view report output"
-msgstr ""
-
-#: permission.perm_list:812
-msgid "Allows a user to checkout an item that is marked as non-circ"
-msgstr ""
-
-#: permission.perm_list:813
-msgid "Allows a user to delete an item out of another user's container"
-msgstr ""
-
-#: permission.perm_list:814
-msgid "Allow a staff member to define where another staff member has their permissions"
-msgstr ""
-
-#: asset.copy_location:944
-msgid "Stacks"
-msgstr ""
diff --git a/build/i18n/po/en-US/admin.properties.pot b/build/i18n/po/en-US/admin.properties.pot
new file mode 100644 (file)
index 0000000..8f7aa48
--- /dev/null
@@ -0,0 +1,128 @@
+# extracted from ../../Open-ILS/xul/staff_client/server/locale/en-US/admin.properties
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: staff.admin.font_settings.sound
+msgid "Sound preference saved to file system."
+msgstr ""
+
+#: staff.admin.font_settings.save
+msgid "Global Font saved to file system."
+msgstr ""
+
+#: staff.admin.font_settings.sound.disabled
+msgid "Sound is now disabled."
+msgstr ""
+
+#: staff.admin.font_settings.sound.enabled
+msgid "Sound is now enabled."
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_SMALLER
+msgid "Global Font Adjust set to Smaller than Default"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_DEFAULT
+msgid "Global Font Adjust set to Default"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_LARGER
+msgid "Global Font Adjust set to Larger than Default"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_XX_SMALL
+msgid "Global Font set to XX-Small"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_X_SMALL
+msgid "Global Font set to X-Small"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_SMALL
+msgid "Global Font set to Small"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_MEDIUM
+msgid "Global Font set to Medium"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_LARGE
+msgid "Global Font set to Large"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_X_LARGE
+msgid "Global Font set to X-Large"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_XX_LARGE
+msgid "Global Font set to XX-Large"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_5PT
+msgid "Global Font set to 5pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_6PT
+msgid "Global Font set to 6pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_7PT
+msgid "Global Font set to 7pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_8PT
+msgid "Global Font set to 8pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_9PT
+msgid "Global Font set to 9pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_10PT
+msgid "Global Font set to 10pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_11PT
+msgid "Global Font set to 11pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_12PT
+msgid "Global Font set to 12pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_13PT
+msgid "Global Font set to 13pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_14PT
+msgid "Global Font set to 14pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_15PT
+msgid "Global Font set to 15pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_16PT
+msgid "Global Font set to 16pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_17PT
+msgid "Global Font set to 17pt"
+msgstr ""
+
+#: staff.admin.font_settings.status_msg.ALL_FONTS_18PT
+msgid "Global Font set to 18pt"
+msgstr ""
diff --git a/build/i18n/po/en-US/cat.properties.pot b/build/i18n/po/en-US/cat.properties.pot
new file mode 100644 (file)
index 0000000..cd2d350
--- /dev/null
@@ -0,0 +1,28 @@
+# extracted from ../../Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: cat.barcode_for_item
+msgid "The barcode for the item is %1$s"
+msgstr ""
+
+#: cat.batch_operation_failed
+msgid "The whole batch operation failed. %1$s"
+msgstr ""
+
+#: cat.copy_buckets.tab
+msgid "Copy Buckets"
+msgstr ""
diff --git a/build/i18n/po/en-US/circ.properties.pot b/build/i18n/po/en-US/circ.properties.pot
new file mode 100644 (file)
index 0000000..374879f
--- /dev/null
@@ -0,0 +1,186 @@
+# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/circ.properties
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: circ.bad_checkdigit
+msgid "This barcode has a bad check digit."
+msgstr ""
+
+#: circ.barcode.enter
+msgid "Please enter a patron barcode first."
+msgstr ""
+
+#: circ.barcode.warning
+msgid "Barcode Warning"
+msgstr ""
+
+#: circ.standalone
+msgid "Standalone"
+msgstr ""
+
+#: circ.duplicate_scan.msg
+msgid "This barcode has already been scanned."
+msgstr ""
+
+#: circ.duplicate_scan.field
+msgid "Duplicate Scan"
+msgstr ""
+
+#: circ.offline_checkout.nonbarcoded
+msgid "or choose a non-barcoded option..."
+msgstr ""
+
+#: circ.offline_checkout.items
+msgid "Enter the number of items:"
+msgstr ""
+
+#: circ.offline_checkout.download.warning
+msgid ""
+"WARNING: The non-barcode types have not been downloaded from the server.  "
+"You should log in to retrieve these."
+msgstr ""
+
+#: circ.offline_checkout.barcode.flagged.lost
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Lost."
+msgstr ""
+
+#: circ.offline_checkout.barcode.flagged.expired
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Expired."
+msgstr ""
+
+#: circ.offline_checkout.barcode.flagged.barred
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Barred."
+msgstr ""
+
+#: circ.offline_checkout.barcode.flagged.blocked
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged Blocked."
+msgstr ""
+
+#: circ.offline_checkout.barcode.flagged.unknown
+msgid ""
+"Warning: As of %1$s, this barcode (%2$s) was flagged with an unknown code: "
+"%3$s."
+msgstr ""
+
+#: circ.offline_checkout.date.early
+msgid "Due date needs to be after today."
+msgstr ""
+
+#: circ.offline_checkout.required_field
+msgid "Required Field"
+msgstr ""
+
+#: circ.offline_checkout.valid_count
+msgid "Please try again and enter a valid count."
+msgstr ""
+
+#: circ.offline_checkout.required_value
+msgid "Required Value"
+msgstr ""
+
+#: circ.offline_register.future.birth.date
+msgid "Patron needs to be born yesterday."
+msgstr ""
+
+#: circ.offline_register.invalid.birth.date
+msgid "Happy birthday!  You need to be more than 0 days old."
+msgstr ""
+
+#: circ.offline_register.survey.prompt
+msgid "Choose a response..."
+msgstr ""
+
+#: circ.offline_register.missing.post_code
+msgid "Missing Address : Postal Code"
+msgstr ""
+
+#: circ.offline_register.missing.state
+msgid "Missing Address : State"
+msgstr ""
+
+#: circ.offline_register.missing.city
+msgid "Missing Address : City"
+msgstr ""
+
+#: circ.offline_register.missing.street1
+msgid "Missing Address : Line 1"
+msgstr ""
+
+#: circ.offline_register.missing.ident_value
+msgid "Missing Identification Value"
+msgstr ""
+
+#: circ.offline_register.missing.ident_type
+msgid "Missing Identification Type"
+msgstr ""
+
+#: circ.offline_register.missing.dob
+msgid "Missing Date of Birth"
+msgstr ""
+
+#: circ.offline_register.missing.first_given_name
+msgid "Missing First Name"
+msgstr ""
+
+#: circ.offline_register.missing.family_name
+msgid "Missing Last Name"
+msgstr ""
+
+#: circ.offline_register.missing.passwd
+msgid "Missing Password"
+msgstr ""
+
+#: circ.offline_register.missing.barcode
+msgid "Missing Barcode"
+msgstr ""
+
+#: circ.offline_register.missing.profile
+msgid "Missing Profile"
+msgstr ""
+
+#: circ.offline_register.missing.home_ou
+msgid "Missing Home Library"
+msgstr ""
+
+#: circ.offline_register.missing.alert
+msgid "Please fix the following:"
+msgstr ""
+
+#: circ.offline_register.patron.saved
+msgid "Patron Registration Saved"
+msgstr ""
+
+#: circ.offline_register.missing.library.list
+msgid "Missing library list."
+msgstr ""
+
+#: circ.offline_register.missing.profile.list
+msgid "Missing profile list."
+msgstr ""
+
+#: circ.offline_register.missing.id.type.list
+msgid "Missing identification type list."
+msgstr ""
+
+#: circ.offline_register.missing.required.surveys
+msgid "Missing required surveys."
+msgstr ""
+
+#: circ.offline_register.missing.files.error
+msgid ""
+"ERROR: Offline patron registration requires some server-generated files.  "
+"Please login periodically to retrieve these files."
+msgstr ""
diff --git a/build/i18n/po/en-US/common.properties.pot b/build/i18n/po/en-US/common.properties.pot
new file mode 100644 (file)
index 0000000..dbec423
--- /dev/null
@@ -0,0 +1,72 @@
+# extracted from ../../Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: common.exception
+msgid ""
+"!! This software has encountered an error.  Please tell your friendly system "
+"administrator or software developer the following:\n"
+"%1$s\n"
+"%2$s\n"
+msgstr ""
+
+#: common.jsan.missing
+msgid "The JSAN library object is missing."
+msgstr ""
+
+#: common.ok
+msgid "Ok"
+msgstr ""
+
+#: common.clear
+msgid "Clear"
+msgstr ""
+
+#: common.confirm
+msgid "Check here to confirm this message."
+msgstr ""
+
+#: common.error.default
+msgid "Please report that this happened."
+msgstr ""
+
+#: common.barcode.status.warning
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged %3."
+msgstr ""
+
+#: common.barcode.status.warning.lost
+msgid "Lost"
+msgstr ""
+
+#: common.barcode.status.warning.expired
+msgid "Expired"
+msgstr ""
+
+#: common.barcode.status.warning.barred
+msgid "Barred"
+msgstr ""
+
+#: common.barcode.status.warning.blocked
+msgid "Blocked"
+msgstr ""
+
+#: common.barcode.status.warning.unknown
+msgid "with an unknown code: %1$s"
+msgstr ""
+
+#: common.date.invalid
+msgid "Invalid Date"
+msgstr ""
diff --git a/build/i18n/po/en-US/db.seed.pot b/build/i18n/po/en-US/db.seed.pot
new file mode 100644 (file)
index 0000000..3ced2e4
--- /dev/null
@@ -0,0 +1,2844 @@
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Evergreen 1.4\n"
+"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
+"POT-Creation-Date: 2008-01-20 23:22:24-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: config.bib_source:3
+msgid "oclc"
+msgstr ""
+
+#: config.bib_source:4
+msgid "System Local"
+msgstr ""
+
+#: config.bib_source:5
+msgid "Project Gutenberg"
+msgstr ""
+
+#: config.standing:7
+msgid "Good"
+msgstr ""
+
+#: config.standing:8
+msgid "Barred"
+msgstr ""
+
+#: config.non_cataloged_type:30
+msgid "Paperback Book"
+msgstr ""
+
+#: config.identification_type:33
+msgid "Drivers License"
+msgstr ""
+
+#: config.identification_type:34
+msgid "SSN"
+msgstr ""
+
+#: config.identification_type:35
+msgid "Other"
+msgstr ""
+
+#: config.rule_circ_duration:38
+msgid "7_days_0_renew"
+msgstr ""
+
+#: config.rule_circ_duration:39
+msgid "28_days_2_renew"
+msgstr ""
+
+#: config.rule_circ_duration:40
+msgid "3_months_0_renew"
+msgstr ""
+
+#: config.rule_circ_duration:41
+msgid "3_days_1_renew"
+msgstr ""
+
+#: config.rule_circ_duration:42
+msgid "2_months_2_renew"
+msgstr ""
+
+#: config.rule_circ_duration:43
+msgid "35_days_1_renew"
+msgstr ""
+
+#: config.rule_circ_duration:44
+msgid "7_days_2_renew"
+msgstr ""
+
+#: config.rule_circ_duration:45
+msgid "1_hour_2_renew"
+msgstr ""
+
+#: config.rule_circ_duration:46
+msgid "28_days_0_renew"
+msgstr ""
+
+#: config.rule_circ_duration:47
+msgid "14_days_2_renew"
+msgstr ""
+
+#: config.rule_circ_duration:48
+msgid "default"
+msgstr ""
+
+#: config.rule_max_fine:51
+msgid "default"
+msgstr ""
+
+#: config.rule_max_fine:52
+msgid "overdue_min"
+msgstr ""
+
+#: config.rule_max_fine:53
+msgid "overdue_mid"
+msgstr ""
+
+#: config.rule_max_fine:54
+msgid "overdue_max"
+msgstr ""
+
+#: config.rule_max_fine:55
+msgid "overdue_equip_min"
+msgstr ""
+
+#: config.rule_max_fine:56
+msgid "overdue_equip_mid"
+msgstr ""
+
+#: config.rule_max_fine:57
+msgid "overdue_equip_max"
+msgstr ""
+
+#: config.rule_recuring_fine:60
+msgid "default"
+msgstr ""
+
+#: config.rule_recuring_fine:61
+msgid "10_cent_per_day"
+msgstr ""
+
+#: config.rule_recuring_fine:62
+msgid "50_cent_per_day"
+msgstr ""
+
+#: config.rule_age_hold_protect:64
+msgid "3month"
+msgstr ""
+
+#: config.rule_age_hold_protect:65
+msgid "6month"
+msgstr ""
+
+#: config.copy_status:67
+msgid "Available"
+msgstr ""
+
+#: config.copy_status:69
+msgid "Checked out"
+msgstr ""
+
+#: config.copy_status:71
+msgid "Bindery"
+msgstr ""
+
+#: config.copy_status:72
+msgid "Lost"
+msgstr ""
+
+#: config.copy_status:73
+msgid "Missing"
+msgstr ""
+
+#: config.copy_status:75
+msgid "In process"
+msgstr ""
+
+#: config.copy_status:76
+msgid "In transit"
+msgstr ""
+
+#: config.copy_status:77
+msgid "Reshelving"
+msgstr ""
+
+#: config.copy_status:78
+msgid "On holds shelf"
+msgstr ""
+
+#: config.copy_status:79
+msgid "On order"
+msgstr ""
+
+#: config.copy_status:81
+msgid "ILL"
+msgstr ""
+
+#: config.copy_status:82
+msgid "Cataloging"
+msgstr ""
+
+#: config.copy_status:83
+msgid "Reserves"
+msgstr ""
+
+#: config.copy_status:84
+msgid "Discard/Weed"
+msgstr ""
+
+#: config.copy_status:85
+msgid "Damaged"
+msgstr ""
+
+#: config.net_access_level:90
+msgid "Filtered"
+msgstr ""
+
+#: config.net_access_level:91
+msgid "Unfiltered"
+msgstr ""
+
+#: config.net_access_level:92
+msgid "No Access"
+msgstr ""
+
+#: config.audience_map:95
+msgid "Unknown or unspecified"
+msgstr ""
+
+#: config.audience_map:96
+msgid "Preschool"
+msgstr ""
+
+#: config.audience_map:97
+msgid "Primary"
+msgstr ""
+
+#: config.audience_map:98
+msgid "Pre-adolescent"
+msgstr ""
+
+#: config.audience_map:99
+msgid "Adolescent"
+msgstr ""
+
+#: config.audience_map:100
+msgid "Adult"
+msgstr ""
+
+#: config.audience_map:101
+msgid "Specialized"
+msgstr ""
+
+#: config.audience_map:102
+msgid "General"
+msgstr ""
+
+#: config.audience_map:103
+msgid "Juvenile"
+msgstr ""
+
+#: config.lit_form_map:106
+msgid "Not fiction (not further specified)"
+msgstr ""
+
+#: config.lit_form_map:107
+msgid "Fiction (not further specified)"
+msgstr ""
+
+#: config.lit_form_map:108
+msgid "Comic strips"
+msgstr ""
+
+#: config.lit_form_map:109
+msgid "Dramas"
+msgstr ""
+
+#: config.lit_form_map:110
+msgid "Essays"
+msgstr ""
+
+#: config.lit_form_map:111
+msgid "Novels"
+msgstr ""
+
+#: config.lit_form_map:112
+msgid "Humor, satires, etc."
+msgstr ""
+
+#: config.lit_form_map:113
+msgid "Letters"
+msgstr ""
+
+#: config.lit_form_map:114
+msgid "Short stories"
+msgstr ""
+
+#: config.lit_form_map:115
+msgid "Mixed forms"
+msgstr ""
+
+#: config.lit_form_map:116
+msgid "Poetry"
+msgstr ""
+
+#: config.lit_form_map:117
+msgid "Speeches"
+msgstr ""
+
+#: config.lit_form_map:118
+msgid "Unknown"
+msgstr ""
+
+#: config.language_map:122
+msgid "Afar"
+msgstr ""
+
+#: config.language_map:123
+msgid "Abkhaz"
+msgstr ""
+
+#: config.language_map:124
+msgid "Achinese"
+msgstr ""
+
+#: config.language_map:125
+msgid "Acoli"
+msgstr ""
+
+#: config.language_map:126
+msgid "Adangme"
+msgstr ""
+
+#: config.language_map:127
+msgid "Adygei"
+msgstr ""
+
+#: config.language_map:128
+msgid "Afroasiatic (Other)"
+msgstr ""
+
+#: config.language_map:129
+msgid "Afrihili (Artificial language)"
+msgstr ""
+
+#: config.language_map:130
+msgid "Afrikaans"
+msgstr ""
+
+#: config.language_map:131
+msgid "Aljamía"
+msgstr ""
+
+#: config.language_map:132
+msgid "Akan"
+msgstr ""
+
+#: config.language_map:133
+msgid "Akkadian"
+msgstr ""
+
+#: config.language_map:134
+msgid "Albanian"
+msgstr ""
+
+#: config.language_map:135
+msgid "Aleut"
+msgstr ""
+
+#: config.language_map:136
+msgid "Algonquian (Other)"
+msgstr ""
+
+#: config.language_map:137
+msgid "Amharic"
+msgstr ""
+
+#: config.language_map:138
+msgid "English, Old (ca. 450-1100)"
+msgstr ""
+
+#: config.language_map:139
+msgid "Apache languages"
+msgstr ""
+
+#: config.language_map:140
+msgid "Arabic"
+msgstr ""
+
+#: config.language_map:141
+msgid "Aramaic"
+msgstr ""
+
+#: config.language_map:142
+msgid "Aragonese Spanish"
+msgstr ""
+
+#: config.language_map:143
+msgid "Armenian"
+msgstr ""
+
+#: config.language_map:144
+msgid "Mapuche"
+msgstr ""
+
+#: config.language_map:145
+msgid "Arapaho"
+msgstr ""
+
+#: config.language_map:146
+msgid "Artificial (Other)"
+msgstr ""
+
+#: config.language_map:147
+msgid "Arawak"
+msgstr ""
+
+#: config.language_map:148
+msgid "Assamese"
+msgstr ""
+
+#: config.language_map:149
+msgid "Bable"
+msgstr ""
+
+#: config.language_map:150
+msgid "Athapascan (Other)"
+msgstr ""
+
+#: config.language_map:151
+msgid "Australian languages"
+msgstr ""
+
+#: config.language_map:152
+msgid "Avaric"
+msgstr ""
+
+#: config.language_map:153
+msgid "Avestan"
+msgstr ""
+
+#: config.language_map:154
+msgid "Awadhi"
+msgstr ""
+
+#: config.language_map:155
+msgid "Aymara"
+msgstr ""
+
+#: config.language_map:156
+msgid "Azerbaijani"
+msgstr ""
+
+#: config.language_map:157
+msgid "Banda"
+msgstr ""
+
+#: config.language_map:158
+msgid "Bamileke languages"
+msgstr ""
+
+#: config.language_map:159
+msgid "Bashkir"
+msgstr ""
+
+#: config.language_map:160
+msgid "Baluchi"
+msgstr ""
+
+#: config.language_map:161
+msgid "Bambara"
+msgstr ""
+
+#: config.language_map:162
+msgid "Balinese"
+msgstr ""
+
+#: config.language_map:163
+msgid "Basque"
+msgstr ""
+
+#: config.language_map:164
+msgid "Basa"
+msgstr ""
+
+#: config.language_map:165
+msgid "Baltic (Other)"
+msgstr ""
+
+#: config.language_map:166
+msgid "Beja"
+msgstr ""
+
+#: config.language_map:167
+msgid "Belarusian"
+msgstr ""
+
+#: config.language_map:168
+msgid "Bemba"
+msgstr ""
+
+#: config.language_map:169
+msgid "Bengali"
+msgstr ""
+
+#: config.language_map:170
+msgid "Berber (Other)"
+msgstr ""
+
+#: config.language_map:171
+msgid "Bhojpuri"
+msgstr ""
+
+#: config.language_map:172
+msgid "Bihari"
+msgstr ""
+
+#: config.language_map:173
+msgid "Bikol"
+msgstr ""
+
+#: config.language_map:174
+msgid "Edo"
+msgstr ""
+
+#: config.language_map:175
+msgid "Bislama"
+msgstr ""
+
+#: config.language_map:176
+msgid "Siksika"
+msgstr ""
+
+#: config.language_map:177
+msgid "Bantu (Other)"
+msgstr ""
+
+#: config.language_map:178
+msgid "Bosnian"
+msgstr ""
+
+#: config.language_map:179
+msgid "Braj"
+msgstr ""
+
+#: config.language_map:180
+msgid "Breton"
+msgstr ""
+
+#: config.language_map:181
+msgid "Batak"
+msgstr ""
+
+#: config.language_map:182
+msgid "Buriat"
+msgstr ""
+
+#: config.language_map:183
+msgid "Bugis"
+msgstr ""
+
+#: config.language_map:184
+msgid "Bulgarian"
+msgstr ""
+
+#: config.language_map:185
+msgid "Burmese"
+msgstr ""
+
+#: config.language_map:186
+msgid "Caddo"
+msgstr ""
+
+#: config.language_map:187
+msgid "Central American Indian (Other)"
+msgstr ""
+
+#: config.language_map:188
+msgid "Khmer"
+msgstr ""
+
+#: config.language_map:189
+msgid "Carib"
+msgstr ""
+
+#: config.language_map:190
+msgid "Catalan"
+msgstr ""
+
+#: config.language_map:191
+msgid "Caucasian (Other)"
+msgstr ""
+
+#: config.language_map:192
+msgid "Cebuano"
+msgstr ""
+
+#: config.language_map:193
+msgid "Celtic (Other)"
+msgstr ""
+
+#: config.language_map:194
+msgid "Chamorro"
+msgstr ""
+
+#: config.language_map:195
+msgid "Chibcha"
+msgstr ""
+
+#: config.language_map:196
+msgid "Chechen"
+msgstr ""
+
+#: config.language_map:197
+msgid "Chagatai"
+msgstr ""
+
+#: config.language_map:198
+msgid "Chinese"
+msgstr ""
+
+#: config.language_map:199
+msgid "Truk"
+msgstr ""
+
+#: config.language_map:200
+msgid "Mari"
+msgstr ""
+
+#: config.language_map:201
+msgid "Chinook jargon"
+msgstr ""
+
+#: config.language_map:202
+msgid "Choctaw"
+msgstr ""
+
+#: config.language_map:203
+msgid "Chipewyan"
+msgstr ""
+
+#: config.language_map:204
+msgid "Cherokee"
+msgstr ""
+
+#: config.language_map:205
+msgid "Church Slavic"
+msgstr ""
+
+#: config.language_map:206
+msgid "Chuvash"
+msgstr ""
+
+#: config.language_map:207
+msgid "Cheyenne"
+msgstr ""
+
+#: config.language_map:208
+msgid "Chamic languages"
+msgstr ""
+
+#: config.language_map:209
+msgid "Coptic"
+msgstr ""
+
+#: config.language_map:210
+msgid "Cornish"
+msgstr ""
+
+#: config.language_map:211
+msgid "Corsican"
+msgstr ""
+
+#: config.language_map:212
+msgid "Creoles and Pidgins, English-based (Other)"
+msgstr ""
+
+#: config.language_map:213
+msgid "Creoles and Pidgins, French-based (Other)"
+msgstr ""
+
+#: config.language_map:214
+msgid "Creoles and Pidgins, Portuguese-based (Other)"
+msgstr ""
+
+#: config.language_map:215
+msgid "Cree"
+msgstr ""
+
+#: config.language_map:216
+msgid "Crimean Tatar"
+msgstr ""
+
+#: config.language_map:217
+msgid "Creoles and Pidgins (Other)"
+msgstr ""
+
+#: config.language_map:218
+msgid "Cushitic (Other)"
+msgstr ""
+
+#: config.language_map:219
+msgid "Czech"
+msgstr ""
+
+#: config.language_map:220
+msgid "Dakota"
+msgstr ""
+
+#: config.language_map:221
+msgid "Danish"
+msgstr ""
+
+#: config.language_map:222
+msgid "Dargwa"
+msgstr ""
+
+#: config.language_map:223
+msgid "Dayak"
+msgstr ""
+
+#: config.language_map:224
+msgid "Delaware"
+msgstr ""
+
+#: config.language_map:225
+msgid "Slave"
+msgstr ""
+
+#: config.language_map:226
+msgid "Dogrib"
+msgstr ""
+
+#: config.language_map:227
+msgid "Dinka"
+msgstr ""
+
+#: config.language_map:228
+msgid "Divehi"
+msgstr ""
+
+#: config.language_map:229
+msgid "Dogri"
+msgstr ""
+
+#: config.language_map:230
+msgid "Dravidian (Other)"
+msgstr ""
+
+#: config.language_map:231
+msgid "Duala"
+msgstr ""
+
+#: config.language_map:232
+msgid "Dutch, Middle (ca. 1050-1350)"
+msgstr ""
+
+#: config.language_map:233
+msgid "Dutch"
+msgstr ""
+
+#: config.language_map:234
+msgid "Dyula"
+msgstr ""
+
+#: config.language_map:235
+msgid "Dzongkha"
+msgstr ""
+
+#: config.language_map:236
+msgid "Efik"
+msgstr ""
+
+#: config.language_map:237
+msgid "Egyptian"
+msgstr ""
+
+#: config.language_map:238
+msgid "Ekajuk"
+msgstr ""
+
+#: config.language_map:239
+msgid "Elamite"
+msgstr ""
+
+#: config.language_map:240
+msgid "English"
+msgstr ""
+
+#: config.language_map:241
+msgid "English, Middle (1100-1500)"
+msgstr ""
+
+#: config.language_map:242
+msgid "Esperanto"
+msgstr ""
+
+#: config.language_map:243
+msgid "Eskimo languages"
+msgstr ""
+
+#: config.language_map:244
+msgid "Esperanto"
+msgstr ""
+
+#: config.language_map:245
+msgid "Estonian"
+msgstr ""
+
+#: config.language_map:246
+msgid "Ethiopic"
+msgstr ""
+
+#: config.language_map:247
+msgid "Ewe"
+msgstr ""
+
+#: config.language_map:248
+msgid "Ewondo"
+msgstr ""
+
+#: config.language_map:249
+msgid "Fang"
+msgstr ""
+
+#: config.language_map:250
+msgid "Faroese"
+msgstr ""
+
+#: config.language_map:251
+msgid "Faroese"
+msgstr ""
+
+#: config.language_map:252
+msgid "Fanti"
+msgstr ""
+
+#: config.language_map:253
+msgid "Fijian"
+msgstr ""
+
+#: config.language_map:254
+msgid "Finnish"
+msgstr ""
+
+#: config.language_map:255
+msgid "Finno-Ugrian (Other)"
+msgstr ""
+
+#: config.language_map:256
+msgid "Fon"
+msgstr ""
+
+#: config.language_map:257
+msgid "French"
+msgstr ""
+
+#: config.language_map:258
+msgid "Frisian"
+msgstr ""
+
+#: config.language_map:259
+msgid "French, Middle (ca. 1400-1600)"
+msgstr ""
+
+#: config.language_map:260
+msgid "French, Old (ca. 842-1400)"
+msgstr ""
+
+#: config.language_map:261
+msgid "Frisian"
+msgstr ""
+
+#: config.language_map:262
+msgid "Fula"
+msgstr ""
+
+#: config.language_map:263
+msgid "Friulian"
+msgstr ""
+
+#: config.language_map:264
+msgid "Gã"
+msgstr ""
+
+#: config.language_map:265
+msgid "Scottish Gaelic"
+msgstr ""
+
+#: config.language_map:266
+msgid "Galician"
+msgstr ""
+
+#: config.language_map:267
+msgid "Oromo"
+msgstr ""
+
+#: config.language_map:268
+msgid "Gayo"
+msgstr ""
+
+#: config.language_map:269
+msgid "Gbaya"
+msgstr ""
+
+#: config.language_map:270
+msgid "Germanic (Other)"
+msgstr ""
+
+#: config.language_map:271
+msgid "Georgian"
+msgstr ""
+
+#: config.language_map:272
+msgid "German"
+msgstr ""
+
+#: config.language_map:273
+msgid "Ethiopic"
+msgstr ""
+
+#: config.language_map:274
+msgid "Gilbertese"
+msgstr ""
+
+#: config.language_map:275
+msgid "Scottish Gaelic"
+msgstr ""
+
+#: config.language_map:276
+msgid "Irish"
+msgstr ""
+
+#: config.language_map:277
+msgid "Galician"
+msgstr ""
+
+#: config.language_map:278
+msgid "Manx"
+msgstr ""
+
+#: config.language_map:279
+msgid "German, Middle High (ca. 1050-1500)"
+msgstr ""
+
+#: config.language_map:280
+msgid "German, Old High (ca. 750-1050)"
+msgstr ""
+
+#: config.language_map:281
+msgid "Gondi"
+msgstr ""
+
+#: config.language_map:282
+msgid "Gorontalo"
+msgstr ""
+
+#: config.language_map:283
+msgid "Gothic"
+msgstr ""
+
+#: config.language_map:284
+msgid "Grebo"
+msgstr ""
+
+#: config.language_map:285
+msgid "Greek, Ancient (to 1453)"
+msgstr ""
+
+#: config.language_map:286
+msgid "Greek, Modern (1453- )"
+msgstr ""
+
+#: config.language_map:287
+msgid "Guarani"
+msgstr ""
+
+#: config.language_map:288
+msgid "Guarani"
+msgstr ""
+
+#: config.language_map:289
+msgid "Gujarati"
+msgstr ""
+
+#: config.language_map:290
+msgid "Gwich'in"
+msgstr ""
+
+#: config.language_map:291
+msgid "Haida"
+msgstr ""
+
+#: config.language_map:292
+msgid "Haitian French Creole"
+msgstr ""
+
+#: config.language_map:293
+msgid "Hausa"
+msgstr ""
+
+#: config.language_map:294
+msgid "Hawaiian"
+msgstr ""
+
+#: config.language_map:295
+msgid "Hebrew"
+msgstr ""
+
+#: config.language_map:296
+msgid "Herero"
+msgstr ""
+
+#: config.language_map:297
+msgid "Hiligaynon"
+msgstr ""
+
+#: config.language_map:298
+msgid "Himachali"
+msgstr ""
+
+#: config.language_map:299
+msgid "Hindi"
+msgstr ""
+
+#: config.language_map:300
+msgid "Hittite"
+msgstr ""
+
+#: config.language_map:301
+msgid "Hmong"
+msgstr ""
+
+#: config.language_map:302
+msgid "Hiri Motu"
+msgstr ""
+
+#: config.language_map:303
+msgid "Hungarian"
+msgstr ""
+
+#: config.language_map:304
+msgid "Hupa"
+msgstr ""
+
+#: config.language_map:305
+msgid "Iban"
+msgstr ""
+
+#: config.language_map:306
+msgid "Igbo"
+msgstr ""
+
+#: config.language_map:307
+msgid "Icelandic"
+msgstr ""
+
+#: config.language_map:308
+msgid "Ido"
+msgstr ""
+
+#: config.language_map:309
+msgid "Sichuan Yi"
+msgstr ""
+
+#: config.language_map:310
+msgid "Ijo"
+msgstr ""
+
+#: config.language_map:311
+msgid "Inuktitut"
+msgstr ""
+
+#: config.language_map:312
+msgid "Interlingue"
+msgstr ""
+
+#: config.language_map:313
+msgid "Iloko"
+msgstr ""
+
+#: config.language_map:314
+msgid "Interlingua (International Auxiliary Language Association)"
+msgstr ""
+
+#: config.language_map:315
+msgid "Indic (Other)"
+msgstr ""
+
+#: config.language_map:316
+msgid "Indonesian"
+msgstr ""
+
+#: config.language_map:317
+msgid "Indo-European (Other)"
+msgstr ""
+
+#: config.language_map:318
+msgid "Ingush"
+msgstr ""
+
+#: config.language_map:319
+msgid "Interlingua (International Auxiliary Language Association)"
+msgstr ""
+
+#: config.language_map:320
+msgid "Inupiaq"
+msgstr ""
+
+#: config.language_map:321
+msgid "Iranian (Other)"
+msgstr ""
+
+#: config.language_map:322
+msgid "Irish"
+msgstr ""
+
+#: config.language_map:323
+msgid "Iroquoian (Other)"
+msgstr ""
+
+#: config.language_map:324
+msgid "Italian"
+msgstr ""
+
+#: config.language_map:325
+msgid "Javanese"
+msgstr ""
+
+#: config.language_map:326
+msgid "Japanese"
+msgstr ""
+
+#: config.language_map:327
+msgid "Judeo-Persian"
+msgstr ""
+
+#: config.language_map:328
+msgid "Judeo-Arabic"
+msgstr ""
+
+#: config.language_map:329
+msgid "Kara-Kalpak"
+msgstr ""
+
+#: config.language_map:330
+msgid "Kabyle"
+msgstr ""
+
+#: config.language_map:331
+msgid "Kachin"
+msgstr ""
+
+#: config.language_map:332
+msgid "Kalâtdlisut"
+msgstr ""
+
+#: config.language_map:333
+msgid "Kamba"
+msgstr ""
+
+#: config.language_map:334
+msgid "Kannada"
+msgstr ""
+
+#: config.language_map:335
+msgid "Karen"
+msgstr ""
+
+#: config.language_map:336
+msgid "Kashmiri"
+msgstr ""
+
+#: config.language_map:337
+msgid "Kanuri"
+msgstr ""
+
+#: config.language_map:338
+msgid "Kawi"
+msgstr ""
+
+#: config.language_map:339
+msgid "Kazakh"
+msgstr ""
+
+#: config.language_map:340
+msgid "Kabardian"
+msgstr ""
+
+#: config.language_map:341
+msgid "Khasi"
+msgstr ""
+
+#: config.language_map:342
+msgid "Khoisan (Other)"
+msgstr ""
+
+#: config.language_map:343
+msgid "Khmer"
+msgstr ""
+
+#: config.language_map:344
+msgid "Khotanese"
+msgstr ""
+
+#: config.language_map:345
+msgid "Kikuyu"
+msgstr ""
+
+#: config.language_map:346
+msgid "Kinyarwanda"
+msgstr ""
+
+#: config.language_map:347
+msgid "Kyrgyz"
+msgstr ""
+
+#: config.language_map:348
+msgid "Kimbundu"
+msgstr ""
+
+#: config.language_map:349
+msgid "Konkani"
+msgstr ""
+
+#: config.language_map:350
+msgid "Komi"
+msgstr ""
+
+#: config.language_map:351
+msgid "Kongo"
+msgstr ""
+
+#: config.language_map:352
+msgid "Korean"
+msgstr ""
+
+#: config.language_map:353
+msgid "Kusaie"
+msgstr ""
+
+#: config.language_map:354
+msgid "Kpelle"
+msgstr ""
+
+#: config.language_map:355
+msgid "Kru"
+msgstr ""
+
+#: config.language_map:356
+msgid "Kurukh"
+msgstr ""
+
+#: config.language_map:357
+msgid "Kuanyama"
+msgstr ""
+
+#: config.language_map:358
+msgid "Kumyk"
+msgstr ""
+
+#: config.language_map:359
+msgid "Kurdish"
+msgstr ""
+
+#: config.language_map:360
+msgid "Kusaie"
+msgstr ""
+
+#: config.language_map:361
+msgid "Kutenai"
+msgstr ""
+
+#: config.language_map:362
+msgid "Ladino"
+msgstr ""
+
+#: config.language_map:363
+msgid "Lahnda"
+msgstr ""
+
+#: config.language_map:364
+msgid "Lamba"
+msgstr ""
+
+#: config.language_map:365
+msgid "Occitan (post-1500)"
+msgstr ""
+
+#: config.language_map:366
+msgid "Lao"
+msgstr ""
+
+#: config.language_map:367
+msgid "Sami"
+msgstr ""
+
+#: config.language_map:368
+msgid "Latin"
+msgstr ""
+
+#: config.language_map:369
+msgid "Latvian"
+msgstr ""
+
+#: config.language_map:370
+msgid "Lezgian"
+msgstr ""
+
+#: config.language_map:371
+msgid "Limburgish"
+msgstr ""
+
+#: config.language_map:372
+msgid "Lingala"
+msgstr ""
+
+#: config.language_map:373
+msgid "Lithuanian"
+msgstr ""
+
+#: config.language_map:374
+msgid "Mongo-Nkundu"
+msgstr ""
+
+#: config.language_map:375
+msgid "Lozi"
+msgstr ""
+
+#: config.language_map:376
+msgid "Letzeburgesch"
+msgstr ""
+
+#: config.language_map:377
+msgid "Luba-Lulua"
+msgstr ""
+
+#: config.language_map:378
+msgid "Luba-Katanga"
+msgstr ""
+
+#: config.language_map:379
+msgid "Ganda"
+msgstr ""
+
+#: config.language_map:380
+msgid "Luiseño"
+msgstr ""
+
+#: config.language_map:381
+msgid "Lunda"
+msgstr ""
+
+#: config.language_map:382
+msgid "Luo (Kenya and Tanzania)"
+msgstr ""
+
+#: config.language_map:383
+msgid "Lushai"
+msgstr ""
+
+#: config.language_map:384
+msgid "Macedonian"
+msgstr ""
+
+#: config.language_map:385
+msgid "Madurese"
+msgstr ""
+
+#: config.language_map:386
+msgid "Magahi"
+msgstr ""
+
+#: config.language_map:387
+msgid "Marshallese"
+msgstr ""
+
+#: config.language_map:388
+msgid "Maithili"
+msgstr ""
+
+#: config.language_map:389
+msgid "Makasar"
+msgstr ""
+
+#: config.language_map:390
+msgid "Malayalam"
+msgstr ""
+
+#: config.language_map:391
+msgid "Mandingo"
+msgstr ""
+
+#: config.language_map:392
+msgid "Maori"
+msgstr ""
+
+#: config.language_map:393
+msgid "Austronesian (Other)"
+msgstr ""
+
+#: config.language_map:394
+msgid "Marathi"
+msgstr ""
+
+#: config.language_map:395
+msgid "Masai"
+msgstr ""
+
+#: config.language_map:396
+msgid "Manx"
+msgstr ""
+
+#: config.language_map:397
+msgid "Malay"
+msgstr ""
+
+#: config.language_map:398
+msgid "Mandar"
+msgstr ""
+
+#: config.language_map:399
+msgid "Mende"
+msgstr ""
+
+#: config.language_map:400
+msgid "Irish, Middle (ca. 1100-1550)"
+msgstr ""
+
+#: config.language_map:401
+msgid "Micmac"
+msgstr ""
+
+#: config.language_map:402
+msgid "Minangkabau"
+msgstr ""
+
+#: config.language_map:403
+msgid "Miscellaneous languages"
+msgstr ""
+
+#: config.language_map:404
+msgid "Mon-Khmer (Other)"
+msgstr ""
+
+#: config.language_map:405
+msgid "Malagasy"
+msgstr ""
+
+#: config.language_map:406
+msgid "Malagasy"
+msgstr ""
+
+#: config.language_map:407
+msgid "Maltese"
+msgstr ""
+
+#: config.language_map:408
+msgid "Manchu"
+msgstr ""
+
+#: config.language_map:409
+msgid "Manipuri"
+msgstr ""
+
+#: config.language_map:410
+msgid "Manobo languages"
+msgstr ""
+
+#: config.language_map:411
+msgid "Mohawk"
+msgstr ""
+
+#: config.language_map:412
+msgid "Moldavian"
+msgstr ""
+
+#: config.language_map:413
+msgid "Mongolian"
+msgstr ""
+
+#: config.language_map:414
+msgid "Mooré"
+msgstr ""
+
+#: config.language_map:415
+msgid "Multiple languages"
+msgstr ""
+
+#: config.language_map:416
+msgid "Munda (Other)"
+msgstr ""
+
+#: config.language_map:417
+msgid "Creek"
+msgstr ""
+
+#: config.language_map:418
+msgid "Marwari"
+msgstr ""
+
+#: config.language_map:419
+msgid "Mayan languages"
+msgstr ""
+
+#: config.language_map:420
+msgid "Nahuatl"
+msgstr ""
+
+#: config.language_map:421
+msgid "North American Indian (Other)"
+msgstr ""
+
+#: config.language_map:422
+msgid "Neapolitan Italian"
+msgstr ""
+
+#: config.language_map:423
+msgid "Nauru"
+msgstr ""
+
+#: config.language_map:424
+msgid "Navajo"
+msgstr ""
+
+#: config.language_map:425
+msgid "Ndebele (South Africa)"
+msgstr ""
+
+#: config.language_map:426
+msgid "Ndebele (Zimbabwe)  "
+msgstr ""
+
+#: config.language_map:427
+msgid "Ndonga"
+msgstr ""
+
+#: config.language_map:428
+msgid "Low German"
+msgstr ""
+
+#: config.language_map:429
+msgid "Nepali"
+msgstr ""
+
+#: config.language_map:430
+msgid "Newari"
+msgstr ""
+
+#: config.language_map:431
+msgid "Nias"
+msgstr ""
+
+#: config.language_map:432
+msgid "Niger-Kordofanian (Other)"
+msgstr ""
+
+#: config.language_map:433
+msgid "Niuean"
+msgstr ""
+
+#: config.language_map:434
+msgid "Norwegian (Nynorsk)"
+msgstr ""
+
+#: config.language_map:435
+msgid "Norwegian (Bokmål)"
+msgstr ""
+
+#: config.language_map:436
+msgid "Nogai"
+msgstr ""
+
+#: config.language_map:437
+msgid "Old Norse"
+msgstr ""
+
+#: config.language_map:438
+msgid "Norwegian"
+msgstr ""
+
+#: config.language_map:439
+msgid "Northern Sotho"
+msgstr ""
+
+#: config.language_map:440
+msgid "Nubian languages"
+msgstr ""
+
+#: config.language_map:441
+msgid "Nyanja"
+msgstr ""
+
+#: config.language_map:442
+msgid "Nyamwezi"
+msgstr ""
+
+#: config.language_map:443
+msgid "Nyankole"
+msgstr ""
+
+#: config.language_map:444
+msgid "Nyoro"
+msgstr ""
+
+#: config.language_map:445
+msgid "Nzima"
+msgstr ""
+
+#: config.language_map:446
+msgid "Occitan (post-1500)"
+msgstr ""
+
+#: config.language_map:447
+msgid "Ojibwa"
+msgstr ""
+
+#: config.language_map:448
+msgid "Oriya"
+msgstr ""
+
+#: config.language_map:449
+msgid "Oromo"
+msgstr ""
+
+#: config.language_map:450
+msgid "Osage"
+msgstr ""
+
+#: config.language_map:451
+msgid "Ossetic"
+msgstr ""
+
+#: config.language_map:452
+msgid "Turkish, Ottoman"
+msgstr ""
+
+#: config.language_map:453
+msgid "Otomian languages"
+msgstr ""
+
+#: config.language_map:454
+msgid "Papuan (Other)"
+msgstr ""
+
+#: config.language_map:455
+msgid "Pangasinan"
+msgstr ""
+
+#: config.language_map:456
+msgid "Pahlavi"
+msgstr ""
+
+#: config.language_map:457
+msgid "Pampanga"
+msgstr ""
+
+#: config.language_map:458
+msgid "Panjabi"
+msgstr ""
+
+#: config.language_map:459
+msgid "Papiamento"
+msgstr ""
+
+#: config.language_map:460
+msgid "Palauan"
+msgstr ""
+
+#: config.language_map:461
+msgid "Old Persian (ca. 600-400 B.C.)"
+msgstr ""
+
+#: config.language_map:462
+msgid "Persian"
+msgstr ""
+
+#: config.language_map:463
+msgid "Philippine (Other)"
+msgstr ""
+
+#: config.language_map:464
+msgid "Phoenician"
+msgstr ""
+
+#: config.language_map:465
+msgid "Pali"
+msgstr ""
+
+#: config.language_map:466
+msgid "Polish"
+msgstr ""
+
+#: config.language_map:467
+msgid "Ponape"
+msgstr ""
+
+#: config.language_map:468
+msgid "Portuguese"
+msgstr ""
+
+#: config.language_map:469
+msgid "Prakrit languages"
+msgstr ""
+
+#: config.language_map:470
+msgid "Provençal (to 1500)"
+msgstr ""
+
+#: config.language_map:471
+msgid "Pushto"
+msgstr ""
+
+#: config.language_map:472
+msgid "Quechua"
+msgstr ""
+
+#: config.language_map:473
+msgid "Rajasthani"
+msgstr ""
+
+#: config.language_map:474
+msgid "Rapanui"
+msgstr ""
+
+#: config.language_map:475
+msgid "Rarotongan"
+msgstr ""
+
+#: config.language_map:476
+msgid "Romance (Other)"
+msgstr ""
+
+#: config.language_map:477
+msgid "Raeto-Romance"
+msgstr ""
+
+#: config.language_map:478
+msgid "Romani"
+msgstr ""
+
+#: config.language_map:479
+msgid "Romanian"
+msgstr ""
+
+#: config.language_map:480
+msgid "Rundi"
+msgstr ""
+
+#: config.language_map:481
+msgid "Russian"
+msgstr ""
+
+#: config.language_map:482
+msgid "Sandawe"
+msgstr ""
+
+#: config.language_map:483
+msgid "Sango (Ubangi Creole)"
+msgstr ""
+
+#: config.language_map:484
+msgid "Yakut"
+msgstr ""
+
+#: config.language_map:485
+msgid "South American Indian (Other)"
+msgstr ""
+
+#: config.language_map:486
+msgid "Salishan languages"
+msgstr ""
+
+#: config.language_map:487
+msgid "Samaritan Aramaic"
+msgstr ""
+
+#: config.language_map:488
+msgid "Sanskrit"
+msgstr ""
+
+#: config.language_map:489
+msgid "Samoan"
+msgstr ""
+
+#: config.language_map:490
+msgid "Sasak"
+msgstr ""
+
+#: config.language_map:491
+msgid "Santali"
+msgstr ""
+
+#: config.language_map:492
+msgid "Serbian"
+msgstr ""
+
+#: config.language_map:493
+msgid "Scots"
+msgstr ""
+
+#: config.language_map:494
+msgid "Croatian"
+msgstr ""
+
+#: config.language_map:495
+msgid "Selkup"
+msgstr ""
+
+#: config.language_map:496
+msgid "Semitic (Other)"
+msgstr ""
+
+#: config.language_map:497
+msgid "Irish, Old (to 1100)"
+msgstr ""
+
+#: config.language_map:498
+msgid "Sign languages"
+msgstr ""
+
+#: config.language_map:499
+msgid "Shan"
+msgstr ""
+
+#: config.language_map:500
+msgid "Shona"
+msgstr ""
+
+#: config.language_map:501
+msgid "Sidamo"
+msgstr ""
+
+#: config.language_map:502
+msgid "Sinhalese"
+msgstr ""
+
+#: config.language_map:503
+msgid "Siouan (Other)"
+msgstr ""
+
+#: config.language_map:504
+msgid "Sino-Tibetan (Other)"
+msgstr ""
+
+#: config.language_map:505
+msgid "Slavic (Other)"
+msgstr ""
+
+#: config.language_map:506
+msgid "Slovak"
+msgstr ""
+
+#: config.language_map:507
+msgid "Slovenian"
+msgstr ""
+
+#: config.language_map:508
+msgid "Southern Sami"
+msgstr ""
+
+#: config.language_map:509
+msgid "Northern Sami"
+msgstr ""
+
+#: config.language_map:510
+msgid "Sami"
+msgstr ""
+
+#: config.language_map:511
+msgid "Lule Sami"
+msgstr ""
+
+#: config.language_map:512
+msgid "Inari Sami"
+msgstr ""
+
+#: config.language_map:513
+msgid "Samoan"
+msgstr ""
+
+#: config.language_map:514
+msgid "Skolt Sami"
+msgstr ""
+
+#: config.language_map:515
+msgid "Shona"
+msgstr ""
+
+#: config.language_map:516
+msgid "Sindhi"
+msgstr ""
+
+#: config.language_map:517
+msgid "Sinhalese"
+msgstr ""
+
+#: config.language_map:518
+msgid "Soninke"
+msgstr ""
+
+#: config.language_map:519
+msgid "Sogdian"
+msgstr ""
+
+#: config.language_map:520
+msgid "Somali"
+msgstr ""
+
+#: config.language_map:521
+msgid "Songhai"
+msgstr ""
+
+#: config.language_map:522
+msgid "Sotho"
+msgstr ""
+
+#: config.language_map:523
+msgid "Spanish"
+msgstr ""
+
+#: config.language_map:524
+msgid "Sardinian"
+msgstr ""
+
+#: config.language_map:525
+msgid "Serer"
+msgstr ""
+
+#: config.language_map:526
+msgid "Nilo-Saharan (Other)"
+msgstr ""
+
+#: config.language_map:527
+msgid "Sotho"
+msgstr ""
+
+#: config.language_map:528
+msgid "Swazi"
+msgstr ""
+
+#: config.language_map:529
+msgid "Sukuma"
+msgstr ""
+
+#: config.language_map:530
+msgid "Sundanese"
+msgstr ""
+
+#: config.language_map:531
+msgid "Susu"
+msgstr ""
+
+#: config.language_map:532
+msgid "Sumerian"
+msgstr ""
+
+#: config.language_map:533
+msgid "Swahili"
+msgstr ""
+
+#: config.language_map:534
+msgid "Swedish"
+msgstr ""
+
+#: config.language_map:535
+msgid "Swazi"
+msgstr ""
+
+#: config.language_map:536
+msgid "Syriac"
+msgstr ""
+
+#: config.language_map:537
+msgid "Tagalog"
+msgstr ""
+
+#: config.language_map:538
+msgid "Tahitian"
+msgstr ""
+
+#: config.language_map:539
+msgid "Tai (Other)"
+msgstr ""
+
+#: config.language_map:540
+msgid "Tajik"
+msgstr ""
+
+#: config.language_map:541
+msgid "Tamil"
+msgstr ""
+
+#: config.language_map:542
+msgid "Tatar"
+msgstr ""
+
+#: config.language_map:543
+msgid "Tatar"
+msgstr ""
+
+#: config.language_map:544
+msgid "Telugu"
+msgstr ""
+
+#: config.language_map:545
+msgid "Temne"
+msgstr ""
+
+#: config.language_map:546
+msgid "Terena"
+msgstr ""
+
+#: config.language_map:547
+msgid "Tetum"
+msgstr ""
+
+#: config.language_map:548
+msgid "Tajik"
+msgstr ""
+
+#: config.language_map:549
+msgid "Tagalog"
+msgstr ""
+
+#: config.language_map:550
+msgid "Thai"
+msgstr ""
+
+#: config.language_map:551
+msgid "Tibetan"
+msgstr ""
+
+#: config.language_map:552
+msgid "Tigré"
+msgstr ""
+
+#: config.language_map:553
+msgid "Tigrinya"
+msgstr ""
+
+#: config.language_map:554
+msgid "Tiv"
+msgstr ""
+
+#: config.language_map:555
+msgid "Tokelauan"
+msgstr ""
+
+#: config.language_map:556
+msgid "Tlingit"
+msgstr ""
+
+#: config.language_map:557
+msgid "Tamashek"
+msgstr ""
+
+#: config.language_map:558
+msgid "Tonga (Nyasa)"
+msgstr ""
+
+#: config.language_map:559
+msgid "Tongan"
+msgstr ""
+
+#: config.language_map:560
+msgid "Tok Pisin"
+msgstr ""
+
+#: config.language_map:561
+msgid "Truk"
+msgstr ""
+
+#: config.language_map:562
+msgid "Tsimshian"
+msgstr ""
+
+#: config.language_map:563
+msgid "Tswana"
+msgstr ""
+
+#: config.language_map:564
+msgid "Tsonga"
+msgstr ""
+
+#: config.language_map:565
+msgid "Tswana"
+msgstr ""
+
+#: config.language_map:566
+msgid "Turkmen"
+msgstr ""
+
+#: config.language_map:567
+msgid "Tumbuka"
+msgstr ""
+
+#: config.language_map:568
+msgid "Tupi languages"
+msgstr ""
+
+#: config.language_map:569
+msgid "Turkish"
+msgstr ""
+
+#: config.language_map:570
+msgid "Altaic (Other)"
+msgstr ""
+
+#: config.language_map:571
+msgid "Tuvaluan"
+msgstr ""
+
+#: config.language_map:572
+msgid "Twi"
+msgstr ""
+
+#: config.language_map:573
+msgid "Tuvinian"
+msgstr ""
+
+#: config.language_map:574
+msgid "Udmurt"
+msgstr ""
+
+#: config.language_map:575
+msgid "Ugaritic"
+msgstr ""
+
+#: config.language_map:576
+msgid "Uighur"
+msgstr ""
+
+#: config.language_map:577
+msgid "Ukrainian"
+msgstr ""
+
+#: config.language_map:578
+msgid "Umbundu"
+msgstr ""
+
+#: config.language_map:579
+msgid "Undetermined"
+msgstr ""
+
+#: config.language_map:580
+msgid "Urdu"
+msgstr ""
+
+#: config.language_map:581
+msgid "Uzbek"
+msgstr ""
+
+#: config.language_map:582
+msgid "Vai"
+msgstr ""
+
+#: config.language_map:583
+msgid "Venda"
+msgstr ""
+
+#: config.language_map:584
+msgid "Vietnamese"
+msgstr ""
+
+#: config.language_map:585
+msgid "Volapük"
+msgstr ""
+
+#: config.language_map:586
+msgid "Votic"
+msgstr ""
+
+#: config.language_map:587
+msgid "Wakashan languages"
+msgstr ""
+
+#: config.language_map:588
+msgid "Walamo"
+msgstr ""
+
+#: config.language_map:589
+msgid "Waray"
+msgstr ""
+
+#: config.language_map:590
+msgid "Washo"
+msgstr ""
+
+#: config.language_map:591
+msgid "Welsh"
+msgstr ""
+
+#: config.language_map:592
+msgid "Sorbian languages"
+msgstr ""
+
+#: config.language_map:593
+msgid "Walloon"
+msgstr ""
+
+#: config.language_map:594
+msgid "Wolof"
+msgstr ""
+
+#: config.language_map:595
+msgid "Kalmyk"
+msgstr ""
+
+#: config.language_map:596
+msgid "Xhosa"
+msgstr ""
+
+#: config.language_map:597
+msgid "Yao (Africa)"
+msgstr ""
+
+#: config.language_map:598
+msgid "Yapese"
+msgstr ""
+
+#: config.language_map:599
+msgid "Yiddish"
+msgstr ""
+
+#: config.language_map:600
+msgid "Yoruba"
+msgstr ""
+
+#: config.language_map:601
+msgid "Yupik languages"
+msgstr ""
+
+#: config.language_map:602
+msgid "Zapotec"
+msgstr ""
+
+#: config.language_map:603
+msgid "Zenaga"
+msgstr ""
+
+#: config.language_map:604
+msgid "Zhuang"
+msgstr ""
+
+#: config.language_map:605
+msgid "Zande"
+msgstr ""
+
+#: config.language_map:606
+msgid "Zulu"
+msgstr ""
+
+#: config.language_map:607
+msgid "Zuni"
+msgstr ""
+
+#: config.item_form_map:610
+msgid "Microfilm"
+msgstr ""
+
+#: config.item_form_map:611
+msgid "Microfiche"
+msgstr ""
+
+#: config.item_form_map:612
+msgid "Microopaque"
+msgstr ""
+
+#: config.item_form_map:613
+msgid "Large print"
+msgstr ""
+
+#: config.item_form_map:614
+msgid "Braille"
+msgstr ""
+
+#: config.item_form_map:615
+msgid "Regular print reproduction"
+msgstr ""
+
+#: config.item_form_map:616
+msgid "Electronic"
+msgstr ""
+
+#: config.item_type_map:619
+msgid "Language material"
+msgstr ""
+
+#: config.item_type_map:620
+msgid "Manuscript language material"
+msgstr ""
+
+#: config.item_type_map:621
+msgid "Projected medium"
+msgstr ""
+
+#: config.item_type_map:622
+msgid "Two-dimensional nonprojectable graphic"
+msgstr ""
+
+#: config.item_type_map:623
+msgid "Three-dimensional artifact or naturally occurring object"
+msgstr ""
+
+#: config.item_type_map:624
+msgid "Kit"
+msgstr ""
+
+#: config.item_type_map:625
+msgid "Mixed materials"
+msgstr ""
+
+#: config.item_type_map:626
+msgid "Cartographic material"
+msgstr ""
+
+#: config.item_type_map:627
+msgid "Manuscript cartographic material"
+msgstr ""
+
+#: config.item_type_map:628
+msgid "Notated music"
+msgstr ""
+
+#: config.item_type_map:629
+msgid "Manuscript notated music"
+msgstr ""
+
+#: config.item_type_map:630
+msgid "Nonmusical sound recording"
+msgstr ""
+
+#: config.item_type_map:631
+msgid "Musical sound recording"
+msgstr ""
+
+#: config.item_type_map:632
+msgid "Computer file"
+msgstr ""
+
+#: actor.org_unit_type:638
+msgid "Consortium"
+msgstr ""
+
+#: actor.org_unit_type:639
+msgid "System"
+msgstr ""
+
+#: actor.org_unit_type:641
+msgid "Branch"
+msgstr ""
+
+#: actor.org_unit_type:642
+msgid "Sub-lib"
+msgstr ""
+
+#: actor.org_unit_type:643
+msgid "Bookmobile"
+msgstr ""
+
+#: actor.org_unit:646
+msgid "Example Consortium"
+msgstr ""
+
+#: actor.org_unit:647
+msgid "Example System 1"
+msgstr ""
+
+#: actor.org_unit:648
+msgid "Example System 2"
+msgstr ""
+
+#: actor.org_unit:649
+msgid "Example Branch 1"
+msgstr ""
+
+#: actor.org_unit:650
+msgid "Example Branch 2"
+msgstr ""
+
+#: actor.org_unit:651
+msgid "Example Branch 3"
+msgstr ""
+
+#: actor.org_unit:652
+msgid "Example Branch 4"
+msgstr ""
+
+#: actor.org_unit:653
+msgid "Example Sub-lib 1"
+msgstr ""
+
+#: actor.org_unit:654
+msgid "Example Bookmobile 1"
+msgstr ""
+
+#: actor.org_address:656
+msgid "123 Main St."
+msgstr ""
+
+#: actor.usr:661
+msgid "Administrator"
+msgstr ""
+
+#: permission.perm_list:674
+msgid "User is allowed to place a hold on a specific copy"
+msgstr ""
+
+#: permission.perm_list:677
+msgid "Allows a user to view another user's holds"
+msgstr ""
+
+#: permission.perm_list:679
+msgid "Allows a user to update another user's hold"
+msgstr ""
+
+#: permission.perm_list:684
+msgid "User is allowed to create new MARC records"
+msgstr ""
+
+#: permission.perm_list:704
+msgid "User may create new billable transactions"
+msgstr ""
+
+#: permission.perm_list:705
+msgid "Allows a user to create a new bill on a transaction"
+msgstr ""
+
+#: permission.perm_list:706
+msgid "Allows a user to view another user's containers (buckets)"
+msgstr ""
+
+#: permission.perm_list:707
+msgid "Allows a user to create a new container for another user"
+msgstr ""
+
+#: permission.perm_list:708
+msgid "User is allowed to create a new copy object"
+msgstr ""
+
+#: permission.perm_list:709
+msgid "Allows a user to change org unit settings"
+msgstr ""
+
+#: permission.perm_list:710
+msgid "Allows a user to see what another use has checked out"
+msgstr ""
+
+#: permission.perm_list:711
+msgid "User may view another user's transactions"
+msgstr ""
+
+#: permission.perm_list:712
+msgid "Allows a user to delete another user container"
+msgstr ""
+
+#: permission.perm_list:713
+msgid "Create a container item for another user"
+msgstr ""
+
+#: permission.perm_list:714
+msgid "User can add other users to permission groups"
+msgstr ""
+
+#: permission.perm_list:715
+msgid "User can remove other users from permission groups"
+msgstr ""
+
+#: permission.perm_list:716
+msgid "Allow user to view others' permission groups"
+msgstr ""
+
+#: permission.perm_list:717
+msgid "Allows a user to determine of another user can checkout an item"
+msgstr ""
+
+#: permission.perm_list:718
+msgid "Allows a user to edit copies in batch"
+msgstr ""
+
+#: permission.perm_list:719
+msgid "User may create a new patron statistical category"
+msgstr ""
+
+#: permission.perm_list:720
+msgid "User may create a copy stat cat"
+msgstr ""
+
+#: permission.perm_list:721
+msgid "User may create a new patron stat cat entry"
+msgstr ""
+
+#: permission.perm_list:722
+msgid "User may create a new copy stat cat entry"
+msgstr ""
+
+#: permission.perm_list:723
+msgid "User may update a patron stat cat"
+msgstr ""
+
+#: permission.perm_list:724
+msgid "User may update a copy stat cat"
+msgstr ""
+
+#: permission.perm_list:725
+msgid "User may update a patron stat cat entry"
+msgstr ""
+
+#: permission.perm_list:726
+msgid "User may update a copy stat cat entry"
+msgstr ""
+
+#: permission.perm_list:727
+msgid "User may link a copy to a stat cat entry"
+msgstr ""
+
+#: permission.perm_list:728
+msgid "User may link another user to a stat cat entry"
+msgstr ""
+
+#: permission.perm_list:729
+msgid "User may delete a patron stat cat"
+msgstr ""
+
+#: permission.perm_list:730
+msgid "User may delete a copy stat cat"
+msgstr ""
+
+#: permission.perm_list:731
+msgid "User may delete a patron stat cat entry"
+msgstr ""
+
+#: permission.perm_list:732
+msgid "User may delete a copy stat cat entry"
+msgstr ""
+
+#: permission.perm_list:733
+msgid "User may delete a patron stat cat entry map"
+msgstr ""
+
+#: permission.perm_list:734
+msgid "User may delete a copy stat cat entry map"
+msgstr ""
+
+#: permission.perm_list:735
+msgid "Allows a user to create a new non-cataloged item type"
+msgstr ""
+
+#: permission.perm_list:736
+msgid "Allows a user to update a non cataloged type"
+msgstr ""
+
+#: permission.perm_list:737
+msgid "Allows a user to create a new in-house-use "
+msgstr ""
+
+#: permission.perm_list:738
+msgid "Allows a user to check out a copy"
+msgstr ""
+
+#: permission.perm_list:739
+msgid "Allows a user to create a new copy location"
+msgstr ""
+
+#: permission.perm_list:740
+msgid "Allows a user to update a copy location"
+msgstr ""
+
+#: permission.perm_list:741
+msgid "Allows a user to delete a copy location"
+msgstr ""
+
+#: permission.perm_list:742
+msgid "Allows a user to create a transit_copy object for transiting a copy"
+msgstr ""
+
+#: permission.perm_list:743
+msgid "Allows a user to close out a transit on a copy"
+msgstr ""
+
+#: permission.perm_list:744
+msgid "Allows a user to see if another user has permission to place a hold on a given copy"
+msgstr ""
+
+#: permission.perm_list:745
+msgid "Allows a user to view which users have checked out a given copy"
+msgstr ""
+
+#: permission.perm_list:746
+msgid "Allows a user to perform z3950 queries against remote servers"
+msgstr ""
+
+#: permission.perm_list:747
+msgid "Allows a user to register a new workstation"
+msgstr ""
+
+#: permission.perm_list:748
+msgid "Allows a user to view all notes attached to a copy"
+msgstr ""
+
+#: permission.perm_list:749
+msgid "Allows a user to view all notes attached to a volume"
+msgstr ""
+
+#: permission.perm_list:750
+msgid "Allows a user to view all notes attached to a title"
+msgstr ""
+
+#: permission.perm_list:751
+msgid "Allows a user to create a new volume note"
+msgstr ""
+
+#: permission.perm_list:752
+msgid "Allows a user to create a new copy note"
+msgstr ""
+
+#: permission.perm_list:753
+msgid "Allows a user to create a new title note"
+msgstr ""
+
+#: permission.perm_list:754
+msgid "Allows a user to delete someone elses copy notes"
+msgstr ""
+
+#: permission.perm_list:755
+msgid "Allows a user to delete someone elses volume note"
+msgstr ""
+
+#: permission.perm_list:756
+msgid "Allows a user to delete someone elses title note"
+msgstr ""
+
+#: permission.perm_list:757
+msgid "Allows a user to update another users container"
+msgstr ""
+
+#: permission.perm_list:758
+msgid "Allows a user to create a container for themselves"
+msgstr ""
+
+#: permission.perm_list:759
+msgid "Allows a user to view notifications attached to a hold"
+msgstr ""
+
+#: permission.perm_list:760
+msgid "Allows a user to create new hold notifications"
+msgstr ""
+
+#: permission.perm_list:761
+msgid "Allows a user to update an org unit setting"
+msgstr ""
+
+#: permission.perm_list:762
+msgid "Allows a user to upload an offline script"
+msgstr ""
+
+#: permission.perm_list:763
+msgid "Allows a user to view uploaded offline script information"
+msgstr ""
+
+#: permission.perm_list:764
+msgid "Allows a user to execute an offline script batch"
+msgstr ""
+
+#: permission.perm_list:765
+msgid "Allows a user to change set the due date on an item to any date"
+msgstr ""
+
+#: permission.perm_list:766
+msgid "Allows a user to bypass the circ permit call for checkout"
+msgstr ""
+
+#: permission.perm_list:767
+msgid "Allows a user to override the copy_is_reference event"
+msgstr ""
+
+#: permission.perm_list:768
+msgid "Allows a user to void a bill"
+msgstr ""
+
+#: permission.perm_list:769
+msgid "Allows a person to check in/out an item that is claims returned"
+msgstr ""
+
+#: permission.perm_list:770
+msgid "Allows a user to check out an item in a non-circulatable status"
+msgstr ""
+
+#: permission.perm_list:771
+msgid "Allows a user to check in/out an item that has an alert message"
+msgstr ""
+
+#: permission.perm_list:772
+msgid "Allows a user to remove the lost status from a copy"
+msgstr ""
+
+#: permission.perm_list:773
+msgid "Allows a user to change the missing status on a copy"
+msgstr ""
+
+#: permission.perm_list:774
+msgid "Allows a user to abort a copy transit if the user is at the transit destination or source"
+msgstr ""
+
+#: permission.perm_list:775
+msgid "Allows a user to abort a copy transit if the user is not at the transit source or dest"
+msgstr ""
+
+#: permission.perm_list:776
+msgid "Allowsa user to query the zip code data method"
+msgstr ""
+
+#: permission.perm_list:778
+msgid "Allows a user to create duplicate holds (e.g. two holds on the same title)"
+msgstr ""
+
+#: permission.perm_list:779
+msgid "Allows a user to update a closed date interval for a given location"
+msgstr ""
+
+#: permission.perm_list:780
+msgid "Allows a user to remove a closed date interval for a given location"
+msgstr ""
+
+#: permission.perm_list:781
+msgid "Allows a user to create a new closed date for a location"
+msgstr ""
+
+#: permission.perm_list:782
+msgid "Allows a user to delete a non cataloged type"
+msgstr ""
+
+#: permission.perm_list:783
+msgid "Allows a user to put someone into collections"
+msgstr ""
+
+#: permission.perm_list:784
+msgid "Allows a user to remove someone from collections"
+msgstr ""
+
+#: permission.perm_list:785
+msgid "Allows a user to bar a patron"
+msgstr ""
+
+#: permission.perm_list:786
+msgid "Allows a user to un-bar a patron"
+msgstr ""
+
+#: permission.perm_list:787
+msgid "Allows a user to remove an existing workstation so a new one can replace it"
+msgstr ""
+
+#: permission.perm_list:788
+msgid "Allows a user to add/remove users to/from the \"User\" group"
+msgstr ""
+
+#: permission.perm_list:789
+msgid "Allows a user to add/remove users to/from the \"Patron\" group"
+msgstr ""
+
+#: permission.perm_list:790
+msgid "Allows a user to add/remove users to/from the \"Staff\" group"
+msgstr ""
+
+#: permission.perm_list:791
+msgid "Allows a user to add/remove users to/from the \"Circulator\" group"
+msgstr ""
+
+#: permission.perm_list:792
+msgid "Allows a user to add/remove users to/from the \"Cataloger\" group"
+msgstr ""
+
+#: permission.perm_list:793
+msgid "Allows a user to add/remove users to/from the \"GlobalAdmin\" group"
+msgstr ""
+
+#: permission.perm_list:794
+msgid "Allows a user to add/remove users to/from the \"LocalAdmin\" group"
+msgstr ""
+
+#: permission.perm_list:795
+msgid "Allows a user to add/remove users to/from the \"LibraryManager\" group"
+msgstr ""
+
+#: permission.perm_list:796
+msgid "Allows a user to add/remove users to/from the \"Cat1\" group"
+msgstr ""
+
+#: permission.perm_list:797
+msgid "Allows a user to add/remove users to/from the \"Supercat\" group"
+msgstr ""
+
+#: permission.perm_list:798
+msgid "Allows a user to add/remove users to/from the \"SIP-Client\" group"
+msgstr ""
+
+#: permission.perm_list:799
+msgid "Allows a user to add/remove users to/from the \"Vendor\" group"
+msgstr ""
+
+#: permission.perm_list:800
+msgid "Allows a user to place a hold on an age-protected item"
+msgstr ""
+
+#: permission.perm_list:801
+msgid "Allows a user to renew an item past the maximun renewal count"
+msgstr ""
+
+#: permission.perm_list:802
+msgid "Allow staff to override checkout count failure"
+msgstr ""
+
+#: permission.perm_list:803
+msgid "Allow staff to override overdue count failure"
+msgstr ""
+
+#: permission.perm_list:804
+msgid "Allow staff to override fine amount checkout failure"
+msgstr ""
+
+#: permission.perm_list:807
+msgid "Allow staff to force checkout of Missing/Lost type items"
+msgstr ""
+
+#: permission.perm_list:808
+msgid "allows users to place multiple holds on a single title"
+msgstr ""
+
+#: permission.perm_list:809
+msgid "Allows a users to run reports"
+msgstr ""
+
+#: permission.perm_list:810
+msgid "Allows a user to share report his own folders"
+msgstr ""
+
+#: permission.perm_list:811
+msgid "Allow user to view report output"
+msgstr ""
+
+#: permission.perm_list:812
+msgid "Allows a user to checkout an item that is marked as non-circ"
+msgstr ""
+
+#: permission.perm_list:813
+msgid "Allows a user to delete an item out of another user's container"
+msgstr ""
+
+#: permission.perm_list:814
+msgid "Allow a staff member to define where another staff member has their permissions"
+msgstr ""
+
+#: asset.copy_location:944
+msgid "Stacks"
+msgstr ""
diff --git a/build/i18n/po/en-US/fm_IDL.pot b/build/i18n/po/en-US/fm_IDL.pot
new file mode 100644 (file)
index 0000000..4e7fd31
--- /dev/null
@@ -0,0 +1,2180 @@
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Evergreen 1.4\n"
+"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
+"POT-Creation-Date: 2008-01-20 23:22:16-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: field.aihu.org_unit.label:240 field.ancihu.org_unit.label:257
+msgid "Using Library"
+msgstr ""
+
+#: field.rxbt.voided.label:2488
+msgid "Voided Billing Amount"
+msgstr ""
+
+#: field.bre.source.label:526
+msgid "Record Source"
+msgstr ""
+
+#: field.bre.marc.label:524
+msgid "MARC21Slim"
+msgstr ""
+
+#: field.mbts.xact_start.label:179
+msgid "Transaction Start Time"
+msgstr ""
+
+#: field.mrd.vr_format.label:911
+msgid "Video Recording Format"
+msgstr ""
+
+#: field.aua.within_city_limits.label:962
+msgid "Within City Limits?"
+msgstr ""
+
+#: field.rhrr.hold_type.label:2473
+msgid "Hold Request Type"
+msgstr ""
+
+#: field.au.demographic.label:700
+msgid "Demographic Info"
+msgstr ""
+
+#: class.mwp.label:1642
+msgid "Work Payment"
+msgstr ""
+
+#: field.au.ident_value2.label:681
+msgid "Secondary Identification"
+msgstr ""
+
+#: field.mbts.last_payment_note.label:172
+#: field.rccbs.last_payment_note.label:2617
+msgid "Last Payment Note"
+msgstr ""
+
+#: field.au.expire_date.label:673
+msgid "Privilege Expiration Date"
+msgstr ""
+
+#: field.ac.id.label:1358
+msgid "Card ID"
+msgstr ""
+
+#: field.mp.credit_card_payment.label:2042
+#: field.mbp.credit_card_payment.label:2073
+msgid "Credit Card Payment Detail"
+msgstr ""
+
+#: class.rssr.label:2385
+msgid "Simple Record Extracts"
+msgstr ""
+
+#: field.au.id.label:677 field.rud.id.label:2446
+msgid "User ID"
+msgstr ""
+
+#: field.asc.entries.label:1340 field.actsc.entries.label:1370
+msgid "Entries"
+msgstr ""
+
+#: field.acp.dummy_title.label:1796
+msgid "Precat Dummy Title"
+msgstr ""
+
+#: field.acpn.create_date.label:752
+msgid "Note Creation Date/Time"
+msgstr ""
+
+#: field.aua.street2.label:959
+msgid "Street (2)"
+msgstr ""
+
+#: field.mcrp.amount.label:1420 field.mwp.amount.label:1648
+#: field.mgp.amount.label:1669 field.mckp.amount.label:1757
+#: field.mp.amount.label:2034 field.mbp.amount.label:2065
+#: field.mndp.amount.label:2096 field.mdp.amount.label:2119
+#: field.mb.amount.label:2202
+msgid "Amount"
+msgstr ""
+
+#: field.mcrp.id.label:1422
+msgid "Pyament ID"
+msgstr ""
+
+#: field.au.claims_returned_count.label:666
+msgid "Claims-returned Count"
+msgstr ""
+
+#: field.bre.series_field_entries.label:536
+msgid "Indexed Series Field Entries"
+msgstr ""
+
+#: field.rccbs.demographic_general_division.label:2624
+msgid "User Age Demographic"
+msgstr ""
+
+#: field.rccc.dewey.label:2535
+msgid "Call Number Dewey/Prefix"
+msgstr ""
+
+#: field.crahp.name.label:1835 field.crmf.name.label:1847
+msgid "Rule Name"
+msgstr ""
+
+#: field.clfm.code.label:1636
+msgid "LitF Code"
+msgstr ""
+
+#: field.mrd.type_mat.label:910
+msgid "TMat"
+msgstr ""
+
+#: class.mckp.label:1751 field.mdp.check_payment.label:2130
+msgid "Check Payment"
+msgstr ""
+
+#: field.rccc.stat_cat_1.label:2542
+msgid "Legacy CAT1 Link"
+msgstr ""
+
+#: field.mfr.tag.label:775
+msgid "Tag"
+msgstr ""
+
+#: field.aout.org_units.label:1480
+msgid "Org Units"
+msgstr ""
+
+#: field.rccbs.profile_group.label:2630
+msgid "User Profile Group"
+msgstr ""
+
+#: field.ahr.bib_rec.label:1254
+msgid "Bib Record link"
+msgstr ""
+
+#: field.ahn.method.label:1111
+msgid "Notification Method"
+msgstr ""
+
+#: field.au.groups.label:697
+msgid "Additional Permission Groups"
+msgstr ""
+
+#: field.ahr.request_lib.label:1243
+msgid "Requesting Library"
+msgstr ""
+
+#: field.ahtc.source.label:2183
+msgid "Sending Library"
+msgstr ""
+
+#: field.rccc.call_number.label:2533
+msgid "Call Number Link"
+msgstr ""
+
+#: field.ahr.target.label:1248
+msgid "Target Object ID"
+msgstr ""
+
+#: field.circ.checkin_lib.label:1007 field.rodcirc.checkin_lib.label:2680
+msgid "Check In Library"
+msgstr ""
+
+#: field.aua.state.label:957
+msgid "State"
+msgstr ""
+
+#: field.mp.voided.label:2040 field.mbp.voided.label:2071
+#: field.mndp.voided.label:2102 field.mdp.voided.label:2127
+#: field.mb.voided.label:2208
+msgid "Voided?"
+msgstr ""
+
+#: class.citm.label:1153
+msgid "Item Type Map"
+msgstr ""
+
+#: field.rccbs.billing_location_shortname.label:2598
+msgid "Billing Location Short (Policy) Name"
+msgstr ""
+
+#: field.rud.general_division.label:2448
+msgid "General Demographic Division"
+msgstr ""
+
+#: field.asvq.responses.label:151 field.asv.responses.label:1184
+msgid "Responses"
+msgstr ""
+
+#: field.mrd.item_form.label:904
+msgid "Form"
+msgstr ""
+
+#: field.aou.ou_type.label:1286 class.aout.label:1467
+msgid "Organizational Unit Type"
+msgstr ""
+
+#: field.mcrp.payment_ts.label:1424 field.mwp.payment_ts.label:1652
+#: field.mgp.payment_ts.label:1673 field.mckp.payment_ts.label:1763
+msgid "Payment Timestamp"
+msgstr ""
+
+#: field.mfr.ind1.label:771
+msgid "Indicator 1"
+msgstr ""
+
+#: field.mfr.ind2.label:772
+msgid "Indicator 2"
+msgstr ""
+
+#: field.au.checkins.label:702 field.aou.checkins.label:1297
+msgid "Checkins"
+msgstr ""
+
+#: field.bre.call_numbers.label:513
+msgid "Call Numbers"
+msgstr ""
+
+#: field.mp.payment_ts.label:2037 field.mbp.payment_ts.label:2068
+#: field.mndp.payment_ts.label:2099 field.mdp.payment_ts.label:2122
+msgid "Payment Date/Time"
+msgstr ""
+
+#: field.ac.active.label:1356
+msgid "IsActive?"
+msgstr ""
+
+#: None:728
+msgid "Check-ins Performed as Staff"
+msgstr ""
+
+#: field.au.other_phone.label:686
+msgid "Other Phone"
+msgstr ""
+
+#: field.bre.simple_record.label:538
+msgid "Simple Record Extracts "
+msgstr ""
+
+#: class.actsce.label:1587
+msgid "User Stat Cat Entry"
+msgstr ""
+
+#: field.rccc.stat_cat_2_value.label:2549
+msgid "Legacy CAT2 Value"
+msgstr ""
+
+#: class.acn.label:443 field.acp.call_number.label:1784
+msgid "Call Number/Volume"
+msgstr ""
+
+#: field.mrd.control_type.label:901
+msgid "Ctrl"
+msgstr ""
+
+#: field.au.family_name.label:674
+msgid "Last Name"
+msgstr ""
+
+#: field.rccc.stat_cat_2.label:2543
+msgid "Legacy CAT2 Link"
+msgstr ""
+
+#: field.au.stat_cat_entries.label:657
+msgid "Statistical Category Entries"
+msgstr ""
+
+#: field.mrd.audience.label:897
+msgid "Audn"
+msgstr ""
+
+#: class.ancihu.label:250
+msgid "Non-cataloged In House Use"
+msgstr ""
+
+#: field.ahr.holdable_formats.label:1238
+msgid "Holdable Formats (for M-type hold)"
+msgstr ""
+
+#: field.acp.notes.label:1808
+msgid "Copy Notes"
+msgstr ""
+
+#: field.mbts.total_owed.label:175
+msgid "Total Owed"
+msgstr ""
+
+#: field.au.ident_type2.label:679
+msgid "Secondary Identification Type"
+msgstr ""
+
+#: field.actscecm.stat_cat.label:1956
+msgid "Statistical Category"
+msgstr ""
+
+#: field.mbts.last_payment_ts.label:173
+msgid "Last Payment Timestamp"
+msgstr ""
+
+#: field.ahr.usr.label:1249
+msgid "Hold User"
+msgstr ""
+
+#: class.mdp.label:2114
+msgid "Payments: Desk"
+msgstr ""
+
+#: field.asvr.answer.label:296
+msgid "Answer"
+msgstr ""
+
+#: field.aun.pub.label:194 field.acpn.pub.label:756
+#: field.acpl.opac_visible.label:1130
+msgid "Is OPAC Visible?"
+msgstr ""
+
+#: field.ahr.notifications.label:1253
+msgid "Notifications"
+msgstr ""
+
+#: field.aou.shortname.label:1288
+msgid "Short (Policy) Name"
+msgstr ""
+
+#: field.asvr.answer_date.label:297
+msgid "Answer Date/Time"
+msgstr ""
+
+#: field.rccc.dewey_block_hundreds.label:2547
+msgid "Dewey Block -- Hundreds"
+msgstr ""
+
+#: field.acn.deleted.label:451 field.au.deleted.label:698
+#: field.acp.deleted.label:1792
+msgid "Is Deleted"
+msgstr ""
+
+#: field.acn.edit_date.label:452 field.acp.edit_date.label:1797
+msgid "Last Edit Date/Time"
+msgstr ""
+
+#: field.mbts.xact_type.label:180 field.rccbs.xact_type.label:2611
+msgid "Transaction Type"
+msgstr ""
+
+#: field.mbt.xact_start.label:1569 field.rccbs.xact_start.label:2609
+msgid "Transaction Start Date/Time"
+msgstr ""
+
+#: class.mbts.label:162
+msgid "Billable Transaction Summary"
+msgstr ""
+
+#: field.mb.billing_ts.label:2203
+msgid "Billing Timestamp"
+msgstr ""
+
+#: field.au.billing_address.label:664
+msgid "Physical Address"
+msgstr ""
+
+#: field.mrd.item_lang.label:905
+msgid "Lang"
+msgstr ""
+
+#: field.actsce.stat_cat.label:1594 field.asce.stat_cat.label:2163
+msgid "Stat Cat"
+msgstr ""
+
+#: field.mrd.id.label:903
+msgid "Descriptor ID"
+msgstr ""
+
+#: field.cit.name.label:141
+msgid "Identification Name"
+msgstr ""
+
+#: field.rccc.dewey_range_tens.label:2544
+msgid "Dewey Range -- Tens"
+msgstr ""
+
+#: field.mdp.accepting_usr.label:2125
+msgid "Accepting User"
+msgstr ""
+
+#: field.rssr.biblio_record.label:2401 field.rsr.biblio_record.label:2434
+msgid "Full Bibliographic record"
+msgstr ""
+
+#: field.mb.billing_type.label:2204
+msgid "Billing Type"
+msgstr ""
+
+#: class.iatc.label:2641
+msgid "Inter-system Copy Transit"
+msgstr ""
+
+#: class.aihu.label:233
+msgid "In House Use"
+msgstr ""
+
+#: field.circ.circ_type.label:1035 class.rcirct.label:2454
+#: field.rcirct.type.label:2460 field.rccc.circ_type.label:2522
+#: field.rodcirc.circ_type.label:2707
+msgid "Circulation Type"
+msgstr ""
+
+#: field.ahtc.hold.label:2179
+msgid "Hold requiring Transit"
+msgstr ""
+
+#: field.ahr.transit.label:1229
+msgid "Transit"
+msgstr ""
+
+#: field.aou.ill_address.label:1283
+msgid "ILL Receiving Address"
+msgstr ""
+
+#: field.aout.name.label:1477
+msgid "Type Name"
+msgstr ""
+
+#: field.rssr.author.label:2396 field.rsr.author.label:2420
+msgid "Author (normalized)"
+msgstr ""
+
+#: field.circ.stop_fines_time.label:1026
+#: field.rodcirc.stop_fines_time.label:2699
+msgid "Fine Stop Date/Time"
+msgstr ""
+
+#: field.au.settings.label:655
+msgid "All User Settings"
+msgstr ""
+
+#: field.acn.copies.label:448
+msgid "Copies"
+msgstr ""
+
+#: field.ahr.cancel_time.label:1250
+msgid "Hold Cancel Date/Time"
+msgstr ""
+
+#: field.pgt.perm_interval.label:1861
+msgid "User Expiration Interval"
+msgstr ""
+
+#: field.circ.fine_interval.label:1016 field.rodcirc.fine_interval.label:2689
+msgid "Fine Interval"
+msgstr ""
+
+#: class.mrd.label:892
+msgid "Basic Record Descriptor"
+msgstr ""
+
+#: field.circ.billing_total.label:1036 field.mg.billing_total.label:1536
+#: field.mbt.billing_total.label:1574 field.rodcirc.billing_total.label:2708
+msgid "Billing Totals"
+msgstr ""
+
+#: class.aua.label:946
+msgid "User Address"
+msgstr ""
+
+#: class.aou.label:1274
+msgid "Organizational Unit"
+msgstr ""
+
+#: field.ancc.circ_time.label:1891 field.rccc.xact_start.label:2521
+msgid "Circulation Date/Time"
+msgstr ""
+
+#: field.mwp.id.label:1650 field.mgp.id.label:1671 field.mckp.id.label:1761
+#: field.mp.id.label:2035 field.mbp.id.label:2066 field.mndp.id.label:2097
+#: field.mdp.id.label:2120
+msgid "Payment ID"
+msgstr ""
+
+#: field.rssr.issn.label:2400 field.rsr.issn.label:2427
+msgid "ISSN"
+msgstr ""
+
+#: field.au.usrname.label:696
+msgid "OPAC/Staff Client User Name"
+msgstr ""
+
+#: field.rssr.title.label:2395 field.rsr.title.label:2418
+msgid "Title Proper (normalized)"
+msgstr ""
+
+#: field.ahr.selection_depth.label:1246
+msgid "Item Selection Depth"
+msgstr ""
+
+#: field.circ.circ_lib.label:1010 field.acp.circ_lib.label:1786
+#: field.ancc.circ_lib.label:1890 field.rodcirc.circ_lib.label:2683
+msgid "Circulating Library"
+msgstr ""
+
+#: field.rxpt.unvoided.label:2501
+msgid "Unvoided Paid Amount"
+msgstr ""
+
+#: field.aou.opac_visible.label:1291 field.asc.opac_visible.label:1343
+#: field.actsc.opac_visible.label:1373 field.acp.opac_visible.label:1804
+msgid "OPAC Visible"
+msgstr ""
+
+#: field.acn.notes.label:458
+msgid "Notes"
+msgstr ""
+
+#: field.cam.code.label:427
+msgid "Audience Code"
+msgstr ""
+
+#: field.rssr.publisher.label:2397 field.rsr.publisher.label:2421
+msgid "Publisher (normalized)"
+msgstr ""
+
+#: field.mbts.usr.label:177
+msgid "Billed User"
+msgstr ""
+
+#: field.circ.max_fine_rule.label:1019 class.crmf.label:1840
+#: field.rodcirc.max_fine_rule.label:2692
+msgid "Max Fine Rule"
+msgstr ""
+
+#: field.rccc.circ_lib_id.label:2520
+msgid "Library Circulation Location Link"
+msgstr ""
+
+#: field.au.alert_message.label:662 field.acp.alert_message.label:1782
+msgid "Alert Message"
+msgstr ""
+
+#: field.rccbs.last_payment_ts.label:2616
+msgid "Last Payment Date/Time"
+msgstr ""
+
+#: field.mbts.id.label:168 field.mg.id.label:1528 field.mbt.id.label:1566
+#: field.mwp.xact.label:1653 field.mgp.xact.label:1674
+#: field.rxbt.xact.label:2486 field.rxpt.xact.label:2500
+#: field.rccbs.id.label:2596
+msgid "Transaction ID"
+msgstr ""
+
+#: field.rssr.quality.label:2392 field.rsr.quality.label:2415
+msgid "Overall Record Quality"
+msgstr ""
+
+#: field.au.barred.label:663
+msgid "Barred"
+msgstr ""
+
+#: field.ahn.notify_time.label:1114
+msgid "Notification Date/Time"
+msgstr ""
+
+#: field.bre.subject_field_entries.label:533
+msgid "Indexed Subject Field Entries"
+msgstr ""
+
+#: class.acpl.label:1121
+msgid "Copy/Shelving Location"
+msgstr ""
+
+#: field.auoi.org_unit.label:110
+msgid "Allowed Org Unit"
+msgstr ""
+
+#: class.clfm.label:1631 field.rccc.lit_form.label:2527
+msgid "Literary Form"
+msgstr ""
+
+#: field.ahr.prev_check_time.label:1242
+msgid "Last Targeting Date/Time"
+msgstr ""
+
+#: field.asvr.response_group_id.label:301
+msgid "Response Group ID"
+msgstr ""
+
+#: class.cifm.label:433
+msgid "Item Form Map"
+msgstr ""
+
+#: class.aus.label:204
+msgid "User Setting"
+msgstr ""
+
+#: field.circ.duration.label:1014 field.cnct.circ_duration.label:1457
+#: field.rodcirc.duration.label:2687
+msgid "Circulation Duration"
+msgstr ""
+
+#: field.rccc.language.label:2526
+msgid "Item Language"
+msgstr ""
+
+#: class.mbp.label:2060
+msgid "Payments: Brick-and-mortar"
+msgstr ""
+
+#: class.actscecm.label:1950
+msgid "User Statistical Category Entry"
+msgstr ""
+
+#: field.ahn.note.label:1112
+msgid "Notification Note"
+msgstr ""
+
+#: field.circ.recuring_fine_rule.label:1023
+#: field.rodcirc.recuring_fine_rule.label:2696
+msgid "Recurring Fine Rule"
+msgstr ""
+
+#: field.circ.duration_rule.label:1015 field.rodcirc.duration_rule.label:2688
+msgid "Circ Duration Rule"
+msgstr ""
+
+#: field.aout.opac_label.label:1478
+msgid "OPAC Label"
+msgstr ""
+
+#: field.asv.required.label:1192
+msgid "Is Required?"
+msgstr ""
+
+#: field.au.survey_responses.label:658
+msgid "Survey Responses"
+msgstr ""
+
+#: field.atc.id.label:275 field.ahtc.id.label:2180 field.iatc.id.label:2658
+msgid "Transit ID"
+msgstr ""
+
+#: field.rccbs.usr_home_ou_name.label:2603
+msgid "User Home Library Name"
+msgstr ""
+
+#: field.au.credit_forward_balance.label:668
+msgid "User Credit Balance"
+msgstr ""
+
+#: class.rsce2.label:2577
+msgid "CAT2 Entry"
+msgstr ""
+
+#: field.aun.create_date.label:191 field.acp.create_date.label:1790
+msgid "Creation Date/Time"
+msgstr ""
+
+#: field.aout.id.label:1476
+msgid "Type ID"
+msgstr ""
+
+#: field.circ.payments.label:1033 field.rodcirc.payments.label:2705
+msgid "Transaction Payments"
+msgstr ""
+
+#: class.bre.label:508
+msgid "Bibliographic Record"
+msgstr ""
+
+#: field.ahr.eligible_copies.label:1255
+msgid "Eligible Copies"
+msgstr ""
+
+#: field.mp.cash_payment.label:2041 field.mbp.cash_payment.label:2072
+msgid "Cash Payment Detail"
+msgstr ""
+
+#: field.mfr.id.label:770
+msgid "Field ID"
+msgstr ""
+
+#: field.bre.tcn_value.label:528 field.rssr.tcn_value.label:2394
+#: field.rsr.tcn_value.label:2417
+msgid "TCN Value"
+msgstr ""
+
+#: field.rccbs.total_owed.label:2614
+msgid "Total Billed"
+msgstr ""
+
+#: class.aun.label:186
+msgid "User Note"
+msgstr ""
+
+#: class.actsc.label:1365
+msgid "User Statistical Category"
+msgstr ""
+
+#: class.pgt.label:1851
+msgid "Permission Group"
+msgstr ""
+
+#: field.mp.forgive_payment.label:2046 field.mbp.forgive_payment.label:2077
+#: field.mndp.forgive_payment.label:2104
+msgid "Forgive Payment Detail"
+msgstr ""
+
+#: field.rhrr.target.label:2472
+msgid "Hold Target"
+msgstr ""
+
+#: field.au.suffix.label:693
+msgid "Suffix/Title"
+msgstr ""
+
+#: field.asvr.effective_date.label:298
+msgid "Effective Answer Date/Time"
+msgstr ""
+
+#: field.acp.deposit.label:1793
+msgid "Is Deposit Required"
+msgstr ""
+
+#: field.ahr.capture_time.label:1230
+msgid "Capture Date/Time"
+msgstr ""
+
+#: field.mbts.balance_owed.label:167 field.rccbs.balance_owed.label:2629
+msgid "Balance Owed"
+msgstr ""
+
+#: field.aua.street1.label:958
+msgid "Street (1)"
+msgstr ""
+
+#: field.rhrr.bib_record.label:2474
+msgid "Target Bib Record"
+msgstr ""
+
+#: class.ac.label:1351
+msgid "Library Card"
+msgstr ""
+
+#: field.au.second_given_name.label:691
+msgid "Middle Name"
+msgstr ""
+
+#: field.aihu.staff.label:241 field.ancihu.staff.label:258
+msgid "Recording Staff"
+msgstr ""
+
+#: field.aou.billing_address.label:1280
+msgid "Billing Address"
+msgstr ""
+
+#: field.acp.stat_cat_entries.label:1780
+msgid "Statistical Catagory Entries"
+msgstr ""
+
+#: field.crahp.id.label:1834 field.crmf.id.label:1846
+msgid "Rule ID"
+msgstr ""
+
+#: field.acp.loan_duration.label:1802
+msgid "Loan Duration"
+msgstr ""
+
+#: field.mrd.item_type.label:906 field.aua.address_type.label:951
+msgid "Type"
+msgstr ""
+
+#: field.ahr.expire_time.label:1233
+msgid "Hold Expire Date/Time"
+msgstr ""
+
+#: field.bre.full_record_entries.label:537
+msgid "Flattened MARC Fields "
+msgstr ""
+
+#: class.mg.label:1522
+msgid "Grocery Transaction"
+msgstr ""
+
+#: field.acn.record.label:457
+msgid "Bib Record"
+msgstr ""
+
+#: field.rccbs.patron_city.label:2626
+msgid "User City"
+msgstr ""
+
+#: field.ahn.hold.label:1109 field.aufh.hold.label:1926
+msgid "Hold"
+msgstr ""
+
+#: field.cifm.value.label:439
+msgid "Item Form"
+msgstr ""
+
+#: class.cit.label:135
+msgid "Identification Type"
+msgstr ""
+
+#: field.ahr.requestor.label:1245
+msgid "Requesting User"
+msgstr ""
+
+#: field.auoi.opt_in_ws.label:107 class.aws.label:121
+msgid "Workstation"
+msgstr ""
+
+#: field.mcrp.xact.label:1425 field.mb.xact.label:2210
+msgid "Transaction"
+msgstr ""
+
+#: field.rccc.circ_lib.label:2519
+msgid "Library Circulation Location Short (Policy) Name"
+msgstr ""
+
+#: field.acp.fine_level.label:1799
+msgid "Fine Level"
+msgstr ""
+
+#: field.rxpt.total.label:2503
+msgid "Total Paid Amount"
+msgstr ""
+
+#: field.aun.id.label:193 field.acpn.id.label:754
+msgid "Note ID"
+msgstr ""
+
+#: field.pgt.application_perm.label:1862
+msgid "Required Permission"
+msgstr ""
+
+#: field.rsr.uniform_title.label:2419
+msgid "Uniform Title (normalized)"
+msgstr ""
+
+#: field.mg.xact_finish.label:1531
+msgid "Transaction Finish Timestamp"
+msgstr ""
+
+#: class.ahr.label:1223
+msgid "Hold Request"
+msgstr ""
+
+#: field.bre.notes.label:531
+msgid "Non-MARC Record Notes"
+msgstr ""
+
+#: field.ancihu.item_type.label:256 field.citm.value.label:1159
+msgid "Item Type"
+msgstr ""
+
+#: field.ahr.phone_notify.label:1240
+msgid "Notifications Phone Number"
+msgstr ""
+
+#: field.mg.billable_transaction.label:1535
+msgid "Billable Transaction link"
+msgstr ""
+
+#: field.circ.id.label:1017 field.rodcirc.id.label:2690
+msgid "Circ ID"
+msgstr ""
+
+#: field.bre.deleted.label:518
+msgid "Is Deleted?"
+msgstr ""
+
+#: field.mbt.billings.label:1572
+msgid "Billing Line Items"
+msgstr ""
+
+#: field.acp.circulate.label:1788
+msgid "Can Circulate"
+msgstr ""
+
+#: field.bre.last_xact_id.label:523
+msgid "Last Transaction ID"
+msgstr ""
+
+#: field.mp.check_payment.label:2044 field.mbp.check_payment.label:2075
+msgid "Check Payment Detail"
+msgstr ""
+
+#: field.ahr.id.label:1239 field.rhrr.id.label:2471
+msgid "Hold ID"
+msgstr ""
+
+#: field.mbts.last_billing_ts.label:170
+msgid "Last Billing Timestamp"
+msgstr ""
+
+#: field.pgt.usergroup.label:1863
+msgid "Is User Group"
+msgstr ""
+
+#: field.rccbs.usr.label:2607
+msgid "User Link"
+msgstr ""
+
+#: field.acpl.circulate.label:1126
+msgid "Can Circulate?"
+msgstr ""
+
+#: field.acp.stat_cat_entry_copy_maps.label:1809
+msgid "Stat-Cat entry maps"
+msgstr ""
+
+#: field.aout.children.label:1472
+msgid "Subordinate Types"
+msgstr ""
+
+#: field.bre.fixed_fields.label:514
+msgid "Fixed Field Entry"
+msgstr ""
+
+#: field.bre.fingerprint.label:521 field.rssr.fingerprint.label:2391
+#: field.rsr.fingerprint.label:2414
+msgid "Fingerprint"
+msgstr ""
+
+#: field.pgt.children.label:1856
+msgid "Child Groups"
+msgstr ""
+
+#: field.aws.owning_lib.label:128 field.acn.owning_lib.label:456
+#: field.asv.owner.label:1190 field.asc.owner.label:1344
+#: field.actsc.owner.label:1374 field.cnct.owning_lib.label:1461
+msgid "Owning Library"
+msgstr ""
+
+#: field.mg.billing_location.label:1527
+msgid "Billing Location"
+msgstr ""
+
+#: field.circ.circ_staff.label:1011 field.ancc.staff.label:1895
+#: field.rodcirc.circ_staff.label:2684
+msgid "Circulating Staff"
+msgstr ""
+
+#: class.asce.label:2156
+msgid "Item Stat Cat Entry"
+msgstr ""
+
+#: field.atc.hold_transit_copy.label:281 class.ahtc.label:2171
+#: field.iatc.hold_transit_copy.label:2664
+msgid "Hold Transit"
+msgstr ""
+
+#: field.asv.opac.label:1189
+msgid "OPAC Surevey?"
+msgstr ""
+
+#: field.aun.creator.label:192
+msgid "Creating Staff"
+msgstr ""
+
+#: field.circ.due_date.label:1013 field.rodcirc.due_date.label:2686
+msgid "Due Date/Time"
+msgstr ""
+
+#: field.asvq.id.label:152
+msgid "Question ID"
+msgstr ""
+
+#: class.mb.label:2197
+msgid "Billing Line Item"
+msgstr ""
+
+#: field.rsr.external_uri.label:2433
+msgid "External URI List (normalized)"
+msgstr ""
+
+#: field.actsce.id.label:1592 field.actscecm.id.label:1955
+#: field.asce.id.label:2161 field.rsce1.id.label:2568
+#: field.rsce2.id.label:2582
+msgid "Entry ID"
+msgstr ""
+
+#: field.acp.age_protect.label:1781
+msgid "Age Hold Protection"
+msgstr ""
+
+#: field.acp.copy_number.label:1789
+msgid "Copy Number on Volume"
+msgstr ""
+
+#: field.mbts.last_payment_type.label:174
+#: field.rccbs.last_payment_type.label:2618
+msgid "Last Payment Type"
+msgstr ""
+
+#: class.mgp.label:1663
+msgid "Goods Payment"
+msgstr ""
+
+#: field.rssr.isbn.label:2399 field.rsr.isbn.label:2426
+msgid "ISBN"
+msgstr ""
+
+#: field.circ.checkin_staff.label:1008 field.rodcirc.checkin_staff.label:2681
+msgid "Check In Staff"
+msgstr ""
+
+#: field.mdp.cash_drawer.label:2126
+msgid "Cash Drawer"
+msgstr ""
+
+#: class.asvr.label:291
+msgid "Survey Response"
+msgstr ""
+
+#: field.au.first_given_name.label:675
+msgid "First Name"
+msgstr ""
+
+#: field.acpl.owning_lib.label:1131
+msgid "Owning Org Unit"
+msgstr ""
+
+#: field.au.permissions.label:654
+msgid "All Permissions"
+msgstr ""
+
+#: field.mbts.xact_finish.label:178
+msgid "Transaction Finish Time"
+msgstr ""
+
+#: field.cit.id.label:140
+msgid "Identification ID"
+msgstr ""
+
+#: field.atc.source_send_time.label:279 field.ahtc.source_send_time.label:2184
+#: field.iatc.source_send_time.label:2662
+msgid "Send Date/Time"
+msgstr ""
+
+#: field.clm.value.label:374
+msgid "Language"
+msgstr ""
+
+#: field.acp.price.label:1805
+msgid "Price"
+msgstr ""
+
+#: field.ac.barcode.label:1357 field.acp.barcode.label:1783
+msgid "Barcode"
+msgstr ""
+
+#: field.pgt.id.label:1858
+msgid "Group ID"
+msgstr ""
+
+#: field.mrd.pub_status.label:908
+msgid "Pub Status"
+msgstr ""
+
+#: field.acp.deposit_amount.label:1794
+msgid "Deposit Amount"
+msgstr ""
+
+#: field.rxbt.total.label:2489
+msgid "Total Billing Amount"
+msgstr ""
+
+#: field.circ.xact_finish.label:1029 field.mbt.xact_finish.label:1568
+#: field.rodcirc.xact_finish.label:2702
+msgid "Transaction Finish Date/Time"
+msgstr ""
+
+#: field.rsr.genre.label:2430
+msgid "Genres (normalized)"
+msgstr ""
+
+#: field.aus.name.label:210 field.acpl.name.label:1129
+#: field.asv.name.label:1188 field.aou.name.label:1285
+#: field.asc.name.label:1342 field.actsc.name.label:1372
+#: field.cnct.name.label:1460
+msgid "Name"
+msgstr ""
+
+#: field.circ.opac_renewal.label:1020 field.rodcirc.opac_renewal.label:2693
+msgid "OPAC Renewal"
+msgstr ""
+
+#: field.rccc.item_type.label:2529
+msgid "MARC Type"
+msgstr ""
+
+#: field.bre.edit_date.label:519
+msgid "Last Edit Data/Time"
+msgstr ""
+
+#: field.clm.code.label:373 field.bre.language.label:530
+msgid "Language Code"
+msgstr ""
+
+#: field.pgt.parent.label:1860
+msgid "Parent Group"
+msgstr ""
+
+#: field.circ.xact_start.label:1030 field.rodcirc.xact_start.label:2703
+msgid "Check Out Date/Time"
+msgstr ""
+
+#: field.rxbt.unvoided.label:2487
+msgid "Unvoided Billing Amount"
+msgstr ""
+
+#: field.circ.billable_transaction.label:1034
+#: field.rodcirc.billable_transaction.label:2706
+msgid "Base Transaction"
+msgstr ""
+
+#: field.rccc.patron_home_lib_shortname.label:2538
+msgid "Patron Home Library Short (Policy) Name"
+msgstr ""
+
+#: field.cnct.in_house.label:1459
+msgid "In House?"
+msgstr ""
+
+#: field.rsr.geographic_subject.label:2429
+msgid "Geographic Subjects (normalized)"
+msgstr ""
+
+#: field.au.card.label:665
+msgid "Current Library Card"
+msgstr ""
+
+#: field.aou.closed_dates.label:1293
+msgid "Closed Dates"
+msgstr ""
+
+#: field.actsce.value.label:1595 field.rsce1.value.label:2570
+#: field.rsce2.value.label:2584
+msgid "Entry Value"
+msgstr ""
+
+#: field.acpn.creator.label:753
+msgid "Note Creator"
+msgstr ""
+
+#: field.aou.holds_address.label:1281
+msgid "Holds Receiving Address"
+msgstr ""
+
+#: field.mfr.record.label:773 field.mrd.record.label:909
+msgid "Bib Record Entry"
+msgstr ""
+
+#: field.rccbs.usr_home_ou.label:2604
+msgid "User Home Library Link"
+msgstr ""
+
+#: field.rccc.dewey_block_tens.label:2546
+msgid "Dewey Block -- Tens"
+msgstr ""
+
+#: field.acp.id.label:1801
+msgid "Copy ID"
+msgstr ""
+
+#: field.au.day_phone.label:669
+msgid "Daytime Phone"
+msgstr ""
+
+#: field.circ.target_copy.label:1027 field.rodcirc.target_copy.label:2700
+msgid "Circulating Item"
+msgstr ""
+
+#: field.ahr.email_notify.label:1232
+msgid "Notify by Email?"
+msgstr ""
+
+#: field.circ.payment_total.label:1037 field.mg.payment_total.label:1537
+#: field.mbt.payment_total.label:1575 field.rodcirc.payment_total.label:2709
+msgid "Payment Totals"
+msgstr ""
+
+#: field.rccc.patron_id.label:2536
+msgid "Patron Link"
+msgstr ""
+
+#: field.mp.goods_payment.label:2047 field.mbp.goods_payment.label:2078
+#: field.mndp.goods_payment.label:2105
+msgid "Goods Payment Detail"
+msgstr ""
+
+#: field.au.notes.label:699
+msgid "User Notes"
+msgstr ""
+
+#: field.asc.id.label:1341 field.actsc.id.label:1371
+msgid "Stat Cat ID"
+msgstr ""
+
+#: field.aus.value.label:212 field.asce.value.label:2164
+msgid "Value"
+msgstr ""
+
+#: field.bre.tcn_source.label:527 field.rssr.tcn_source.label:2393
+#: field.rsr.tcn_source.label:2416
+msgid "TCN Source"
+msgstr ""
+
+#: class.rsce1.label:2563
+msgid "CAT1 Entry"
+msgstr ""
+
+#: field.mrd.enc_level.label:902
+msgid "ELvl"
+msgstr ""
+
+#: field.ahtc.dest.label:2177
+msgid "Destination Library"
+msgstr ""
+
+#: class.aufh.label:1918
+msgid "Unfulfilled Hold Targets"
+msgstr ""
+
+#: field.rccc.dewey_range_hundreds.label:2545
+msgid "Dewey Range -- Hundreds"
+msgstr ""
+
+#: field.rccc.copy_id.label:2523
+msgid "Copy Link"
+msgstr ""
+
+#: field.ahr.selection_ou.label:1247
+msgid "Selection Locus"
+msgstr ""
+
+#: field.rsr.series_statement.label:2424
+msgid "Series Statement (normalized)"
+msgstr ""
+
+#: class.rccbs.label:2591
+msgid "Classic Open Transaction Summary"
+msgstr ""
+
+#: class.cnct.label:1452
+msgid "Non-cataloged Type"
+msgstr ""
+
+#: field.asvq.question.label:153 field.asvr.question.label:300
+#: field.asva.question.label:1878
+msgid "Question"
+msgstr ""
+
+#: field.ahtc.prev_hop.label:2182
+msgid "Previous Stop"
+msgstr ""
+
+#: field.atc.source.label:278 field.iatc.source.label:2661
+msgid "Source"
+msgstr ""
+
+#: class.ahn.label:1104
+msgid "Hold Notification"
+msgstr ""
+
+#: field.rcirct.id.label:2459
+msgid "Circulation ID"
+msgstr ""
+
+#: field.aua.county.label:954
+msgid "County"
+msgstr ""
+
+#: field.rsr.topic_subject.label:2428
+msgid "Topic Subjects (normalized)"
+msgstr ""
+
+#: field.rccbs.barcode.label:2606
+msgid "User Barcode"
+msgstr ""
+
+#: field.au.profile.label:690
+msgid "Main (Profile) Permission Group"
+msgstr ""
+
+#: field.mfr.subfield.label:774
+msgid "Subfield"
+msgstr ""
+
+#: field.acn.creator.label:450 field.acp.creator.label:1791
+msgid "Creating User"
+msgstr ""
+
+#: field.acp.holdable.label:1800
+msgid "Is Holdable"
+msgstr ""
+
+#: field.acn.editor.label:453 field.bre.editor.label:520
+#: field.acp.editor.label:1798
+msgid "Last Editing User"
+msgstr ""
+
+#: field.circ.max_fine.label:1018 field.crmf.amount.label:1845
+#: field.rodcirc.max_fine.label:2691
+msgid "Max Fine Amount"
+msgstr ""
+
+#: field.ahtc.copy_status.label:2176
+msgid "Copy Status at Transit"
+msgstr ""
+
+#: field.aou.settings.label:1295
+msgid "Settings"
+msgstr ""
+
+#: field.ahr.hold_type.label:1237
+msgid "Hold Type"
+msgstr ""
+
+#: field.mrd.bib_level.label:898
+msgid "BLvl"
+msgstr ""
+
+#: field.mp.credit_payment.label:2043 field.mbp.credit_payment.label:2074
+msgid "Credit Payment Detail"
+msgstr ""
+
+#: field.ahr.request_time.label:1244
+msgid "Request Date/Time"
+msgstr ""
+
+#: field.rccbs.xact_finish.label:2610
+msgid "Transaction End Date/Time"
+msgstr ""
+
+#: class.crahp.label:1828
+msgid "Age Hold Protection Rule"
+msgstr ""
+
+#: field.aou.workstations.label:1298
+msgid "Workstations"
+msgstr ""
+
+#: field.au.hold_requests.label:653
+msgid "All Hold Requests"
+msgstr ""
+
+#: field.au.master_account.label:684
+msgid "Is Group Lead Account"
+msgstr ""
+
+#: field.ahr.frozen.label:1256
+msgid "Currently Frozen"
+msgstr ""
+
+#: field.mfr.value.label:776
+msgid "Normalized Value"
+msgstr ""
+
+#: field.mcrp.accepting_usr.label:1419 field.mwp.accepting_usr.label:1647
+#: field.mgp.accepting_usr.label:1668 field.mckp.accepting_usr.label:1756
+msgid "Accepting Staff Member"
+msgstr ""
+
+#: field.rccc.demographic_general_division.label:2532
+msgid "Patron Age Demographic"
+msgstr ""
+
+#: field.rsr.corporate_subject.label:2432
+msgid "Corporate Name Subjects (normalized)"
+msgstr ""
+
+#: class.rodcirc.label:2675
+msgid "Overdue Circulation"
+msgstr ""
+
+#: field.bre.active.label:515
+msgid "Is Active?"
+msgstr ""
+
+#: field.crahp.prox.label:1836
+msgid "Allowed Proximity"
+msgstr ""
+
+#: field.ahr.fulfillment_time.label:1236
+msgid "Fulfillment Date/Time"
+msgstr ""
+
+#: field.mg.note.label:1529 field.mwp.note.label:1651
+#: field.mgp.note.label:1672 field.mckp.note.label:1762
+#: field.mp.note.label:2036 field.mbp.note.label:2067
+#: field.mndp.note.label:2098 field.mdp.note.label:2121
+#: field.mb.note.label:2206
+msgid "Note"
+msgstr ""
+
+#: field.aua.id.label:955
+msgid "Address ID"
+msgstr ""
+
+#: field.rccbs.patron_county.label:2625
+msgid "User County"
+msgstr ""
+
+#: field.acn.id.label:454
+msgid "Call Number/Volume ID"
+msgstr ""
+
+#: class.asc.label:1335
+msgid "Asset Statistical Category"
+msgstr ""
+
+#: class.au.label:645
+msgid "ILS User"
+msgstr ""
+
+#: class.asvq.label:145
+msgid "User Survey Question"
+msgstr ""
+
+#: field.circ.phone_renewal.label:1021 field.rodcirc.phone_renewal.label:2694
+msgid "Phone Renewal"
+msgstr ""
+
+#: field.mbt.payments.label:1573
+msgid "Payment Line Items"
+msgstr ""
+
+#: field.bre.quality.label:525
+msgid "Overall Quality"
+msgstr ""
+
+#: field.au.active.label:661
+msgid "Active"
+msgstr ""
+
+#: field.au.addresses.label:650
+msgid "All Addresses"
+msgstr ""
+
+#: field.mdp.cash_payment.label:2128
+msgid "Cash Payment"
+msgstr ""
+
+#: field.ahr.fulfillment_lib.label:1234
+msgid "Fulfilling Library"
+msgstr ""
+
+#: field.aua.post_code.label:956
+msgid "Postal Code"
+msgstr ""
+
+#: field.mb.voider.label:2209
+msgid "Voiding Staff Member"
+msgstr ""
+
+#: field.mcrp.note.label:1423
+msgid "Payment Note"
+msgstr ""
+
+#: field.mbts.total_paid.label:176 field.rccbs.total_paid.label:2613
+msgid "Total Paid"
+msgstr ""
+
+#: field.ahtc.transit_copy.label:2186
+msgid "Base Transit"
+msgstr ""
+
+#: field.aufh.fail_time.label:1925
+msgid "Retargeting Date/Time"
+msgstr ""
+
+#: field.au.performed_circulations.label:703 None:730
+msgid "Circulations Performed as Staff"
+msgstr ""
+
+#: field.asvr.id.label:299 field.asva.id.label:1877
+msgid "Answer ID"
+msgstr ""
+
+#: field.mcrp.payment.label:1427 field.mwp.payment.label:1654
+#: field.mgp.payment.label:1675 field.mckp.payment.label:1765
+msgid "Payment link"
+msgstr ""
+
+#: field.aua.city.label:952
+msgid "City"
+msgstr ""
+
+#: field.acpl.holdable.label:1127
+msgid "Is Holdable?"
+msgstr ""
+
+#: field.bre.create_date.label:516 field.au.create_date.label:667
+#: field.circ.create_time.label:1031
+msgid "Record Creation Date/Time"
+msgstr ""
+
+#: field.rccc.item_form.label:2528
+msgid "MARC Form"
+msgstr ""
+
+#: field.acp.holds.label:1811
+msgid "Holds"
+msgstr ""
+
+#: field.rccc.patron_city.label:2540
+msgid "Patron City"
+msgstr ""
+
+#: field.aou.children.label:1279
+msgid "Subordinate Organizational Units"
+msgstr ""
+
+#: field.asva.responses.label:1875
+msgid "Responses using this Answer"
+msgstr ""
+
+#: field.ahr.thaw_date.label:1257
+msgid "Thaw Date (if frozen)"
+msgstr ""
+
+#: class.circ.label:1002 field.rccc.id.label:2518
+msgid "Circulation"
+msgstr ""
+
+#: field.asvr.usr.label:303
+msgid "Responding User"
+msgstr ""
+
+#: class.rccc.label:2513
+msgid "Classic Circulation View"
+msgstr ""
+
+#: field.aihu.use_time.label:242 field.ancihu.use_time.label:259
+msgid "Use Date/Time"
+msgstr ""
+
+#: field.aihu.id.label:238 field.ancihu.id.label:255
+msgid "Use ID"
+msgstr ""
+
+#: field.atc.dest_recv_time.label:274 field.ahtc.dest_recv_time.label:2178
+#: field.iatc.dest_recv_time.label:2657
+msgid "Receive Date/Time"
+msgstr ""
+
+#: field.asv.poll.label:1191
+msgid "Poll Style?"
+msgstr ""
+
+#: field.rssr.pubdate.label:2398 field.rsr.pubdate.label:2422
+msgid "Publication Year (normalized)"
+msgstr ""
+
+#: field.cnct.id.label:1458
+msgid "Non-cat Type ID"
+msgstr ""
+
+#: field.asva.answer.label:1876
+msgid "Answer Text"
+msgstr ""
+
+#: field.acpn.owning_copy.label:755
+msgid "Copy"
+msgstr ""
+
+#: field.aout.can_have_vols.label:1474
+msgid "Can Have Volumes?"
+msgstr ""
+
+#: field.bre.id.label:522 field.aufh.id.label:1927 field.rssr.id.label:2390
+#: field.rsr.id.label:2412
+msgid "Record ID"
+msgstr ""
+
+#: class.cam.label:422
+msgid "Audience Map"
+msgstr ""
+
+#: field.au.email.label:671 field.aou.email.label:1289
+msgid "Email Address"
+msgstr ""
+
+#: field.clfm.description.label:1637
+msgid "LitF Description"
+msgstr ""
+
+#: field.au.passwd.label:687
+msgid "Password (obfuscated)"
+msgstr ""
+
+#: field.aihu.item.label:239 class.acp.label:1775
+msgid "Item"
+msgstr ""
+
+#: field.cam.value.label:429
+msgid "Audience"
+msgstr ""
+
+#: field.aout.parent.label:1479
+msgid "Parent Type"
+msgstr ""
+
+#: class.rud.label:2441
+msgid "User Demographics"
+msgstr ""
+
+#: field.atc.prev_hop.label:277 field.iatc.prev_hop.label:2660
+msgid "Previous Hop (unused)"
+msgstr ""
+
+#: field.aou.users.label:1292
+msgid "Users"
+msgstr ""
+
+#: field.circ.usr.label:1028 field.ancc.patron.label:1894
+#: field.rodcirc.usr.label:2701
+msgid "Patron"
+msgstr ""
+
+#: class.mcrp.label:1414
+msgid "House Credit Payment"
+msgstr ""
+
+#: field.acp.dummy_author.label:1795
+msgid "Precat Dummy Author"
+msgstr ""
+
+#: field.au.cards.label:651
+msgid "All Library Cards"
+msgstr ""
+
+#: field.rxpt.voided.label:2502
+msgid "Voided (Returned) Paid Amount"
+msgstr ""
+
+#: field.mbts.last_billing_note.label:169
+#: field.rccbs.last_billing_note.label:2621
+msgid "Last Billing Note"
+msgstr ""
+
+#: field.rccbs.billing_location.label:2600
+msgid "Billing Location Link"
+msgstr ""
+
+#: field.mrd.cat_form.label:899
+msgid "Cat Form"
+msgstr ""
+
+#: field.atc.dest.label:273 field.iatc.dest.label:2656
+msgid "Destination"
+msgstr ""
+
+#: field.au.evening_phone.label:672
+msgid "Evening Phone"
+msgstr ""
+
+#: field.au.ident_type.label:678
+msgid "Primary Identification Type"
+msgstr ""
+
+#: class.mndp.label:2091
+msgid "Payments: Non-drawer Staff"
+msgstr ""
+
+#: field.pgt.name.label:1859
+msgid "Group Name"
+msgstr ""
+
+#: field.mckp.xact.label:1764
+msgid "Transaction link"
+msgstr ""
+
+#: field.mbt.circulation.label:1571
+msgid "Circulation Billing link"
+msgstr ""
+
+#: field.bre.author_field_entries.label:535
+msgid "Indexed Author Field Entries"
+msgstr ""
+
+#: field.aou.phone.label:1290
+msgid "Phone Number"
+msgstr ""
+
+#: field.acn.create_date.label:449
+msgid "Create Date/Time"
+msgstr ""
+
+#: class.atc.label:267
+msgid "Copy Transit"
+msgstr ""
+
+#: field.au.super_user.label:694
+msgid "Is Super User"
+msgstr ""
+
+#: class.mfr.label:765
+msgid "Flattened MARC Fields"
+msgstr ""
+
+#: field.acp.circ_as_type.label:1785
+msgid "Circulation Type (MARC)"
+msgstr ""
+
+#: field.auoi.staff.label:108
+msgid "Staff Member"
+msgstr ""
+
+#: field.aws.id.label:126
+msgid "Workstation ID"
+msgstr ""
+
+#: class.acpn.label:747
+msgid "Copy Note"
+msgstr ""
+
+#: field.atc.persistant_transfer.label:276
+#: field.iatc.persistant_transfer.label:2659
+msgid "Is Persistent? (unused)"
+msgstr ""
+
+#: field.rccc.patron_zip.label:2541
+msgid "Patron ZIP Code"
+msgstr ""
+
+#: field.ahtc.persistant_transfer.label:2181
+msgid "Is Persistent?"
+msgstr ""
+
+#: field.au.net_access_level.label:685
+msgid "Internet Access Level"
+msgstr ""
+
+#: field.ancc.item_type.label:1893
+msgid "Non-cat Item Type"
+msgstr ""
+
+#: field.rccbs.patron_zip.label:2627
+msgid "User ZIP Code"
+msgstr ""
+
+#: field.mcrp.payment_type.label:1426 field.mwp.payment_type.label:1655
+#: field.mgp.payment_type.label:1676 field.mckp.payment_type.label:1766
+#: field.mp.payment_type.label:2038 field.mbp.payment_type.label:2069
+#: field.mndp.payment_type.label:2100 field.mdp.payment_type.label:2123
+msgid "Payment Type"
+msgstr ""
+
+#: field.mdp.credit_card_payment.label:2129
+msgid "Credit Card Payment"
+msgstr ""
+
+#: field.au.usrgroup.label:695
+msgid "Family Linkage or other Group"
+msgstr ""
+
+#: field.ahn.id.label:1110
+msgid "Notification ID"
+msgstr ""
+
+#: field.rccbs.last_billing_ts.label:2620
+msgid "Last Billing Date/Time"
+msgstr ""
+
+#: field.mcrp.amount_collected.label:1421
+#: field.mwp.amount_collected.label:1649 field.mgp.amount_collected.label:1670
+#: field.mckp.amount_collected.label:1758
+msgid "Amount Collected"
+msgstr ""
+
+#: field.ahr.current_copy.label:1231
+msgid "Currently Targeted Copy"
+msgstr ""
+
+#: field.aout.depth.label:1475
+msgid "Type Depth"
+msgstr ""
+
+#: field.rccc.stat_cat_1_value.label:2548
+msgid "Legacy CAT1 Value"
+msgstr ""
+
+#: class.auoi.label:101
+msgid "User Sharing Opt-in"
+msgstr ""
+
+#: field.rccc.profile_group.label:2531
+msgid "Patron Profile Group"
+msgstr ""
+
+#: field.rccbs.usr_home_ou_shortname.label:2602
+msgid "User Home Library Short (Policy) Name"
+msgstr ""
+
+#: field.au.dob.label:670 field.rud.dob.label:2447
+msgid "Date of Birth"
+msgstr ""
+
+#: field.mckp.cash_drawer.label:1759
+msgid "Workstation link"
+msgstr ""
+
+#: field.aun.title.label:195 field.acpn.title.label:757
+msgid "Note Title"
+msgstr ""
+
+#: field.auoi.id.label:106
+msgid "Opt-in ID"
+msgstr ""
+
+#: field.asvq.answers.label:150
+msgid "Answers"
+msgstr ""
+
+#: field.bre.creator.label:517
+msgid "Record Creator"
+msgstr ""
+
+#: field.acpl.id.label:1128
+msgid "Location ID"
+msgstr ""
+
+#: field.rccc.owning_lib_name.label:2525
+msgid "Owning Library Short (Policy) Name"
+msgstr ""
+
+#: class.ancc.label:1885
+msgid "Non-cataloged Circulation"
+msgstr ""
+
+#: class.asva.label:1870
+msgid "Survey Answer"
+msgstr ""
+
+#: class.mbt.label:1561 field.mp.xact.label:2039 field.mbp.xact.label:2070
+#: field.mndp.xact.label:2101 field.mdp.xact.label:2124
+msgid "Billable Transaction"
+msgstr ""
+
+#: field.rccc.patron_home_lib.label:2537
+msgid "Patron Home Library Link"
+msgstr ""
+
+#: field.aou.parent_ou.label:1287
+msgid "Parent Organizational Unit"
+msgstr ""
+
+#: field.circ.billings.label:1032 field.rodcirc.billings.label:2704
+msgid "Transaction Billings"
+msgstr ""
+
+#: field.au.photo_url.label:688
+msgid "Photo URL"
+msgstr ""
+
+#: class.mp.label:2029
+msgid "Payments: All"
+msgstr ""
+
+#: field.asv.questions.label:1183
+msgid "Questions"
+msgstr ""
+
+#: field.cifm.code.label:438
+msgid "Item Form Code"
+msgstr ""
+
+#: field.clfm.value.label:1638
+msgid "LitF Name"
+msgstr ""
+
+#: field.aun.value.label:197 field.acpn.value.label:758
+msgid "Note Content"
+msgstr ""
+
+#: field.asv.start_date.label:1193
+msgid "Survey Start Date/Time"
+msgstr ""
+
+#: field.au.checkouts.label:652
+msgid "All Circulations"
+msgstr ""
+
+#: field.aws.name.label:127
+msgid "Workstation Name"
+msgstr ""
+
+#: field.mckp.check_number.label:1760
+msgid "Check Number"
+msgstr ""
+
+#: field.rsr.summary.label:2425
+msgid "Summary (normalized)"
+msgstr ""
+
+#: field.au.ident_value.label:680
+msgid "Primary Identification"
+msgstr ""
+
+#: field.ahr.fulfillment_staff.label:1235
+msgid "Fulfilling Staff"
+msgstr ""
+
+#: field.mrd.char_encoding.label:900
+msgid "Character Encoding"
+msgstr ""
+
+#: field.mp.work_payment.label:2045 field.mbp.work_payment.label:2076
+#: field.mndp.work_payment.label:2103
+msgid "Work Payment Detail"
+msgstr ""
+
+#: field.ancc.id.label:1892
+msgid "Non-cat Circulation ID"
+msgstr ""
+
+#: field.auoi.usr.label:109 field.aun.usr.label:196 field.aus.usr.label:211
+#: field.aua.usr.label:960 field.ac.usr.label:1359 field.mg.usr.label:1530
+#: field.mbt.usr.label:1567 field.actscecm.target_usr.label:1958
+msgid "User"
+msgstr ""
+
+#: field.mg.billings.label:1533
+msgid "Billings"
+msgstr ""
+
+#: field.mrd.lit_form.label:907
+msgid "LitF"
+msgstr ""
+
+#: field.rccbs.billing_location_name.label:2599
+msgid "Billing Location Name"
+msgstr ""
+
+#: field.circ.stop_fines.label:1025 field.rodcirc.stop_fines.label:2698
+msgid "Fine Stop Reason"
+msgstr ""
+
+#: field.acp.ref.label:1806
+msgid "Is Reference"
+msgstr ""
+
+#: field.aua.valid.label:961
+msgid "Valid Address?"
+msgstr ""
+
+#: field.acp.status.label:1807
+msgid "Copy Status"
+msgstr ""
+
+#: field.asvq.survey.label:154 field.asvr.survey.label:302
+#: class.asv.label:1178
+msgid "Survey"
+msgstr ""
+
+#: field.mb.id.label:2205
+msgid "Billing ID"
+msgstr ""
+
+#: field.aou.circulations.label:1294 field.acp.circulations.label:1810
+msgid "Circulations"
+msgstr ""
+
+#: field.aus.id.label:209
+msgid "Setting ID"
+msgstr ""
+
+#: field.au.mailing_address.label:683 field.aou.mailing_address.label:1284
+msgid "Mailing Address"
+msgstr ""
+
+#: field.acn.label.label:455 field.rccc.call_number_label.label:2534
+msgid "Call Number Label"
+msgstr ""
+
+#: field.au.standing_penalties.label:656
+msgid "Standing Penalties"
+msgstr ""
+
+#: field.asv.id.label:1187
+msgid "Survey ID"
+msgstr ""
+
+#: field.bre.metarecord.label:529 field.rsr.metarecord.label:2413
+msgid "Metarecord"
+msgstr ""
+
+#: field.aout.can_have_users.label:1473
+msgid "Can Have Users?"
+msgstr ""
+
+#: field.au.prefix.label:689
+msgid "Prefix"
+msgstr ""
+
+#: field.rccc.patron_county.label:2539
+msgid "Patron County"
+msgstr ""
+
+#: field.actsce.owner.label:1593 field.asce.owner.label:2162
+#: field.rsce1.owner.label:2569 field.rsce2.owner.label:2583
+msgid "Entry Owner"
+msgstr ""
+
+#: field.rccc.circ_modifier.label:2524
+msgid "Circ Modifier"
+msgstr ""
+
+#: field.rsr.series_title.label:2423
+msgid "Series Title (normalized)"
+msgstr ""
+
+#: field.mbt.grocery.label:1570
+msgid "Grocery Billing link"
+msgstr ""
+
+#: field.actscecm.stat_cat_entry.label:1957
+msgid "Entry Text"
+msgstr ""
+
+#: field.aufh.current_copy.label:1924
+msgid "Non-fulfilling Copy"
+msgstr ""
+
+#: field.acp.location.label:1803 field.rccc.shelving_location.label:2530
+msgid "Shelving Location"
+msgstr ""
+
+#: field.aou.id.label:1282
+msgid "Organizational Unit ID"
+msgstr ""
+
+#: field.ahr.pickup_lib.label:1241
+msgid "Pickup Library"
+msgstr ""
+
+#: field.cam.description.label:428 field.asv.description.label:1185
+#: field.pgt.description.label:1857
+msgid "Description"
+msgstr ""
+
+#: field.bre.keyword_field_entries.label:532
+msgid "Indexed Keyword Field Entries"
+msgstr ""
+
+#: field.aufh.circ_lib.label:1923
+msgid "Non-fulfilling Library"
+msgstr ""
+
+#: field.au.home_ou.label:676
+msgid "Home Library"
+msgstr ""
+
+#: class.clm.label:368
+msgid "Language Map"
+msgstr ""
+
+#: field.atc.copy_status.label:272 field.iatc.copy_status.label:2655
+msgid "Pretransit Copy Status"
+msgstr ""
+
+#: field.crahp.age.label:1833
+msgid "Item Age"
+msgstr ""
+
+#: field.au.standing.label:692
+msgid "Standing (unused)"
+msgstr ""
+
+#: field.rsr.name_subject.label:2431
+msgid "Personal Name Subjects (normalized)"
+msgstr ""
+
+#: field.asv.usr_summary.label:1194
+msgid "Display in User Summary"
+msgstr ""
+
+#: field.ahn.notify_staff.label:1113
+msgid "Notifying Staff"
+msgstr ""
+
+#: field.aua.country.label:953
+msgid "Country"
+msgstr ""
+
+#: field.circ.checkin_time.label:1009 field.rodcirc.checkin_time.label:2682
+msgid "Check In Date/Time"
+msgstr ""
+
+#: field.mg.payments.label:1534
+msgid "Payments"
+msgstr ""
+
+#: field.mbts.last_billing_type.label:171
+#: field.rccbs.last_billing_type.label:2622
+msgid "Last Billing Type"
+msgstr ""
+
+#: field.circ.recuring_fine.label:1022 field.rodcirc.recuring_fine.label:2695
+msgid "Recurring Fine Amount"
+msgstr ""
+
+#: field.asv.end_date.label:1186
+msgid "Survey End Date/Time"
+msgstr ""
+
+#: field.mg.xact_start.label:1532
+msgid "Transaction Start Timestamp"
+msgstr ""
+
+#: field.bre.title_field_entries.label:534
+msgid "Indexed Title Field Entries"
+msgstr ""
+
+#: field.atc.target_copy.label:280 field.ahtc.target_copy.label:2185
+#: field.iatc.target_copy.label:2663
+msgid "Transited Copy"
+msgstr ""
+
+#: field.acp.circ_modifier.label:1787
+msgid "Circulation Modifier"
+msgstr ""
+
+#: field.aou.addresses.label:1296
+msgid "Addresses"
+msgstr ""
+
+#: field.auoi.opt_in_ts.label:111
+msgid "Opt-in Date/Time"
+msgstr ""
+
+#: field.circ.desk_renewal.label:1012 field.rodcirc.desk_renewal.label:2685
+msgid "Desk Renewal"
+msgstr ""
+
+#: field.citm.code.label:1158
+msgid "Item Type Code"
+msgstr ""
+
+#: field.circ.renewal_remaining.label:1024
+#: field.rodcirc.renewal_remaining.label:2697
+msgid "Remaining Renewals"
+msgstr ""
+
+#: field.mb.void_time.label:2207
+msgid "Void Timestamp"
+msgstr ""
+
+#: field.au.billable_transactions.label:701 None:723
+msgid "Billable Transactions"
+msgstr ""
diff --git a/build/i18n/po/en-US/ils_events.xml.pot b/build/i18n/po/en-US/ils_events.xml.pot
new file mode 100644 (file)
index 0000000..365bb68
--- /dev/null
@@ -0,0 +1,852 @@
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Evergreen 1.4\n"
+"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
+"POT-Creation-Date: 2008-01-20 23:22:23-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: 1208.TITLE_LAST_COPY:66
+msgid "The last copy attached to a title is being removed or deleted"
+msgstr ""
+
+#: 1603.CONTAINER_USER_BUCKET_ITEM_NOT_FOUND:441
+msgid "The requested container_user_bucket_item was not found"
+msgstr ""
+
+#: 1598.MONEY_USER_CIRCULATION_SUMMARY_NOT_FOUND:426
+msgid "The requested money_user_circulation_summary was not found"
+msgstr ""
+
+#: 1621.CONTAINER_COPY_BUCKET_NOT_FOUND:494
+msgid "The requested container_copy_bucket was not found"
+msgstr ""
+
+#: 1218.ITEM_AGE_PROTECTED:104
+msgid "This item is too new to have a hold placed on it"
+msgstr ""
+
+#: 1214.PATRON_DUP_IDENT1:87
+msgid "The selected primary identification type and value are in use by another patron"
+msgstr ""
+
+#: 1561.PERMISSION_PERM_LIST_NOT_FOUND:318
+msgid "The requested permission_perm_list was not found"
+msgstr ""
+
+#: 1213.PATRON_BARRED:83
+msgid "The patron is barred"
+msgstr ""
+
+#: 1591.METABIB_SERIES_FIELD_ENTRY_NOT_FOUND:405
+msgid "The requested metabib_series_field_entry was not found"
+msgstr ""
+
+#: 8002.OFFLINE_FILE_ERROR:688
+msgid " An offline file or directory could not be created or accessed "
+msgstr ""
+
+#: 1502.ASSET_COPY_NOT_FOUND:173
+msgid ""
+"\n"
+"\t\t\tSomeone attempted to retrieve a copy object from the \n"
+"\t\t\tsystem and the object was not found.\n"
+"\t\t"
+msgstr ""
+
+#: 1639.REPORTER_SCHEDULE_NOT_FOUND:548
+msgid "The requested reporter_schedule was not found"
+msgstr ""
+
+#: 0.SUCCESS:14
+msgid " "
+msgstr ""
+
+#: 7006.COPY_IS_REFERENCE:638
+msgid " Copy is reference material "
+msgstr ""
+
+#: 1609.CONFIG_RULES_RECURING_FINE_NOT_FOUND:459
+msgid "The requested config_rules_recuring_fine was not found"
+msgstr ""
+
+#: 1608.METABIB_SUBJECT_FIELD_ENTRY_NOT_FOUND:456
+msgid "The requested metabib_subject_field_entry was not found"
+msgstr ""
+
+#: 2001.DATABASE_UPDATE_FAILED:596
+msgid "The attempt to write to the DB failed"
+msgstr ""
+
+#: 1507.CONTAINER_ITEM_NOT_FOUND:196
+msgid ""
+"\n"
+"\t\t\tSomeone attempted to retrieve a container item object from the \n"
+"\t\t\tsystem and the object was not found.\n"
+"\t\t"
+msgstr ""
+
+#: 1538.ACTION_SURVEY_RESPONSE_NOT_FOUND:253
+msgid "The requested action_survey_response was not found"
+msgstr ""
+
+#: 1555.MONEY_OPEN_BILLABLE_TRANSACTION_SUMMARY_NOT_FOUND:301
+msgid "The requested money_open_billable_transaction_summary was not found"
+msgstr ""
+
+#: 1554.CONFIG_RULES_CIRC_DURATION_NOT_FOUND:298
+msgid "The requested config_rules_circ_duration was not found"
+msgstr ""
+
+#: 1607.ACTION_OPEN_CIRCULATION_NOT_FOUND:453
+msgid "The requested action_open_circulation was not found"
+msgstr ""
+
+#: 1559.METABIB_FULL_REC_NOT_FOUND:312
+msgid "The requested metabib_full_rec was not found"
+msgstr ""
+
+#: 1527.OPEN_TCN_NOT_FOUND:219
+msgid "No TCN could be found that does not collide with existing records"
+msgstr ""
+
+#: 8000.OFFLINE_SESSION_ACTIVE:682
+msgid " An offline session for this location is currently processing "
+msgstr ""
+
+#: 1563.METABIB_KEYWORD_FIELD_ENTRY_NOT_FOUND:324
+msgid "The requested metabib_keyword_field_entry was not found"
+msgstr ""
+
+#: 1546.CONFIG_AUDIENCE_MAP_NOT_FOUND:277
+msgid "The requested config_audience_map was not found"
+msgstr ""
+
+#: 1001.NO_SESSION:26
+msgid "User login session has either timed out or does not exist"
+msgstr ""
+
+#: 1525.BILLING_NOT_FOUND:215
+msgid " Requested billing note does not exist "
+msgstr ""
+
+#: 8001.OFFLINE_SESSION_FILE_EXISTS:685
+msgid " An offline file for this workstation exists within this session "
+msgstr ""
+
+#: 1529.ACTOR_WORKSTATION_NOT_FOUND:227
+msgid "The requested actor_workstation was not found"
+msgstr ""
+
+#: 1227.COPY_DELETE_WARNING:140
+msgid "The copy in question is not in an ideal status for deleting"
+msgstr ""
+
+#: 1223.PATRON_NO_PHONE:122
+msgid "The user does not have a valid phone number assigned"
+msgstr ""
+
+#: 1002.ACTOR_USER_NOT_FOUND:29
+msgid "Someone attempted to retrieve a user from the system and the user was not found"
+msgstr ""
+
+#: 1636.REPORTER_OUTPUT_FOLDER_NOT_FOUND:539
+msgid "The requested reporter_output_folder was not found"
+msgstr ""
+
+#: 1217.PATRON_INACTIVE:101
+msgid "This account is marked as inactive"
+msgstr ""
+
+#: 1637.REPORTER_REPORT_FOLDER_NOT_FOUND:542
+msgid "The requested reporter_report_folder was not found"
+msgstr ""
+
+#: 1545.PERM_EX_NOT_FOUND:274
+msgid "The requested perm_ex was not found"
+msgstr ""
+
+#: 1553.ACTOR_ORG_UNIT_CLOSED_DATE_NOT_FOUND:295
+msgid "The requested actor_org_unit_closed_date was not found"
+msgstr ""
+
+#: 1541.AUTHORITY_RECORD_DESCRIPTOR_NOT_FOUND:262
+msgid "The requested authority_record_descriptor was not found"
+msgstr ""
+
+#: 7011.COPY_STATUS_LOST:653
+msgid "Copy has is marked as lost"
+msgstr ""
+
+#: 1587.CONTAINER_CALL_NUMBER_BUCKET_NOT_FOUND:393
+msgid "The requested container_call_number_bucket was not found"
+msgstr ""
+
+#: 1229.VOLUME_DELETED:147
+msgid "The requested volume is marked as deleted"
+msgstr ""
+
+#: 1635.REPORTER_REPORT_NOT_FOUND:536
+msgid "The requested reporter_report was not found"
+msgstr ""
+
+#: 1631.MONEY_COLLECTIONS_TRACKER_NOT_FOUND:524
+#: 1632.CONFIG_RULES_AGE_HOLD_PROTECT_NOT_FOUND:527
+#: 1633.MONEY_DESK_PAYMENT_NOT_FOUND:530
+msgid "The requested money_collections_tracker was not found"
+msgstr ""
+
+#: 5000.PERM_FAILURE:605
+msgid "Permission Denied"
+msgstr ""
+
+#: 7015.NEGATIVE_PATRON_BALANCE:665
+msgid "This requested action would result in a negative patron balance"
+msgstr ""
+
+#: 1569.ACTOR_USER_STANDING_PENALTY_NOT_FOUND:342
+msgid "The requested actor_user_standing_penalty was not found"
+msgstr ""
+
+#: 1200.USERNAME_EXISTS:39
+msgid "The given username already exists in the database"
+msgstr ""
+
+#: 9000.REPORT_TEMPLATE_EXISTS:716
+msgid " A report template with the given name and folder already exists"
+msgstr ""
+
+#: 1602.ACTOR_STAT_CAT_ENTRY_NOT_FOUND:438
+msgid "The requested actor_stat_cat_entry was not found"
+msgstr ""
+
+#: 1710.CONTAINER_EXISTS:588
+msgid "User has already created a bucket with the requested name"
+msgstr ""
+
+#: 1575.CONTAINER_BIBLIO_RECORD_ENTRY_BUCKET_NOT_FOUND:358
+msgid "The requested container_biblio_record_entry_bucket was not found"
+msgstr ""
+
+#: 1701.COPY_LOCATION_EXISTS:561
+msgid " The copy location object already exists "
+msgstr ""
+
+#: 1703.WORKSTATION_NAME_EXISTS:567
+msgid " A workstation with that name already exists "
+msgstr ""
+
+#: 1619.ACTOR_STAT_CAT_ENTRY_USER_MAP_NOT_FOUND:488
+msgid "The requested actor_stat_cat_entry_user_map was not found"
+msgstr ""
+
+#: 8007.OFFLINE_SESSION_EXISTS:703
+msgid " A session with the given name already exists "
+msgstr ""
+
+#: 1558.ASSET_COPY_NOTE_NOT_FOUND:309
+msgid "The requested asset_copy_note was not found"
+msgstr ""
+
+#: 7017.ROUTE_TO_COPY_LOCATION:674
+msgid ""
+" \n"
+"\t\tA copy needs to be routed to a copy location.  The location\n"
+"\t\tshould be specified within the event with a 'location' key\n"
+"\t\t"
+msgstr ""
+
+#: 1504.ACTION_TRANSIT_COPY_NOT_FOUND:182
+msgid ""
+"\n"
+"\t\t\tSomeone attempted to retrieve a transit object from the \n"
+"\t\t\tsystem and the object was not found.\n"
+"\t\t"
+msgstr ""
+
+#: 1624.MONEY_PAYMENT_NOT_FOUND:503
+msgid "The requested money_payment was not found"
+msgstr ""
+
+#: 1596.ACTOR_ORG_UNIT_TYPE_NOT_FOUND:420
+msgid "The requested actor_org_unit_type was not found"
+msgstr ""
+
+#: 1004.Z3950_BAD_QUERY:35
+msgid "The Z query is not formatted correctly"
+msgstr ""
+
+#: 1205.CARD_EXISTS:57
+msgid "The given user barcode already exists"
+msgstr ""
+
+#: 1584.ACTOR_ORG_ADDRESS_NOT_FOUND:385
+msgid "The requested actor_org_address was not found"
+msgstr ""
+
+#: 1501.BIBLIO_RECORD_ENTRY_NOT_FOUND:167
+msgid "The requested biblio_record_entry was not found"
+msgstr ""
+
+#: 1613.PERMISSION_GRP_TREE_NOT_FOUND:470
+msgid "The requested permission_grp_tree was not found"
+msgstr ""
+
+#: 1523.TITLE_NOTE_NOT_FOUND:212
+msgid " Requested title note does not exist "
+msgstr ""
+
+#: 9001.REPORT_REPORT_EXISTS:720
+msgid " A report with the given name and folder already exists"
+msgstr ""
+
+#: 1536.ACTION_IN_HOUSE_USE_NOT_FOUND:248
+msgid "The requested action_in_house_use was not found"
+msgstr ""
+
+#: 7016.ITEM_ON_HOLDS_SHELF:668
+msgid "This requested item is currently on the holds shelf"
+msgstr ""
+
+#: 7005.LOCATION_CIRC_NOT_ALLOWED:635
+msgid " Location does not allow materials to circulate "
+msgstr ""
+
+#: 1562.METABIB_METARECORD_SOURCE_MAP_NOT_FOUND:321
+msgid "The requested metabib_metarecord_source_map was not found"
+msgstr ""
+
+#: 1531.ACTION_SURVEY_QUESTION_NOT_FOUND:233
+msgid "The requested action_survey_question was not found"
+msgstr ""
+
+#: 1612.CONFIG_RULES_MAX_FINE_NOT_FOUND:467
+msgid "The requested config_rules_max_fine was not found"
+msgstr ""
+
+#: 1557.ACTOR_ORG_UNIT_SETTING_NOT_FOUND:306
+msgid "The requested actor_org_unit_setting was not found"
+msgstr ""
+
+#: 7009.CIRC_CLAIMS_RETURNED:647
+msgid " Requested circulation is marked claims returned "
+msgstr ""
+
+#: 1629.PERMISSION_USR_GRP_MAP_NOT_FOUND:517
+msgid "The requested permission_usr_grp_map was not found"
+msgstr ""
+
+#: 1606.MONEY_WORK_PAYMENT_NOT_FOUND:450
+msgid "The requested money_work_payment was not found"
+msgstr ""
+
+#: 2000.BAD_PARAMS:593
+msgid "Invalid parameters were encountered in a method"
+msgstr ""
+
+#: 1564.MONEY_CASH_PAYMENT_NOT_FOUND:327
+msgid "The requested money_cash_payment was not found"
+msgstr ""
+
+#: 1221.ORG_CANNOT_HAVE_VOLS:115
+msgid "The selected location cannot have volumes attached"
+msgstr ""
+
+#: 1704.TCN_EXISTS:570
+msgid "A record already exists with the requested TCN value"
+msgstr ""
+
+#: 1.UNKNOWN:17
+msgid "Placeholder event.  Used for development only"
+msgstr ""
+
+#: 1622.BIBLIO_RECORD_NODE_NOT_FOUND:497
+msgid "The requested biblio_record_node was not found"
+msgstr ""
+
+#: 8003.OFFLINE_PARAM_ERROR:691
+msgid " Missing params in offline upload "
+msgstr ""
+
+#: 1534.ACTOR_USER_SETTING_NOT_FOUND:242
+msgid "The requested actor_user_setting was not found"
+msgstr ""
+
+#: 1211.BILL_ALREADY_VOIDED:76
+msgid "The selecte bill has already been voided"
+msgstr ""
+
+#: 1222.PATRON_NO_EMAIL_ADDRESS:119
+msgid "The user does not have a valid email address assigned"
+msgstr ""
+
+#: 7001.PATRON_BAD_STANDING:622
+msgid ""
+"\n"
+"\t\t\tThe patron in question is not able to check out materials because\n"
+"\t\t\ttheir account is in bad standing\n"
+"\t\t"
+msgstr ""
+
+#: 1215.CIRC_EXCEEDS_COPY_RANGE:94
+msgid ""
+"\n"
+"\t\t\tThe selected copy may not circulate because the recipient's home \n"
+"\t\t\tlocation is not within the copy's circulation range\n"
+"\t\t"
+msgstr ""
+
+#: 1605.CONFIG_LIT_FORM_MAP_NOT_FOUND:447
+msgid "The requested config_lit_form_map was not found"
+msgstr ""
+
+#: 1567.METABIB_RECORD_DESCRIPTOR_NOT_FOUND:336
+msgid "The requested metabib_record_descriptor was not found"
+msgstr ""
+
+#: 1702.OPEN_CIRCULATION_EXISTS:564
+msgid " There is an open circulation on the requested item "
+msgstr ""
+
+#: 8009.OFFLINE_NO_ORG:709 8010.OFFLINE_SESSION_COMPLETE:712
+msgid " No org id was provided "
+msgstr ""
+
+#: 1630.ACTOR_USER_NOTE_NOT_FOUND:520
+msgid "The requested actor_user_note was not found"
+msgstr ""
+
+#: 1508.ASSET_CALL_NUMBER_NOT_FOUND:199
+msgid "Requested asset_call_number was not found"
+msgstr ""
+
+#: 1209.Z3950_LOGIN_FAILED:69
+msgid "The login failed"
+msgstr ""
+
+#: 1543.MONEY_CREDIT_CARD_PAYMENT_NOT_FOUND:268
+msgid "The requested money_credit_card_payment was not found"
+msgstr ""
+
+#: 1614.ACTION_SURVEY_ANSWER_NOT_FOUND:473
+msgid "The requested action_survey_answer was not found"
+msgstr ""
+
+#: 1535.METABIB_AUTHOR_FIELD_ENTRY_NOT_FOUND:245
+msgid "The requested metabib_author_field_entry was not found"
+msgstr ""
+
+#: 1626.ASSET_STAT_CAT_ENTRY_NOT_FOUND:509
+msgid "The requested asset_stat_cat_entry was not found"
+msgstr ""
+
+#: 1595.CONFIG_NON_CATALOGED_TYPE_NOT_FOUND:417
+msgid "The requested config_non_cataloged_type was not found"
+msgstr ""
+
+#: 1225.TRANSIT_ABORT_NOT_ALLOWED:128
+msgid "The transit on this item may not be aborted due to the state the item is in"
+msgstr ""
+
+#: 1542.CONFIG_LANGUAGE_MAP_NOT_FOUND:265
+msgid "The requested config_language_map was not found"
+msgstr ""
+
+#: 1206.VOLUME_NOT_EMPTY:60
+msgid "The selected volume has copies attached"
+msgstr ""
+
+#: 1540.AUTHORITY_RECORD_ENTRY_NOT_FOUND:259
+msgid "The requested authority_record_entry was not found"
+msgstr ""
+
+#: 1203.COPY_BAD_STATUS:48
+msgid "The given copy is not in a standard circulation status"
+msgstr ""
+
+#: 1601.MONEY_BILLABLE_TRANSACTION_NOT_FOUND:435
+msgid "The requested money_billable_transaction was not found"
+msgstr ""
+
+#: 7004.COPY_NOT_AVAILABLE:632
+msgid " Copy is not available "
+msgstr ""
+
+#: 1550.MONEY_OPEN_USER_SUMMARY_NOT_FOUND:287
+msgid "The requested money_open_user_summary was not found"
+msgstr ""
+
+#: 1207.REFUND_EXCEEDS_BALANCE:63
+msgid "A refund greater than the negative balance on a transaction was provided"
+msgstr ""
+
+#: 3.NO_CHANGE:20
+msgid "No change occurred"
+msgstr ""
+
+#: 1201.CIRC_PERMIT_BAD_KEY:42
+msgid "A checkout was attempted without a valid checkout permit key"
+msgstr ""
+
+#: 1593.MONEY_CREDIT_PAYMENT_NOT_FOUND:411
+msgid "The requested money_credit_payment was not found"
+msgstr ""
+
+#: 1618.METABIB_TITLE_FIELD_ENTRY_NOT_FOUND:485
+msgid "The requested metabib_title_field_entry was not found"
+msgstr ""
+
+#: 1202.ITEM_NOT_CATALOGED:45
+msgid "The requested item is not cataloged in the database"
+msgstr ""
+
+#: 1628.MONEY_BILLING_NOT_FOUND:514
+msgid "The requested money_billing was not found"
+msgstr ""
+
+#: 1544.CONFIG_METABIB_FIELD_NOT_FOUND:271
+msgid "The requested config_metabib_field was not found"
+msgstr ""
+
+#: 2002.DATABASE_QUERY_FAILED:599
+msgid "The attempt to query to the DB failed"
+msgstr ""
+
+#: 1549.CONFIG_STANDING_NOT_FOUND:284
+msgid "The requested config_standing was not found"
+msgstr ""
+
+#: 1210.INCORRECT_PASSWORD:73
+msgid "The provided password is not correct"
+msgstr ""
+
+#: 1582.CONFIG_ITEM_TYPE_MAP_NOT_FOUND:379
+msgid "The requested config_item_type_map was not found"
+msgstr ""
+
+#: 1530.CONFIG_IDENTIFICATION_TYPE_NOT_FOUND:230
+msgid "The requested config_identification_type was not found"
+msgstr ""
+
+#: 1579.ASSET_COPY_LOCATION_NOT_FOUND:370
+msgid "The requested asset_copy_location was not found"
+msgstr ""
+
+#: 1571.ASSET_CALL_NUMBER_NOTE_NOT_FOUND:347
+msgid "The requested asset_call_number_note was not found"
+msgstr ""
+
+#: 1528.ACTOR_USER_ADDRESS_NOT_FOUND:222
+msgid "Requested address was not found"
+msgstr ""
+
+#: 7002.PATRON_EXCEEDS_CHECKOUT_COUNT:626
+msgid "The patron in question has the maximum number of items already checked out"
+msgstr ""
+
+#: 1003.Z3950_SEARCH_FAILED:32
+msgid "The Z search did not succeed"
+msgstr ""
+
+#: 1533.ACTOR_USR_NOTE_NOT_FOUND:239
+msgid "The requested actor_usr_note was not found"
+msgstr ""
+
+#: 1620.PERMISSION_GRP_PERM_MAP_NOT_FOUND:491
+msgid "The requested permission_grp_perm_map was not found"
+msgstr ""
+
+#: 1204.CIRC_BAD_STATUS:54
+msgid ""
+"\n"
+"\t\t\tThe given circulation is not in a standard status or\n"
+"\t\t\tthe circulation was never fully closed properly\n"
+"\t\t"
+msgstr ""
+
+#: 1709.MAX_HOLDS:585
+msgid "User has reached the maximum number of holds"
+msgstr ""
+
+#: 1706.ITEM_BARCODE_EXISTS:576
+msgid "An item with the same barcode exists"
+msgstr ""
+
+#: 7014.COPY_IN_TRANSIT:662
+msgid "Copy is in transit"
+msgstr ""
+
+#: 1219.COPY_REMOTE_CIRC_LIB:107 1220.ITEM_NOT_HOLDABLE:111
+msgid "A copy with a remote circulating library (circ_lib) was encountered"
+msgstr ""
+
+#: 7000.ROUTE_ITEM:615
+msgid ""
+" \n"
+"\t\t\tA copy needs to be routed to a different location\t\n"
+"\t\t\tThe destination location will be specified by an 'org' key\n"
+"\t\t\twithin the event object\n"
+"\t\t"
+msgstr ""
+
+#: 7007.COPY_NEEDED_FOR_HOLD:641
+msgid " Copy is needed to fulfil a hold "
+msgstr ""
+
+#: 7010.COPY_ALERT_MESSAGE:650
+msgid " The requested copy has an alert message attached "
+msgstr ""
+
+#: 1231.RECORD_NOT_EMPTY:154
+msgid "The selected bib record has volumes attached"
+msgstr ""
+
+#: 1503.ACTION_HOLD_REQUEST_NOT_FOUND:176
+msgid "The requested action_hold_request was not found"
+msgstr ""
+
+#: 1212.PATRON_EXCEEDS_OVERDUE_COUNT:79
+msgid "The patron has too many overdue items"
+msgstr ""
+
+#: 1578.ACTION_HOLD_NOTIFICATION_NOT_FOUND:367
+msgid "The requested action_hold_notification was not found"
+msgstr ""
+
+#: 1610.MONEY_CHECK_PAYMENT_NOT_FOUND:462
+msgid "The requested money_check_payment was not found"
+msgstr ""
+
+#: 1623.PERMISSION_USR_PERM_MAP_NOT_FOUND:500
+msgid "The requested permission_usr_perm_map was not found"
+msgstr ""
+
+#: 1581.ASSET_STAT_CAT_ENTRY_COPY_MAP_NOT_FOUND:376
+msgid "The requested asset_stat_cat_entry_copy_map was not found"
+msgstr ""
+
+#: 1547.CONFIG_ITEM_FORM_MAP_NOT_FOUND:280
+msgid "The requested config_item_form_map was not found"
+msgstr ""
+
+#: 1592.CONTAINER_USER_BUCKET_NOT_FOUND:408
+msgid "The requested container_user_bucket was not found"
+msgstr ""
+
+#: 1617.ACTION_UNFULFILLED_HOLD_LIST_NOT_FOUND:482
+msgid "The requested action_unfulfilled_hold_list was not found"
+msgstr ""
+
+#: 1552.ACTOR_ORG_UNIT_HOURS_OF_OPERATION_NOT_FOUND:292
+msgid "The requested actor_org_unit_hours_of_operation was not found"
+msgstr ""
+
+#: 1576.EX_NOT_FOUND:361
+msgid "The requested ex was not found"
+msgstr ""
+
+#: 8004.OFFLINE_CONFIG_ERROR:694 8005.OFFLINE_CHECKSUM_FAILED:697
+#: 8006.OFFLINE_SESSION_NOT_FOUND:700
+msgid " Offline server is not configured properly "
+msgstr ""
+
+#: 1568.CONFIG_COPY_STATUS_NOT_FOUND:339
+msgid "The requested config_copy_status was not found"
+msgstr ""
+
+#: 1539.CONTAINER_COPY_BUCKET_ITEM_NOT_FOUND:256
+msgid "The requested container_copy_bucket_item was not found"
+msgstr ""
+
+#: 1590.ACTOR_STAT_CAT_NOT_FOUND:402
+msgid "The requested actor_stat_cat was not found"
+msgstr ""
+
+#: 7003.COPY_CIRC_NOT_ALLOWED:629
+msgid " Target copy is not allowed to circulate "
+msgstr ""
+
+#: 7008.MAX_RENEWALS_REACHED:644
+msgid " Circulation has no more renewals remaining "
+msgstr ""
+
+#: 1577.ACTION_HOLD_COPY_MAP_NOT_FOUND:364
+msgid "The requested action_hold_copy_map was not found"
+msgstr ""
+
+#: 1638.REPORTER_TEMPLATE_FOLDER_NOT_FOUND:545
+msgid "The requested reporter_template_folder was not found"
+msgstr ""
+
+#: 1500.ACTION_CIRCULATION_NOT_FOUND:164
+msgid ""
+"\n"
+"\t\t\tSomeone attempted to retrieve a circulation object from the system and \n"
+"\t\t\tthe object was not found.\n"
+"\t\t"
+msgstr ""
+
+#: 1226.REFUND_EXCEEDS_DESK_PAYMENTS:135
+msgid ""
+"\n"
+"\t\t\tThis refund amount is not allowed because it exceeds \n"
+"\t\t\tthe total amount of desk payments for this transaction.\n"
+"\t\t"
+msgstr ""
+
+#: 1616.MONEY_OPEN_USER_CIRCULATION_SUMMARY_NOT_FOUND:479
+msgid "The requested money_open_user_circulation_summary was not found"
+msgstr ""
+
+#: 1583.ACTION_SURVEY_NOT_FOUND:382
+msgid "The requested action_survey was not found"
+msgstr ""
+
+#: 1625.CONTAINER_BIBLIO_RECORD_ENTRY_BUCKET_ITEM_NOT_FOUND:506
+msgid "The requested container_biblio_record_entry_bucket_item was not found"
+msgstr ""
+
+#: 1000.LOGIN_FAILED:23
+msgid "User login failed"
+msgstr ""
+
+#: 1599.MONEY_GROCERY_NOT_FOUND:429
+msgid "The requested money_grocery was not found"
+msgstr ""
+
+#: 7012.COPY_STATUS_MISSING:656
+msgid "Copy has is marked as missing"
+msgstr ""
+
+#: 1532.MONEY_BILLABLE_TRANSACTION_SUMMARY_NOT_FOUND:236
+msgid "The requested money_billable_transaction_summary was not found"
+msgstr ""
+
+#: 2003.INTERNAL_SERVER_ERROR:602
+msgid "There was an internal server error"
+msgstr ""
+
+#: 8008.OFFLINE_INVALID_SESSION:706
+msgid " The session name is invalid "
+msgstr ""
+
+#: 1597.BIBLIO_RECORD_NOTE_NOT_FOUND:423
+msgid "The requested biblio_record_note was not found"
+msgstr ""
+
+#: 1588.ASSET_STAT_CAT_NOT_FOUND:396
+msgid "The requested asset_stat_cat was not found"
+msgstr ""
+
+#: 1224.PATRON_ACCOUNT_EXPIRED:125
+msgid "The patron's account has expired"
+msgstr ""
+
+#: 1560.METABIB_METARECORD_NOT_FOUND:315
+msgid "The requested metabib_metarecord was not found"
+msgstr ""
+
+#: 1707.HOLD_EXISTS:579
+msgid "User already has an open hold on the selected item"
+msgstr ""
+
+#: 1506.CONTAINER_NOT_FOUND:190
+msgid ""
+"\n"
+"\t\t\tSomeone attempted to retrieve a container object from the \n"
+"\t\t\tsystem and the object was not found.\n"
+"\t\t"
+msgstr ""
+
+#: 1566.MONEY_FORGIVE_PAYMENT_NOT_FOUND:333
+msgid "The requested money_forgive_payment was not found"
+msgstr ""
+
+#: 1230.XACT_COLLISION:150
+msgid "The saved item has been edited by another user"
+msgstr ""
+
+#: 1700.NON_CAT_TYPE_EXISTS:558
+msgid " The non-cataloged type object already exists "
+msgstr ""
+
+#: 1708.MONEY_COLLECTIONS_TRACKER_EXISTS:582
+msgid "A duplicate money.collections_tracker object already exists in the database"
+msgstr ""
+
+#: 1634.REPORTER_TEMPLATE_NOT_FOUND:533
+msgid "The requested reporter_template was not found"
+msgstr ""
+
+#: 1600.CONFIG_BIB_SOURCE_NOT_FOUND:432
+msgid "The requested config_bib_source was not found"
+msgstr ""
+
+#: 1228.BIB_RECORD_DELETED:144
+msgid "The requested bib record is marked as deleted"
+msgstr ""
+
+#: 1705.VOLUME_LABEL_EXISTS:573
+msgid "A volume with the same label, title and owning library exists"
+msgstr ""
+
+#: 1589.ACTOR_CARD_NOT_FOUND:399
+msgid "The requested actor_card was not found"
+msgstr ""
+
+#: 1216.PATRON_CARD_INACTIVE:98
+msgid "The patron's card is not active"
+msgstr ""
+
+#: 7013.PATRON_EXCEEDS_FINES:659
+msgid "The patron in question has reached the maximum fine amount"
+msgstr ""
+
+#: 1586.ACTOR_ORG_UNIT_NOT_FOUND:390
+msgid "The requested actor_org_unit was not found"
+msgstr ""
+
+#: 1574.CONTAINER_CALL_NUMBER_BUCKET_ITEM_NOT_FOUND:355
+msgid "The requested container_call_number_bucket_item was not found"
+msgstr ""
+
+#: 1518.ACTION_HOLD_TRANSIT_COPY_NOT_FOUND:204
+msgid "The requested action_hold_transit_copy was not found"
+msgstr ""
+
+#: 1594.AUTHORITY_FULL_REC_NOT_FOUND:414
+msgid "The requested authority_full_rec was not found"
+msgstr ""
+
+#: 1565.ACTOR_PROFILE_NOT_FOUND:330
+msgid "The requested actor_profile was not found"
+msgstr ""
+
+#: 1580.METABIB_VIRTUAL_RECORD_NOT_FOUND:373
+msgid "The requested metabib_virtual_record was not found"
+msgstr ""
+
+#: 1640.ACTOR_USR_ORG_UNIT_OPT_IN_NOT_FOUND:551
+msgid "The requested actor_usr_org_unit_opt_in was not found"
+msgstr ""
+
+#: 1572.AUTHORITY_RECORD_NOTE_NOT_FOUND:350
+msgid "The requested authority_record_note was not found"
+msgstr ""
+
+#: 1520.WORKSTATION_NOT_FOUND:209
+msgid " Requested workstation object does not exist "
+msgstr ""
+
+#: 1615.ACTION_NON_CATALOGED_CIRCULATION_NOT_FOUND:476
+msgid "The requested action_non_cataloged_circulation was not found"
+msgstr ""
+
+#: 1604.MONEY_USER_SUMMARY_NOT_FOUND:444
+msgid "The requested money_user_summary was not found"
+msgstr ""
diff --git a/build/i18n/po/en-US/lang.dtd.pot b/build/i18n/po/en-US/lang.dtd.pot
new file mode 100644 (file)
index 0000000..6a029c3
--- /dev/null
@@ -0,0 +1,4531 @@
+# extracted from ../../Open-ILS/web/opac/locale/en-US/lang.dtd
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: lang.version
+msgid "remote v1"
+msgstr ""
+
+#: lang.description
+msgid "English"
+msgstr ""
+
+#: lang.author
+msgid "PINES"
+msgstr ""
+
+#: common.check_date.description
+msgid "Check today's date above."
+msgstr ""
+
+#: common.check_barcode.description
+msgid "Check barcode?"
+msgstr ""
+
+#: common.date_helper
+msgid "or choose one of these"
+msgstr ""
+
+#: common.date_helper.3_days
+msgid "Today + 3 days"
+msgstr ""
+
+#: common.date_helper.7_days
+msgid "Today + 7 days"
+msgstr ""
+
+#: common.date_helper.14_days
+msgid "Today + 14 days"
+msgstr ""
+
+#: common.date_helper.30_days
+msgid "Today + 30 days"
+msgstr ""
+
+#: common.due_date.description
+msgid "Enter the item due date:"
+msgstr ""
+
+#: common.enter.label
+#: common.enter.accesskey
+#: staff.circ.offline_checkin.step2a.label
+#: staff.circ.offline_checkin.step2a.accesskey
+msgid "&Enter"
+msgstr ""
+
+#: common.enter_barcode.description
+msgid "Enter the item barcode:"
+msgstr ""
+
+#: common.title
+#: staff.cat.search_title
+#: staff.mvr_label_title
+#: staff.record_list.title
+#: staff.z39_50.search_class.title
+#: staff.server.admin.hold_pull.title
+msgid "Title"
+msgstr ""
+
+#: common.author
+#: staff.cat.search_author
+#: staff.mvr_label_author
+#: staff.record_list.author
+#: staff.z39_50.search_class.author
+#: staff.server.admin.hold_pull.author
+msgid "Author"
+msgstr ""
+
+#: common.subject
+#: staff.cat.search_subject
+msgid "Subject"
+msgstr ""
+
+#: common.series
+msgid "Series"
+msgstr ""
+
+#: common.keyword
+#: staff.cat.search_all
+msgid "Keyword"
+msgstr ""
+
+#: common.type
+#: staff.ahr_hold_type_label
+#: staff.cat.search_type
+#: staff.marc.LDR.type.short
+msgid "Type"
+msgstr ""
+
+#: common.isbn
+#: staff.record_list.isbn
+#: staff.z39_50.search_class.isbn
+msgid "ISBN"
+msgstr ""
+
+#: common.format
+#: staff.cat.search_format
+#: staff.server.admin.hold_pull.format
+msgid "Format"
+msgstr ""
+
+#: common.login
+#: staff.auth.login_header
+msgid "Login"
+msgstr ""
+
+#: common.logout
+msgid "Log Out"
+msgstr ""
+
+#: common.at
+msgid "at"
+msgstr ""
+
+#: common.of
+#: staff.displaying.of
+msgid "of"
+msgstr ""
+
+#: common.cancel
+#: staff.server.admin.closed_dates.cancel
+#: staff.server.admin.copy_locations.cancel
+#: staff.server.admin.non_cat_types.cancel
+#: staff.server.admin.stat_cat.cancel
+msgid "Cancel"
+msgstr ""
+
+#: common.library
+msgid "Library"
+msgstr ""
+
+#: common.step1.label
+msgid "Step 1)"
+msgstr ""
+
+#: common.step2.label
+#: common.step2.accesskey
+msgid "Step &2)"
+msgstr ""
+
+#: common.step3.label
+#: common.step3.accesskey
+msgid "Step &3)"
+msgstr ""
+
+#: common.step4.label
+#: common.step4.accesskey
+msgid "Step &4)"
+msgstr ""
+
+#: common.step5.label
+msgid "Step 5)"
+msgstr ""
+
+#: common.step6.label
+msgid "Step 6)"
+msgstr ""
+
+#: common.username
+msgid "Username"
+msgstr ""
+
+#: common.username.label
+#: common.username.accesskey
+msgid "&Username:"
+msgstr ""
+
+#: common.password
+#: staff.au_password_label
+msgid "Password"
+msgstr ""
+
+#: common.refresh
+#: staff.patron_navbar.refresh
+msgid "Refresh"
+msgstr ""
+
+#: common.submit
+#: staff.auth.submit_prompt
+#: staff.circ.checkin.submit_label
+#: staff.circ.hold_capture.submit_label
+#: staff.patron_display.checkout.submit_label
+#: staff.server.admin.copy_locations.submit
+#: staff.server.admin.non_cat_types.submit
+msgid "Submit"
+msgstr ""
+
+#: common.user_not_found
+msgid "User not found"
+msgstr ""
+
+#: common.unimplemented
+msgid "Not Yet Implemented"
+msgstr ""
+
+#: common.delete_transactions.label
+msgid "Delete selected transaction"
+msgstr ""
+
+#: common.save_transactions.label
+#: common.save_transactions.accesskey
+msgid "&Save these transactions"
+msgstr ""
+
+#: ilsevent.1000
+msgid "Login failed.  The username or password entered was incorrect."
+msgstr ""
+
+#: ilsevent.1001
+msgid "Login session has timed out or does not exist"
+msgstr ""
+
+#: ilsevent.1002
+msgid "User was not found in the database"
+msgstr ""
+
+#: ilsevent.5000
+msgid "Permission Denied"
+msgstr ""
+
+#: ilsperm.CREATE_HOLD
+msgid "User is not allowed to create holds for other users at this location"
+msgstr ""
+
+#: common.cancel.accesskey
+#: staff.cat.fixed.SCO.key
+#: staff.copy.close.key
+#: staff.main.auth.debug.clear.accesskey
+#: staff.main.menu.circ.checkin.key
+#: staff.main.menu.circ.claimed_returned.key
+#: staff.main.menu.circ.key
+#: staff.main.menu.edit.copy.key
+#: staff.main.menu.file.close.key
+#: staff.marc.display.fixed.SCO.key
+#: staff.marc.file.close.key
+#: staff.patron_navbar.checkout.accesskey
+msgid "C"
+msgstr ""
+
+#: common.login.accesskey
+#: staff.auth.logoff_prompt.key
+#: staff.cat.search_count_copy.key
+#: staff.cat.search_location.key
+#: staff.checkin.reprint_receipt_label.accesskey
+#: staff.hold_capture.reprint_receipt_label.accesskey
+#: staff.main.menu.circ.lost.key
+#: staff.marc.display.legend.key
+#: staff.patron_display.checkout.reprint_receipt_label.accesskey
+msgid "L"
+msgstr ""
+
+#: common.password.accesskey
+#: staff.auth.password_prompt.accesskey
+#: staff.auth.password_prompt.key
+#: staff.cat.fixed.MAP.key
+#: staff.main.menu.circ.barcode.retrieve_patron.accesskey
+#: staff.main.menu.circ.patron_status.key
+#: staff.main.menu.edit.paste.key
+#: staff.marc.display.fixed.MAP.key
+#: staff.patron_display.items.print_receipt_label.accesskey
+#: staff.previous.range.key
+msgid "P"
+msgstr ""
+
+#: staff.about.title
+msgid "About"
+msgstr ""
+
+#: staff.acp_label_barcode
+#: staff.browse_list.barcode
+#: staff.copy.attr.barcode
+msgid "Barcode"
+msgstr ""
+
+#: staff.acp_label_call_number
+#: staff.browse_list.callnumber
+#: staff.cat.search_callnumber
+#: staff.volume.attr.callnumber
+#: staff.server.admin.hold_pull.call_number
+msgid "Call Number"
+msgstr ""
+
+#: staff.acp_label_circ_as_type
+msgid "Circ As Type"
+msgstr ""
+
+#: staff.acp_label_circ_lib
+msgid "Circ Lib"
+msgstr ""
+
+#: staff.acp_label_circ_modifier
+#: staff.browse_list.circ_modifier
+msgid "Circ Modifier"
+msgstr ""
+
+#: staff.acp_label_copy_number
+#: staff.browse_list.copy_number
+#: staff.server.admin.hold_pull.copy
+msgid "Copy Number"
+msgstr ""
+
+#: staff.acp_label_deposit
+#: staff.browse_list.deposit
+msgid "Deposit"
+msgstr ""
+
+#: staff.acp_label_deposit_amount
+#: staff.browse_list.deposit_amount
+msgid "Deposit Amount"
+msgstr ""
+
+#: staff.acp_label_fine_level
+#: staff.browse_list.fine_level
+#: staff.copy.attr.fine_level
+msgid "Fine Level"
+msgstr ""
+
+#: staff.acp_label_id
+msgid "Copy ID"
+msgstr ""
+
+#: staff.acp_label_loan_duration
+#: staff.browse_list.loan_duration
+#: staff.copy.attr.loan_duration
+msgid "Loan Duration"
+msgstr ""
+
+#: staff.acp_label_location
+#: staff.browse_list.location2
+#: staff.cat.search_count_copy
+#: staff.cat.search_location
+msgid "Location"
+msgstr ""
+
+#: staff.acp_label_price
+#: staff.browse_list.price
+#: staff.copy.attr.price
+msgid "Price"
+msgstr ""
+
+#: staff.acp_label_status
+#: staff.ahr_status_label
+#: staff.browse_list.status
+#: staff.checkin_label_status
+#: staff.main.auth.status
+#: staff.patron_display.status.caption
+msgid "Status"
+msgstr ""
+
+#: staff.ahr_capture_time_label
+msgid "Capture Time"
+msgstr ""
+
+#: staff.ahr_current_copy_label
+msgid "Current Copy"
+msgstr ""
+
+#: staff.ahr_email_notify_label
+msgid "Email Notify"
+msgstr ""
+
+#: staff.ahr_expire_time_label
+msgid "Expire Time"
+msgstr ""
+
+#: staff.ahr_fulfillment_time_label
+msgid "Fulfillment Time"
+msgstr ""
+
+#: staff.ahr_holdable_formats_label
+msgid "Holdable Formats"
+msgstr ""
+
+#: staff.ahr_id_label
+msgid "Hold Id"
+msgstr ""
+
+#: staff.ahr_ischanged_label
+#: staff.au_ischanged_label
+msgid "Ischanged"
+msgstr ""
+
+#: staff.ahr_isdeleted_label
+#: staff.au_isdeleted_label
+msgid "Isdeleted"
+msgstr ""
+
+#: staff.ahr_isnew_label
+#: staff.au_isnew_label
+msgid "Isnew"
+msgstr ""
+
+#: staff.ahr_phone_notify_label
+msgid "Phone Notify"
+msgstr ""
+
+#: staff.ahr_pickup_lib_label
+msgid "Pickup Lib"
+msgstr ""
+
+#: staff.ahr_prev_check_time_label
+msgid "Prev Check Time"
+msgstr ""
+
+#: staff.ahr_request_time_label
+msgid "Request Time"
+msgstr ""
+
+#: staff.ahr_requestor_label
+msgid "Requestor"
+msgstr ""
+
+#: staff.ahr_selection_depth_label
+msgid "Selection Depth"
+msgstr ""
+
+#: staff.ahr_target_label
+msgid "Target"
+msgstr ""
+
+#: staff.ahr_usr_label
+msgid "Usr"
+msgstr ""
+
+#: staff.au_active_label
+#: staff.au_label_active
+msgid "Active"
+msgstr ""
+
+#: staff.au_addresses_label
+msgid "Addresses"
+msgstr ""
+
+#: staff.au_alert_message_label
+msgid "Alert Message"
+msgstr ""
+
+#: staff.au_billing_address_label
+#: staff.circ.offline_register.billing_address.label
+msgid "Billing Address"
+msgstr ""
+
+#: staff.au_card_label
+msgid "Card"
+msgstr ""
+
+#: staff.au_cards_label
+msgid "Cards"
+msgstr ""
+
+#: staff.au_checkouts_label
+msgid "Checkouts"
+msgstr ""
+
+#: staff.au_claims_returned_count_label
+msgid "Claims Returned Count"
+msgstr ""
+
+#: staff.au_create_date_label
+msgid "Create Date"
+msgstr ""
+
+#: staff.au_credit_forward_balance_label
+msgid "Credit Forward Balance"
+msgstr ""
+
+#: staff.au_day_phone_label
+msgid "Day Phone"
+msgstr ""
+
+#: staff.au_dob_label
+msgid "Dob"
+msgstr ""
+
+#: staff.au_email_label
+msgid "Email"
+msgstr ""
+
+#: staff.au_evening_phone_label
+msgid "Evening Phone"
+msgstr ""
+
+#: staff.au_expire_date_label
+msgid "Expire Date"
+msgstr ""
+
+#: staff.au_family_name_label
+#: staff.au_label_family_name
+msgid "Family Name"
+msgstr ""
+
+#: staff.au_first_given_name_label
+msgid "First Given Name"
+msgstr ""
+
+#: staff.au_hold_requests_label
+msgid "Hold Requests"
+msgstr ""
+
+#: staff.au_home_ou_label
+msgid "Home Ou"
+msgstr ""
+
+#: staff.au_id_label
+msgid "User Id"
+msgstr ""
+
+#: staff.au_ident_type2_label
+msgid "Ident Type2"
+msgstr ""
+
+#: staff.au_ident_type_label
+msgid "Ident Type"
+msgstr ""
+
+#: staff.au_ident_value2_label
+msgid "Ident Value2"
+msgstr ""
+
+#: staff.au_ident_value_label
+msgid "Ident Value"
+msgstr ""
+
+#: staff.au_label_first_given_name
+msgid "First Name"
+msgstr ""
+
+#: staff.au_label_id
+msgid "Record ID"
+msgstr ""
+
+#: staff.au_label_prefix
+#: staff.au_prefix_label
+msgid "Prefix"
+msgstr ""
+
+#: staff.au_label_second_given_name
+msgid "Middle Name"
+msgstr ""
+
+#: staff.au_label_suffix
+#: staff.au_suffix_label
+msgid "Suffix"
+msgstr ""
+
+#: staff.au_last_xact_id_label
+msgid "Last Xact Id"
+msgstr ""
+
+#: staff.au_mailing_address_label
+#: staff.patron_display.mailing_address
+msgid "Mailing Address"
+msgstr ""
+
+#: staff.au_master_account_label
+msgid "Master Account"
+msgstr ""
+
+#: staff.au_net_access_level_label
+msgid "Net Access Level"
+msgstr ""
+
+#: staff.au_other_phone_label
+msgid "Other Phone"
+msgstr ""
+
+#: staff.au_passwd_label
+msgid "Passwd"
+msgstr ""
+
+#: staff.au_photo_url_label
+msgid "Photo Url"
+msgstr ""
+
+#: staff.au_profile_label
+msgid "Profile"
+msgstr ""
+
+#: staff.au_second_given_name_label
+msgid "Second Given Name"
+msgstr ""
+
+#: staff.au_settings_label
+msgid "Settings"
+msgstr ""
+
+#: staff.au_standing_label
+msgid "Standing"
+msgstr ""
+
+#: staff.au_stat_cat_entries_label
+msgid "Stat Cat Entries"
+msgstr ""
+
+#: staff.au_super_user_label
+msgid "Super User"
+msgstr ""
+
+#: staff.au_survey_responses_label
+msgid "Survey Responses"
+msgstr ""
+
+#: staff.au_usrgroup_label
+msgid "Usrgroup"
+msgstr ""
+
+#: staff.au_usrname_label
+msgid "Usrname"
+msgstr ""
+
+#: staff.admin.survey.available.label
+msgid "Available to:"
+msgstr ""
+
+#: staff.admin.survey.description.label
+msgid "Description:"
+msgstr ""
+
+#: staff.admin.survey.end.label
+msgid "End:"
+msgstr ""
+
+#: staff.admin.survey.format.label
+msgid "Poll Format:"
+msgstr ""
+
+#: staff.admin.survey.name.label
+#: staff.auth.name_prompt
+msgid "Name:"
+msgstr ""
+
+#: staff.admin.survey.opac_visible.label
+msgid "OPAC Visible:"
+msgstr ""
+
+#: staff.admin.survey.required.label
+msgid "Required:"
+msgstr ""
+
+#: staff.admin.survey.save_question.label
+#: staff.admin.survey.save_question.accesskey
+msgid "Save this &Question"
+msgstr ""
+
+#: staff.admin.survey.staff_client.label
+msgid "Staff Client:"
+msgstr ""
+
+#: staff.admin.survey.start.label
+msgid "Start:"
+msgstr ""
+
+#: staff.auth.logoff_prompt
+msgid "Log Off"
+msgstr ""
+
+#: staff.auth.logoff_prompt.accesskey
+msgid "f"
+msgstr ""
+
+#: staff.auth.name_prompt.key
+#: staff.main.menu.file.new.key
+#: staff.next.range.key
+msgid "N"
+msgstr ""
+
+#: staff.auth.password_prompt
+msgid "Password:"
+msgstr ""
+
+#: staff.auth.quit_prompt
+msgid "Exit Evergreen"
+msgstr ""
+
+#: staff.auth.quit_prompt.key
+msgid "x"
+msgstr ""
+
+#: staff.auth.submit_prompt.key
+#: staff.cat.fixed.SER.key
+#: staff.cat.search_submit.key
+#: staff.circ.checkin.submit_label.accesskey
+#: staff.circ.hold_capture.submit_label.accesskey
+#: staff.copy.save.key
+#: staff.main.auth.offline.interface.accesskey
+#: staff.main.menu.cat.bib_search.key
+#: staff.main.menu.circ.special.key
+#: staff.main.menu.file.save.key
+#: staff.marc.display.fixed.SER.key
+#: staff.marc.file.publish.key
+#: staff.patron_display.checkout.submit_label.accesskey
+#: staff.server.admin.transit.list.actions.accesskey
+msgid "S"
+msgstr ""
+
+#: staff.auth.title
+msgid "Evergreen Staff Client 3"
+msgstr ""
+
+#: staff.auth.version
+msgid "Evergreen 0.1.0 20051202"
+msgstr ""
+
+#: staff.bills_current_payment_label
+msgid "Current Payment"
+msgstr ""
+
+#: staff.bills_information
+msgid "Information"
+msgstr ""
+
+#: staff.bills_interface_label
+msgid "BILLS"
+msgstr ""
+
+#: staff.bills_money_label
+msgid "Money"
+msgstr ""
+
+#: staff.bills_total_owed_label
+msgid "Total Owed"
+msgstr ""
+
+#: staff.bills_wizard_label
+msgid "Bill Patron"
+msgstr ""
+
+#: staff.bills_xact_dates_label
+msgid "Record / Dates"
+msgstr ""
+
+#: staff.browse_list.circ_as_type
+msgid "Circulate As"
+msgstr ""
+
+#: staff.browse_list.circ_lib
+msgid "Circulating Lib"
+msgstr ""
+
+#: staff.browse_list.circulate
+#: staff.server.admin.copy_locations.editor.circulate
+msgid "Circulate"
+msgstr ""
+
+#: staff.browse_list.create_date
+msgid "Creation Date"
+msgstr ""
+
+#: staff.browse_list.creator
+msgid "Creator"
+msgstr ""
+
+#: staff.browse_list.edit_date
+msgid "Edit Date"
+msgstr ""
+
+#: staff.browse_list.editor
+msgid "Editor"
+msgstr ""
+
+#: staff.browse_list.library
+msgid "Owning Lib"
+msgstr ""
+
+#: staff.browse_list.location
+msgid "Location/Barcode"
+msgstr ""
+
+#: staff.browse_list.opac_visible
+#: staff.copy.notes.opac
+msgid "OPAC"
+msgstr ""
+
+#: staff.browse_list.ref
+#: staff.copy.attr.shelving_location.example5
+msgid "Reference"
+msgstr ""
+
+#: staff.browse_list.shelving_loc
+#: staff.copy.attr.shelving_location
+msgid "Shelving Location"
+msgstr ""
+
+#: staff.browse_list.win_title
+#: staff.record_list.win_title
+msgid "Cataloging"
+msgstr ""
+
+#: staff.cat.fixed.BKS
+msgid "BKS"
+msgstr ""
+
+#: staff.cat.fixed.BKS.key
+#: staff.copy.bucket.key
+#: staff.main.menu.cat.add_bib.key
+#: staff.main.menu.cat.bib_status.key
+#: staff.main.menu.cat.copy_status.accesskey
+#: staff.main.menu.circ.barcode.show_item.accesskey
+#: staff.main.menu.edit.buckets.copies.accesskey
+#: staff.main.menu.edit.buckets.key
+#: staff.marc.display.fixed.BKS.key
+#: staff.patron_navbar.bills.accesskey
+msgid "B"
+msgstr ""
+
+#: staff.cat.fixed.COM
+msgid "COM"
+msgstr ""
+
+#: staff.cat.fixed.COM.key
+#: staff.cat.search_order.key
+#: staff.main.menu.circ.checkout.key
+#: staff.main.menu.file.open.key
+#: staff.marc.display.fixed.COM.key
+msgid "O"
+msgstr ""
+
+#: staff.cat.fixed.MAP
+msgid "MAP"
+msgstr ""
+
+#: staff.cat.fixed.MIX
+msgid "MIX"
+msgstr ""
+
+#: staff.cat.fixed.MIX.key
+#: staff.main.menu.cat.dedup.key
+#: staff.main.menu.circ.missing.key
+#: staff.marc.display.fixed.MIX.key
+#: staff.marc.file.key
+msgid "M"
+msgstr ""
+
+#: staff.cat.fixed.REC
+msgid "REC"
+msgstr ""
+
+#: staff.cat.fixed.REC.key
+#: staff.checkin_patron.retrieve.accesskey
+#: staff.copy.reload.key
+#: staff.hold_capture_patron.retrieve.accesskey
+#: staff.main.auth.retest.accesskey
+#: staff.main.menu.circ.patron_registration.key
+#: staff.main.menu.edit.buckets.records.accesskey
+#: staff.main.menu.edit.redo.key
+#: staff.main.menu.entity.patron.register.key
+#: staff.marc.display.fixed.REC.key
+#: staff.marc.file.reload.key
+#: staff.patron_navbar.refresh.accesskey
+#: staff.patron_navbar.retrieve.accesskey
+#: staff.server.admin.offline.xacts.refresh.accesskey
+msgid "R"
+msgstr ""
+
+#: staff.cat.fixed.SCO
+msgid "SCO"
+msgstr ""
+
+#: staff.cat.fixed.SER
+msgid "SER"
+msgstr ""
+
+#: staff.cat.fixed.VIS
+msgid "VIS"
+msgstr ""
+
+#: staff.cat.fixed.VIS.key
+#: staff.cat.search_advanced.key
+#: staff.main.menu.cat.add_volume.key
+#: staff.main.menu.cat.volume_status.key
+#: staff.main.menu.edit.buckets.volumes.accesskey
+#: staff.marc.display.fixed.VIS.key
+#: staff.marc.file.validate.key
+msgid "V"
+msgstr ""
+
+#: staff.cat.opac.add_bucket.label
+#: staff.cat.opac.add_bucket.accesskey
+msgid "Add to &Bucket"
+msgstr ""
+
+#: staff.cat.opac.bib_in_new_tab.label
+msgid "Duplicate in New Tab"
+msgstr ""
+
+#: staff.cat.opac.copy_browse.label
+#: staff.cat.opac.copy_browse.accesskey
+msgid "&Holdings Maintenance"
+msgstr ""
+
+#: staff.cat.opac.default.label
+msgid "Set bottom interface as Default"
+msgstr ""
+
+#: staff.cat.opac.marc_edit.label
+#: staff.cat.opac.marc_edit.accesskey
+msgid "MARC &Edit"
+msgstr ""
+
+#: staff.cat.opac.marc_view.label
+#: staff.cat.opac.marc_view.accesskey
+msgid "MARC &View"
+msgstr ""
+
+#: staff.cat.opac.mark_for_overlay.label
+#: staff.cat.opac.mark_for_overlay.accesskey
+msgid "&Mark for Overlay"
+msgstr ""
+
+#: staff.cat.opac.delete_record.label
+#: staff.cat.opac.delete_record.accesskey
+msgid "&Delete Record"
+msgstr ""
+
+#: staff.cat.opac.menu.label
+#: staff.cat.opac.menu.accesskey
+msgid "&Actions for this Record"
+msgstr ""
+
+#: staff.cat.opac.opac_view.label
+#: staff.cat.opac.opac_view.accesskey
+msgid "&OPAC View"
+msgstr ""
+
+#: staff.cat.opac.record_end.label
+#: staff.cat.opac.record_end.accesskey
+msgid "&End"
+msgstr ""
+
+#: staff.cat.opac.record_next.label
+#: staff.cat.opac.record_next.accesskey
+msgid "&Next"
+msgstr ""
+
+#: staff.cat.opac.record_prev.label
+#: staff.cat.opac.record_prev.accesskey
+msgid "&Previous"
+msgstr ""
+
+#: staff.cat.opac.record_start.label
+#: staff.cat.opac.record_start.accesskey
+msgid "&Start"
+msgstr ""
+
+#: staff.cat.opac.refresh_me.label
+msgid "Reset Display"
+msgstr ""
+
+#: staff.cat.opac.remove_me.label
+msgid "Remove this Frame"
+msgstr ""
+
+#: staff.cat.opac.view_holds.label
+#: staff.cat.opac.view_holds.accesskey
+msgid "View Hold&s"
+msgstr ""
+
+#: staff.cat.popup.add_to_bucket
+#: staff.copy.bucket
+msgid "Add to Bucket"
+msgstr ""
+
+#: staff.cat.popup.add_to_bucket.key
+msgid ""
+"_: staff.cat.popup.add_to_bucket.key\n"
+msgstr ""
+
+#: staff.cat.popup.browse.record.tab.key
+msgid ""
+"_: staff.cat.popup.browse.record.tab.key\n"
+msgstr ""
+
+#: staff.cat.popup.browse.record.window.key
+msgid ""
+"_: staff.cat.popup.browse.record.window.key\n"
+msgstr ""
+
+#: staff.cat.popup.browse_record.tab
+msgid "View Copies (Tab)"
+msgstr ""
+
+#: staff.cat.popup.browse_record.window
+msgid "View Copies (Window)"
+msgstr ""
+
+#: staff.cat.popup.edit.record.tab.key
+msgid ""
+"_: staff.cat.popup.edit.record.tab.key\n"
+msgstr ""
+
+#: staff.cat.popup.edit.record.window.key
+msgid ""
+"_: staff.cat.popup.edit.record.window.key\n"
+msgstr ""
+
+#: staff.cat.popup.edit_record.tab
+msgid "Edit Record (Tab)"
+msgstr ""
+
+#: staff.cat.popup.edit_record.window
+msgid "Edit Record (Window)"
+msgstr ""
+
+#: staff.cat.search_advanced
+msgid "Advanced"
+msgstr ""
+
+#: staff.cat.search_barcode
+#: staff.server.admin.hold_pull.barcode
+msgid "Item Barcode"
+msgstr ""
+
+#: staff.cat.search_count_copy_show
+msgid "Show Only These Records"
+msgstr ""
+
+#: staff.cat.search_criteria
+msgid "Search Criteria"
+msgstr ""
+
+#: staff.cat.search_format.key
+#: staff.main.menu.circ.found.key
+#: staff.main.menu.edit.find.key
+#: staff.main.menu.file.key
+#: staff.marc.display.control_fields.key
+msgid "F"
+msgstr ""
+
+#: staff.cat.search_id
+msgid "System ID"
+msgstr ""
+
+#: staff.cat.search_isbn
+msgid "ISBN/ISSN"
+msgstr ""
+
+#: staff.cat.search_order
+msgid "Order"
+msgstr ""
+
+#: staff.cat.search_pubyear
+#: staff.record_list.pubyear
+msgid "Pub Year"
+msgstr ""
+
+#: staff.cat.search_submit
+#: staff.main.menu.search.label
+msgid "Search"
+msgstr ""
+
+#: staff.cat.search_tcn
+#: staff.record_list.tcn
+msgid "TCN"
+msgstr ""
+
+#: staff.cat.search_term
+msgid "Terms"
+msgstr ""
+
+#: staff.cat.search_term.key
+msgid "e"
+msgstr ""
+
+#: staff.cat.search_type.key
+#: staff.main.menu.file.new_tab.key
+msgid "T"
+msgstr ""
+
+#: staff.cat.test
+msgid "Test"
+msgstr ""
+
+#: staff.cat.test.key
+#: staff.main.menu.edit.key
+#: staff.marc.display.meta_data.key
+#: staff.marc.file.export.key
+#: staff.patron_navbar.edit.accesskey
+msgid "E"
+msgstr ""
+
+#: staff.cat.title
+msgid "TCN goes here"
+msgstr ""
+
+#: staff.cat.type_of_material
+msgid "All"
+msgstr ""
+
+#: staff.cat.type_of_material.a
+msgid "Language Material"
+msgstr ""
+
+#: staff.cat.type_of_material.c
+msgid "Notated Music"
+msgstr ""
+
+#: staff.cat.type_of_material.d
+msgid "Manuscript Notated Music"
+msgstr ""
+
+#: staff.cat.type_of_material.e
+msgid "Cartographic Material"
+msgstr ""
+
+#: staff.cat.type_of_material.f
+msgid "Manuscript Cartographic Material"
+msgstr ""
+
+#: staff.cat.type_of_material.g
+msgid "Projected Medium"
+msgstr ""
+
+#: staff.cat.type_of_material.i
+msgid "Nonmusical Sound Recording"
+msgstr ""
+
+#: staff.cat.type_of_material.j
+msgid "Musical Sound Recording"
+msgstr ""
+
+#: staff.cat.type_of_material.k
+msgid "Two-dimensional Nonprojectable Graphic"
+msgstr ""
+
+#: staff.cat.type_of_material.m
+msgid "Computer File"
+msgstr ""
+
+#: staff.cat.type_of_material.o
+msgid "Kit"
+msgstr ""
+
+#: staff.cat.type_of_material.p
+msgid "Mixed Material"
+msgstr ""
+
+#: staff.cat.type_of_material.r
+msgid "Three-dimensional Artifact or Naturally Occuring Object"
+msgstr ""
+
+#: staff.cat.type_of_material.t
+msgid "Manuscript Language Material"
+msgstr ""
+
+#: staff.checkin.auto_print_label
+#: staff.hold_capture.auto_print_label
+#: staff.patron_display.checkout.auto_print_label
+msgid "Auto-Print"
+msgstr ""
+
+#: staff.checkin.auto_print_label.accesskey
+#: staff.copy.notes.add.key
+#: staff.hold_capture.auto_print_label.accesskey
+#: staff.main.menu.edit.select_all.key
+#: staff.main.menu.tabs.close.accesskey
+#: staff.marc.display.cover_art.key
+#: staff.patron_display.checkout.auto_print_label.accesskey
+msgid "A"
+msgstr ""
+
+#: staff.checkin.done_label
+#: staff.hold_capture.done_label
+#: staff.patron_display.checkout.done_label
+msgid "Done"
+msgstr ""
+
+#: staff.checkin.done_label.accesskey
+#: staff.copy.notes.delete.key
+#: staff.hold_capture.done_label.accesskey
+#: staff.main.menu.edit.delete.key
+#: staff.marc.display.key
+#: staff.patron_display.checkout.done_label.accesskey
+msgid "D"
+msgstr ""
+
+#: staff.checkin.print_receipt_label
+#: staff.hold_capture.print_receipt_label
+msgid "Print List"
+msgstr ""
+
+#: staff.checkin.print_receipt_label.accesskey
+msgid ""
+"_: staff.checkin.print_receipt_label.accesskey\n"
+msgstr ""
+
+#: staff.checkin.reprint_receipt_label
+#: staff.hold_capture.reprint_receipt_label
+msgid "Re-Print Last List"
+msgstr ""
+
+#: staff.checkin_interface_label
+msgid "CHECK IN"
+msgstr ""
+
+#: staff.checkin_label_route_to
+msgid "Route To"
+msgstr ""
+
+#: staff.checkin_label_text
+msgid "Message"
+msgstr ""
+
+#: staff.checkin_patron.name.label
+#: staff.hold_capture_patron.name.label
+#: staff.patron_display.name.label
+msgid "Patron Name"
+msgstr ""
+
+#: staff.checkin_patron.retrieve
+#: staff.hold_capture_patron.retrieve
+#: staff.patron.context_display
+#: staff.patron_navbar.retrieve
+#: staff.server.admin.offline.xacts.get_patron.label
+msgid "Retrieve Patron"
+msgstr ""
+
+#: staff.checkout_interface_label
+msgid "CHECK OUT"
+msgstr ""
+
+#: staff.circ.offline.main.label
+msgid "Evergreen Offline"
+msgstr ""
+
+#: staff.circ.offline.server_time.tooltiptext
+msgid "Estimated Server Time - Click to adjust"
+msgstr ""
+
+#: staff.circ.offline.cmd_checkout.label
+#: staff.circ.offline.cmd_checkout.accesskey
+msgid "&Check Out"
+msgstr ""
+
+#: staff.circ.offline.cmd_renew.label
+#: staff.circ.offline.cmd_renew.accesskey
+msgid "&Renew"
+msgstr ""
+
+#: staff.circ.offline.cmd_in_house_use.label
+#: staff.circ.offline.cmd_in_house_use.accesskey
+msgid "In &House Use"
+msgstr ""
+
+#: staff.circ.offline.cmd_checkin.label
+#: staff.circ.offline.cmd_checkin.accesskey
+msgid "Check &In"
+msgstr ""
+
+#: staff.circ.offline.cmd_register_patron.label
+#: staff.circ.offline.cmd_register_patron.accesskey
+msgid "Register &Patron"
+msgstr ""
+
+#: staff.circ.offline.cmd_print_last_receipt.label
+#: staff.circ.offline.cmd_print_last_receipt.accesskey
+msgid "&Last Receipt"
+msgstr ""
+
+#: staff.circ.offline.cmd_exit.label
+#: staff.circ.offline.cmd_exit.accesskey
+msgid "E&xit"
+msgstr ""
+
+#: staff.circ.offline_checkin.main.label
+msgid "Standalone Check In"
+msgstr ""
+
+#: staff.circ.offline_checkin.step3.description
+msgid "Repeat Steps 2 until done."
+msgstr ""
+
+#: staff.circ.offline.finish.description
+#: staff.mbts_xact_finish_label
+msgid "Finish"
+msgstr ""
+
+#: staff.circ.offline.print.description
+msgid "Print receipt?"
+msgstr ""
+
+#: staff.circ.offline_checkout.main.label
+msgid "Standalone Check Out"
+msgstr ""
+
+#: staff.circ.offline_checkout.step2.description
+msgid "Enter the patron's barcode:"
+msgstr ""
+
+#: staff.circ.offline_checkout.step5.description
+#: staff.circ.offline_renew.step5.label
+msgid "Repeat Steps 3 and 4 until done."
+msgstr ""
+
+#: staff.circ.offline_in_house_use.main.label
+msgid "Standalone In House Use"
+msgstr ""
+
+#: staff.circ.offline_in_house_use.uses.label
+msgid "Enter the number of uses for the item:"
+msgstr ""
+
+#: staff.circ.offline_in_house_use.step4.description
+msgid "Repeat Steps 2 and 3 until done."
+msgstr ""
+
+#: staff.circ.offline_register.main.label
+msgid "Standalone Patron Registration"
+msgstr ""
+
+#: staff.circ.offline_register.x_home_ou.label
+#: staff.patron_display.home_ou.label
+msgid "Home Library:"
+msgstr ""
+
+#: staff.circ.offline_register.x_profile.label
+#: staff.patron_display.profile.label
+msgid "Profile:"
+msgstr ""
+
+#: staff.circ.offline_register.barcode.label
+msgid "New Barcode:"
+msgstr ""
+
+#: staff.circ.offline_register.passwd.label
+msgid "New Password:"
+msgstr ""
+
+#: staff.circ.offline_register.family_name.label
+#: staff.patron_display.family_name.label
+msgid "Last Name:"
+msgstr ""
+
+#: staff.circ.offline_register.first_given_name.label
+#: staff.patron_display.first_given_name.label
+#: staff.patron_search_form.first_given_name.label
+msgid "First Name:"
+msgstr ""
+
+#: staff.circ.offline_register.dob.label
+msgid "Date of Birth:"
+msgstr ""
+
+#: staff.circ.offline_register.x_ident_type.label
+msgid "Ident Type:"
+msgstr ""
+
+#: staff.circ.offline_register.ident_value.label
+msgid "Ident Value:"
+msgstr ""
+
+#: staff.circ.offline_register.street1.label
+msgid "Line 1"
+msgstr ""
+
+#: staff.circ.offline_register.street2.label
+msgid "Line 2"
+msgstr ""
+
+#: staff.circ.offline_register.city.label
+msgid "City"
+msgstr ""
+
+#: staff.circ.offline_register.state.label
+msgid "State"
+msgstr ""
+
+#: staff.circ.offline_register.state.default_value
+msgid "GA"
+msgstr ""
+
+#: staff.circ.offline_register.post_code.label
+msgid "Postal Code"
+msgstr ""
+
+#: staff.circ.offline_register.country.label
+msgid "Country"
+msgstr ""
+
+#: staff.circ.offline_register.country.default_value
+msgid "USA"
+msgstr ""
+
+#: staff.circ.offline_register.submit.label
+#: staff.circ.offline_register.submit.accesskey
+msgid "&Save patron registration"
+msgstr ""
+
+#: staff.circ.offline_renew.main.label
+msgid "Standalone Renew"
+msgstr ""
+
+#: staff.circ.offline_renew.p_barcode.description
+msgid "(Optional) Enter the patron's barcode:"
+msgstr ""
+
+#: staff.circ.checkin.caption
+#: staff.circ.context_checkin
+msgid "Check In"
+msgstr ""
+
+#: staff.circ.checkin.scan_label
+#: staff.circ.hold_capture.scan_label
+#: staff.patron_display.checkout.scan_label
+msgid "Enter Barcode:"
+msgstr ""
+
+#: staff.circ.checkin.scan_label.accesskey
+#: staff.circ.hold_capture.scan_label.accesskey
+#: staff.main.menu.cat.key
+#: staff.patron_display.checkout.scan_label.accesskey
+msgid "a"
+msgstr ""
+
+#: staff.circ.context_cancel_hold
+msgid "Cancel Hold"
+msgstr ""
+
+#: staff.circ.context_edit
+msgid "Edit Copy"
+msgstr ""
+
+#: staff.circ.context_lost
+msgid "Mark as Lost"
+msgstr ""
+
+#: staff.circ.context_missing
+msgid "Mark as Missing"
+msgstr ""
+
+#: staff.circ.context_opac
+msgid "Show Title in OPAC"
+msgstr ""
+
+#: staff.circ.context_renew
+#: staff.main.menu.circ.renew.label
+msgid "Renew"
+msgstr ""
+
+#: staff.circ.hold_capture.caption
+msgid "Capture Hold"
+msgstr ""
+
+#: staff.circ_label_due_date
+msgid "Due Date"
+msgstr ""
+
+#: staff.circ_label_id
+msgid "Circ Id"
+msgstr ""
+
+#: staff.circ_label_renewal_remaining
+msgid "Remaining Renewals"
+msgstr ""
+
+#: staff.circ_label_xact_finish
+msgid "Checkin Date"
+msgstr ""
+
+#: staff.circ_label_xact_start
+msgid "Checkout Date"
+msgstr ""
+
+#: staff.copies_editor_interface_label
+msgid "COPIES EDIT"
+msgstr ""
+
+#: staff.copy.attr.circulate
+msgid "Circulate?"
+msgstr ""
+
+#: staff.copy.attr.circulate.no
+#: staff.copy.attr.deposit.no
+#: staff.copy.attr.notes_viewable.example2
+#: staff.copy.attr.opac_visible.no
+#: staff.copy.attr.reference_material.no
+#: staff.server.admin.copy_locations.editor.no
+msgid "No"
+msgstr ""
+
+#: staff.copy.attr.circulate.yes
+#: staff.copy.attr.deposit.yes
+#: staff.copy.attr.notes_viewable.example1
+#: staff.copy.attr.opac_visible.yes
+#: staff.copy.attr.reference_material.yes
+#: staff.server.admin.copy_locations.editor.yes
+msgid "Yes"
+msgstr ""
+
+#: staff.copy.attr.circulating_lib
+msgid "Circulating Library"
+msgstr ""
+
+#: staff.copy.attr.copy_available
+msgid "Copy Status: Available?"
+msgstr ""
+
+#: staff.copy.attr.copy_status
+msgid "Copy Status"
+msgstr ""
+
+#: staff.copy.attr.deposit
+msgid "Deposit?"
+msgstr ""
+
+#: staff.copy.attr.deposit_amount
+msgid "Amount"
+msgstr ""
+
+#: staff.copy.attr.deposit_notes
+msgid "Deposit Notes"
+msgstr ""
+
+#: staff.copy.attr.fine_level.high
+msgid "High"
+msgstr ""
+
+#: staff.copy.attr.fine_level.low
+msgid "Low"
+msgstr ""
+
+#: staff.copy.attr.fine_level.normal
+#: staff.copy.attr.loan_duration.normal
+msgid "Normal"
+msgstr ""
+
+#: staff.copy.attr.holds_protection
+msgid "Holds Protection"
+msgstr ""
+
+#: staff.copy.attr.holds_protection.example1
+msgid "3 months (facility)"
+msgstr ""
+
+#: staff.copy.attr.holds_protection.example2
+msgid "6 months (region)"
+msgstr ""
+
+#: staff.copy.attr.holds_protection.example3
+msgid "No hold protection"
+msgstr ""
+
+#: staff.copy.attr.holds_protection.example4
+msgid "Not holdable"
+msgstr ""
+
+#: staff.copy.attr.home_lib
+msgid "Home Library"
+msgstr ""
+
+#: staff.copy.attr.loan_duration.long
+msgid "Long"
+msgstr ""
+
+#: staff.copy.attr.loan_duration.short
+msgid "Short"
+msgstr ""
+
+#: staff.copy.attr.notes
+msgid "Copy Notes"
+msgstr ""
+
+#: staff.copy.attr.notes_viewable
+msgid "Copy Notes Patron Viewable?"
+msgstr ""
+
+#: staff.copy.attr.opac_visible
+msgid "OPAC Visible?"
+msgstr ""
+
+#: staff.copy.attr.reference_material
+msgid "Reference Material?"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example1
+msgid "Stacks"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example10
+msgid "Paperback"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example2
+msgid "Audio-Visual"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example3
+msgid "Children's Room"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example4
+msgid "Garden Room"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example6
+msgid "Ready Reference"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example7
+msgid "Behind Circulation Desk"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example8
+#: staff.marc.display
+msgid "Display"
+msgstr ""
+
+#: staff.copy.attr.shelving_location.example9
+msgid "Health"
+msgstr ""
+
+#: staff.copy.attr.stat.audience
+msgid "Audience"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example1
+msgid "Adult"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example2
+msgid "Juvenile"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example3
+msgid "Preschool"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example4
+msgid "Primary"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example5
+msgid "Pre-adolescent"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example6
+msgid "Young adult"
+msgstr ""
+
+#: staff.copy.attr.stat.audience.example7
+msgid "General"
+msgstr ""
+
+#: staff.copy.attr.stat.genre
+msgid "Genre"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example1
+msgid "Adventure"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example10
+msgid "Spy"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example11
+msgid "Thriller"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example12
+msgid "War"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example13
+msgid "Western"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example14
+msgid "Religious fiction"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example15
+msgid "Shortstory"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example16
+#: staff.marc.008.BKS.biog.desc
+msgid "Biography"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example17
+#: staff.copy.attr.stat.genre.example4
+msgid "Holiday"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example18
+msgid "Nonfiction"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example2
+msgid "Fantasy"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example3
+msgid "Historical"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example5
+msgid "Horror"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example6
+msgid "Humor"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example7
+msgid "Mystery"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example8
+msgid "Romance"
+msgstr ""
+
+#: staff.copy.attr.stat.genre.example9
+msgid "Sci-fi"
+msgstr ""
+
+#: staff.copy.clone
+msgid "Clone Copy"
+msgstr ""
+
+#: staff.copy.clone.key
+msgid ""
+"_: staff.copy.clone.key\n"
+msgstr ""
+
+#: staff.copy.close
+msgid "Close Window"
+msgstr ""
+
+#: staff.copy.default.attr
+msgid "Default Attributes"
+msgstr ""
+
+#: staff.copy.default.attr.value
+#: staff.copy.local.attr.value
+msgid "Value"
+msgstr ""
+
+#: staff.copy.delete
+msgid "Delete Copy"
+msgstr ""
+
+#: staff.copy.delete.key
+msgid ""
+"_: staff.copy.delete.key\n"
+msgstr ""
+
+#: staff.copy.edit_categories
+msgid "Edit Categories"
+msgstr ""
+
+#: staff.copy.edit_entries
+msgid "Edit Entries"
+msgstr ""
+
+#: staff.copy.local.attr
+msgid "Local Attributes"
+msgstr ""
+
+#: staff.copy.notes
+msgid "Note"
+msgstr ""
+
+#: staff.copy.notes.add
+msgid "Add Note"
+msgstr ""
+
+#: staff.copy.notes.date
+msgid "Date"
+msgstr ""
+
+#: staff.copy.notes.delete
+msgid "Delete Note"
+msgstr ""
+
+#: staff.copy.notes.from
+msgid "From"
+msgstr ""
+
+#: staff.copy.reload
+msgid "Reload Copy"
+msgstr ""
+
+#: staff.copy.save
+msgid "Save Copy"
+msgstr ""
+
+#: staff.copy.title
+msgid "Barcode goes here"
+msgstr ""
+
+#: staff.copy.transfer
+msgid "Transfer Copy"
+msgstr ""
+
+#: staff.copy.transfer.key
+msgid ""
+"_: staff.copy.transfer.key\n"
+msgstr ""
+
+#: staff.copy.wizard.title
+msgid "Batch Add Copies Wizard"
+msgstr ""
+
+#: staff.copy_browser_interface_label
+msgid "COPIES"
+msgstr ""
+
+#: staff.copy_stat_cat_editor_interface_label
+msgid "COPY STAT-CATS"
+msgstr ""
+
+#: staff.display_patron_interface_label
+msgid "DISPLAY PATRON"
+msgstr ""
+
+#: staff.displaying.hits_per_page
+msgid "Results per page"
+msgstr ""
+
+#: staff.displaying.results
+msgid "Displaying results"
+msgstr ""
+
+#: staff.fieldmapper_label
+msgid "FIELDMAPPER"
+msgstr ""
+
+#: staff.filter_console_label
+msgid "FCONSOLE"
+msgstr ""
+
+#: staff.hold_capture.print_receipt_label.accesskey
+msgid ""
+"_: staff.hold_capture.print_receipt_label.accesskey\n"
+msgstr ""
+
+#: staff.hold_capture_interface_label
+msgid "HOLD CAPTURE"
+msgstr ""
+
+#: staff.holds_status_available
+msgid "Available"
+msgstr ""
+
+#: staff.holds_status_in_transit
+msgid "In Transit"
+msgstr ""
+
+#: staff.holds_status_waiting_for_capture
+msgid "Copy found, waiting for capture"
+msgstr ""
+
+#: staff.holds_status_waiting_for_copy
+msgid "Waiting for available copy"
+msgstr ""
+
+#: staff.items_out_interface_label
+msgid "ITEMS OUT"
+msgstr ""
+
+#: staff.javascript_console_label
+msgid "CONSOLE"
+msgstr ""
+
+#: staff.javascript_shell_label
+msgid "JS SHELL"
+msgstr ""
+
+#: staff.main.auth.caption
+msgid "Authentication"
+msgstr ""
+
+#: staff.main.auth.caption
+msgid "Startup / Shutdown"
+msgstr ""
+
+#: staff.main.auth.debug.caption
+msgid "Debug Options"
+msgstr ""
+
+#: staff.main.auth.debug.clear
+#: staff.main.menu.admin.clear_cache.label
+msgid "Clear Cache"
+msgstr ""
+
+#: staff.main.auth.debug.javascript
+msgid "Javascript Console"
+msgstr ""
+
+#: staff.main.auth.debug.javascript.accesskey
+msgid "J"
+msgstr ""
+
+#: staff.main.auth.hostname
+msgid "Hostname"
+msgstr ""
+
+#: staff.main.auth.hostname.accesskey
+#: staff.main.menu.circ.hold_capture.key
+#: staff.main.menu.circ.place_hold.key
+#: staff.main.menu.help.key
+#: staff.patron_navbar.holds.accesskey
+msgid "H"
+msgstr ""
+
+#: staff.main.auth.offline.caption
+msgid "Offline Use"
+msgstr ""
+
+#: staff.main.auth.offline.export
+msgid "Export Transactions"
+msgstr ""
+
+#: staff.main.auth.offline.import
+msgid "Import Transactions"
+msgstr ""
+
+#: staff.main.auth.offline.interface
+msgid "Standalone Interface"
+msgstr ""
+
+#: staff.main.auth.retest
+msgid "Re-Test Server"
+msgstr ""
+
+#: staff.main.auth.server
+msgid "Server"
+msgstr ""
+
+#: staff.main.auth.version
+msgid "Version"
+msgstr ""
+
+#: staff.main.auth.workstation
+msgid "Workstation"
+msgstr ""
+
+#: staff.main.menu.acquisitions.key
+msgid "q"
+msgstr ""
+
+#: staff.main.menu.acquisitions.label
+msgid "Acquisitions"
+msgstr ""
+
+#: staff.main.menu.admin.accesskey
+#: staff.main.menu.admin.developer.accesskey
+msgid "-"
+msgstr ""
+
+#: staff.main.menu.admin.browse_holds.label
+#: staff.main.menu.admin.browse_holds.accesskey
+msgid "&Browse Unfulfilled Holds for this Pickup Lib"
+msgstr ""
+
+#: staff.main.menu.admin.change_session.label
+msgid "Operator Change: New"
+msgstr ""
+
+#: staff.main.menu.admin.clear_cache.accesskey
+#: staff.marc.008.SER.cont.field_size
+#: staff.marc.008.ctry.field_size
+#: staff.marc.008.lang.field_size
+msgid "3"
+msgstr ""
+
+#: staff.main.menu.admin.cmd_console.label
+#: staff.main.menu.admin.cmd_console.accesskey
+msgid "&Javascript Console"
+msgstr ""
+
+#: staff.main.menu.admin.cmd_shell.label
+#: staff.main.menu.admin.cmd_shell.accesskey
+msgid "Javascript S&hell"
+msgstr ""
+
+#: staff.main.menu.admin.cmd_test.label
+msgid "Test Module"
+msgstr ""
+
+#: staff.main.menu.admin.copy_location_edit.label
+#: staff.main.menu.admin.copy_location_edit.accesskey
+msgid "Copy &Location Editor"
+msgstr ""
+
+#: staff.main.menu.admin.developer.label
+msgid "For developers..."
+msgstr ""
+
+#: staff.main.menu.admin.download_patrons.label
+#: staff.main.menu.admin.download_patrons.accesskey
+msgid "&Download Offline Patron List"
+msgstr ""
+
+#: staff.main.menu.admin.fieldmapper.label
+#: staff.main.menu.admin.fieldmapper.accesskey
+msgid "Field&mapper"
+msgstr ""
+
+#: staff.main.menu.admin.key
+msgid "i"
+msgstr ""
+
+#: staff.main.menu.admin.label
+msgid "Admin"
+msgstr ""
+
+#: staff.main.menu.admin.local_admin.label
+#: staff.main.menu.admin.local_admin.accesskey
+msgid "&Local System Administration"
+msgstr ""
+
+#: staff.main.menu.admin.non_cat_type_edit.label
+#: staff.main.menu.admin.non_cat_type_edit.accesskey
+msgid "&Non-Cataloged Type Editor"
+msgstr ""
+
+#: staff.main.menu.admin.offline_xacts.label
+#: staff.main.menu.admin.offline_xacts.accesskey
+msgid "Offline &Transaction Management"
+msgstr ""
+
+#: staff.main.menu.admin.public_opac.label
+#: staff.main.menu.admin.public_opac.accesskey
+msgid "&Public OPAC"
+msgstr ""
+
+#: staff.main.menu.admin.restore_all_tabs.label
+msgid "Unhide Tabs"
+msgstr ""
+
+#: staff.main.menu.admin.extension_manager.label
+msgid "Extension Manager"
+msgstr ""
+
+#: staff.main.menu.admin.theme_manager.label
+msgid "Theme Manager"
+msgstr ""
+
+#: staff.main.menu.admin.about_config.label
+msgid "about:config"
+msgstr ""
+
+#: staff.main.menu.admin.stat_cat_edit.label
+#: staff.main.menu.admin.stat_cat_edit.accesskey
+msgid "Statistical &Category Editor"
+msgstr ""
+
+#: staff.main.menu.admin.survey_wizard.label
+#: staff.main.menu.admin.survey_wizard.accesskey
+msgid "&Survey Wizard"
+msgstr ""
+
+#: staff.main.menu.admin.template_edit.label
+#: staff.main.menu.admin.template_edit.accesskey
+msgid "&Receipt Template Editor"
+msgstr ""
+
+#: staff.main.menu.admin.user_edit.label
+#: staff.main.menu.admin.user_edit.accesskey
+msgid "&User Permission Editor"
+msgstr ""
+
+#: staff.main.menu.admin.xuleditor.label
+#: staff.main.menu.admin.xuleditor.accesskey
+msgid "&XUL Test"
+msgstr ""
+
+#: staff.main.menu.admin.venkman.label
+msgid "Venkman"
+msgstr ""
+
+#: staff.main.menu.cat.label
+#: staff.main.menu.cat.accesskey
+msgid "Catalo&ging"
+msgstr ""
+
+#: staff.main.menu.cat.add_bib.label
+msgid "Add Bib Record"
+msgstr ""
+
+#: staff.main.menu.cat.add_copy.key
+#: staff.main.menu.cat.copy_status.key
+#: staff.main.menu.circ.copy_status.key
+#: staff.patron_navbar.items.accesskey
+msgid "I"
+msgstr ""
+
+#: staff.main.menu.cat.add_copy.label
+msgid "Add Item"
+msgstr ""
+
+#: staff.main.menu.cat.add_volume.label
+msgid "Add Volume"
+msgstr ""
+
+#: staff.main.menu.cat.bib_search.label
+msgid "Search the Catalog"
+msgstr ""
+
+#: staff.main.menu.cat.bib_status.label
+msgid "Display Bib Record"
+msgstr ""
+
+#: staff.main.menu.cat.copy_status.label
+#: staff.main.menu.circ.copy_status.label
+msgid "Display Item"
+msgstr ""
+
+#: staff.main.menu.cat.create_marc.label
+#: staff.main.menu.cat.create_marc.accesskey
+msgid "Create &New Marc Record"
+msgstr ""
+
+#: staff.main.menu.cat.dedup.label
+msgid "Merge/Transfer Interface"
+msgstr ""
+
+#: staff.main.menu.cat.edit_copy_buckets.label
+#: staff.main.menu.cat.edit_copy_buckets.accesskey
+msgid "Manage Copy &Buckets"
+msgstr ""
+
+#: staff.main.menu.cat.edit_record_buckets.label
+#: staff.main.menu.cat.edit_record_buckets.accesskey
+msgid "Manage &Record Buckets"
+msgstr ""
+
+#: staff.main.menu.cat.edit_volume_buckets.label
+#: staff.main.menu.cat.edit_volume_buckets.accesskey
+msgid "Manage &Volume Buckets"
+msgstr ""
+
+#: staff.main.menu.cat.edit_user_buckets.label
+#: staff.main.menu.cat.edit_user_buckets.accesskey
+msgid "Manage &User Buckets"
+msgstr ""
+
+#: staff.main.menu.cat.retrieve_last_record.label
+#: staff.main.menu.cat.retrieve_last_record.accesskey
+msgid "Retrieve &Last Record"
+msgstr ""
+
+#: staff.main.menu.cat.search_tcn.label
+#: staff.main.menu.cat.search_tcn.accesskey
+msgid "Retrieve record by &TCN"
+msgstr ""
+
+#: staff.main.menu.cat.volume_status.label
+msgid "Display Volume"
+msgstr ""
+
+#: staff.main.menu.cat.z39_50_import.label
+#: staff.main.menu.cat.z39_50_import.accesskey
+msgid "Import Record from &Z39.50"
+msgstr ""
+
+#: staff.main.menu.circ.barcode.retrieve_patron
+msgid "Retrieve Patron by Barcode"
+msgstr ""
+
+#: staff.main.menu.circ.barcode.show_item
+msgid "Show Item Status by Barcode"
+msgstr ""
+
+#: staff.main.menu.circ.checkin.label
+msgid "Check In Items"
+msgstr ""
+
+#: staff.main.menu.circ.checkout.label
+msgid "Check Out Items"
+msgstr ""
+
+#: staff.main.menu.circ.claimed_returned.label
+msgid "Mark as \"Claimed Returned\""
+msgstr ""
+
+#: staff.main.menu.circ.found.label
+msgid "Mark Found"
+msgstr ""
+
+#: staff.main.menu.circ.hold_browse.label
+#: staff.main.menu.circ.hold_browse.accesskey
+msgid "&Browse Holds Shelf"
+msgstr ""
+
+#: staff.main.menu.circ.hold_capture.label
+msgid "Capture Holds"
+msgstr ""
+
+#: staff.main.menu.circ.hold_pull.label
+#: staff.main.menu.circ.hold_pull.accesskey
+msgid "Pull Li&st for Hold Requests"
+msgstr ""
+
+#: staff.main.menu.circ.in_house.label
+#: staff.main.menu.circ.in_house.accesskey
+msgid "Record &In-House Use"
+msgstr ""
+
+#: staff.main.menu.circ.label
+msgid "Circulation"
+msgstr ""
+
+#: staff.main.menu.circ.lost.label
+msgid "Mark Lost"
+msgstr ""
+
+#: staff.main.menu.circ.mark_used.key
+#: staff.main.menu.edit.buckets.users.accesskey
+#: staff.main.menu.edit.undo.key
+msgid "U"
+msgstr ""
+
+#: staff.main.menu.circ.mark_used.label
+msgid "Mark Used"
+msgstr ""
+
+#: staff.main.menu.circ.missing.label
+msgid "Mark Missing"
+msgstr ""
+
+#: staff.main.menu.circ.offline.label
+#: staff.main.menu.circ.offline.accesskey
+msgid "Enter O&ffline Interface"
+msgstr ""
+
+#: staff.main.menu.circ.patron_registration.label
+msgid "Register Patron"
+msgstr ""
+
+#: staff.main.menu.circ.patron_retrieve.label
+#: staff.main.menu.circ.patron_retrieve.accesskey
+msgid "Retrieve &Last Patron"
+msgstr ""
+
+#: staff.main.menu.circ.patron_status.label
+msgid "Display Patron"
+msgstr ""
+
+#: staff.main.menu.circ.place_hold.label
+#: staff.main.menu.circ.place_hold.accesskey
+msgid "Place &Hold"
+msgstr ""
+
+#: staff.main.menu.circ.quick_add.key
+#: staff.main.menu.quit.accesskey
+msgid "Q"
+msgstr ""
+
+#: staff.main.menu.circ.quick_add.label
+msgid "Quick Add"
+msgstr ""
+
+#: staff.main.menu.circ.renew.key
+msgid "n"
+msgstr ""
+
+#: staff.main.menu.circ.reprint.label
+#: staff.main.menu.circ.reprint.accesskey
+msgid "Re-Print &Last"
+msgstr ""
+
+#: staff.main.menu.circ.special.label
+msgid "Special Circulation"
+msgstr ""
+
+#: staff.main.menu.edit.buckets.copies
+msgid "Copy Buckets"
+msgstr ""
+
+#: staff.main.menu.edit.buckets.label
+msgid "Manage Buckets"
+msgstr ""
+
+#: staff.main.menu.edit.buckets.records
+msgid "Record Buckets"
+msgstr ""
+
+#: staff.main.menu.edit.buckets.volumes
+msgid "Volume Buckets"
+msgstr ""
+
+#: staff.main.menu.edit.buckets.users
+msgid "User Buckets"
+msgstr ""
+
+#: staff.main.menu.edit.copy.label
+#: staff.server.admin.stat_cat.copy
+msgid "Copy"
+msgstr ""
+
+#: staff.main.menu.edit.cut.key
+msgid "t"
+msgstr ""
+
+#: staff.main.menu.edit.cut.label
+msgid "Cut"
+msgstr ""
+
+#: staff.main.menu.edit.delete.label
+#: staff.server.admin.closed_dates.editor.delete
+#: staff.server.admin.copy_locations.editor.delete
+#: staff.server.admin.non_cat_types.delete
+msgid "Delete"
+msgstr ""
+
+#: staff.main.menu.edit.find.label
+msgid "Find"
+msgstr ""
+
+#: staff.main.menu.edit.find_again.key
+msgid "g"
+msgstr ""
+
+#: staff.main.menu.edit.find_again.label
+msgid "Find Again"
+msgstr ""
+
+#: staff.main.menu.edit.label
+#: staff.patron_navbar.edit
+#: staff.server.admin.copy_locations.editor.edit
+#: staff.server.admin.non_cat_types.edit
+#: staff.server.admin.stat_cat.edit
+msgid "Edit"
+msgstr ""
+
+#: staff.main.menu.edit.paste.label
+msgid "Paste"
+msgstr ""
+
+#: staff.main.menu.edit.redo.label
+msgid "Redo"
+msgstr ""
+
+#: staff.main.menu.edit.select_all.label
+msgid "Select All"
+msgstr ""
+
+#: staff.main.menu.edit.undo.label
+msgid "Undo"
+msgstr ""
+
+#: staff.main.menu.entity.bib.key
+msgid ""
+"_: staff.main.menu.entity.bib.key\n"
+msgstr ""
+
+#: staff.main.menu.entity.bib.label
+msgid "Bib Records"
+msgstr ""
+
+#: staff.main.menu.entity.copy.key
+msgid ""
+"_: staff.main.menu.entity.copy.key\n"
+msgstr ""
+
+#: staff.main.menu.entity.copy.label
+msgid "Items"
+msgstr ""
+
+#: staff.main.menu.entity.patron.key
+msgid ""
+"_: staff.main.menu.entity.patron.key\n"
+msgstr ""
+
+#: staff.main.menu.entity.patron.label
+msgid "Patrons"
+msgstr ""
+
+#: staff.main.menu.entity.volume.key
+msgid ""
+"_: staff.main.menu.entity.volume.key\n"
+msgstr ""
+
+#: staff.main.menu.entity.volume.label
+msgid "Volumes"
+msgstr ""
+
+#: staff.main.menu.file.close.label
+#: staff.main.menu.file.close.accesskey
+msgid "Close &Window"
+msgstr ""
+
+#: staff.main.menu.file.close_tab.label
+#: staff.main.menu.file.close_tab.accesskey
+msgid "&Close Tab"
+msgstr ""
+
+#: staff.main.menu.file.close_tab.key
+msgid ""
+"_: staff.main.menu.file.close_tab.key\n"
+msgstr ""
+
+#: staff.main.menu.file.label
+msgid "File"
+msgstr ""
+
+#: staff.main.menu.file.new.label
+msgid "New Window"
+msgstr ""
+
+#: staff.main.menu.file.new_tab.label
+msgid "New Tab"
+msgstr ""
+
+#: staff.main.menu.file.open.label
+msgid "Open Session"
+msgstr ""
+
+#: staff.main.menu.file.save.label
+msgid "Save Session"
+msgstr ""
+
+#: staff.main.menu.help.label
+#: staff.server.admin.copy_locations.editor.help
+#: staff.server.admin.non_cat_types.in_house_circ
+msgid "Help"
+msgstr ""
+
+#: staff.main.menu.quit
+msgid "Quit Program"
+msgstr ""
+
+#: staff.main.menu.replace_barcode.label
+msgid "Replace Barcode"
+msgstr ""
+
+#: staff.main.menu.reports.key
+msgid ""
+"_: staff.main.menu.reports.key\n"
+msgstr ""
+
+#: staff.main.menu.reports.label
+#: staff.server.admin.index.reports
+msgid "Reports"
+msgstr ""
+
+#: staff.main.menu.search.catalog.label
+#: staff.main.menu.search.catalog.accesskey
+msgid "the &Catalog"
+msgstr ""
+
+#: staff.main.menu.search.copies.label
+#: staff.main.menu.search.copies.accesskey
+msgid "for copies by &Barcode"
+msgstr ""
+
+#: staff.main.menu.search.key
+msgid "r"
+msgstr ""
+
+#: staff.main.menu.search.patrons.label
+#: staff.main.menu.search.patrons.accesskey
+msgid "for &Patrons"
+msgstr ""
+
+#: staff.main.menu.search.patrons_barcode.label
+#: staff.main.menu.search.patrons_barcode.accesskey
+msgid "for patro&n by Barcode"
+msgstr ""
+
+#: staff.main.menu.search.record.label
+#: staff.main.menu.search.record.accesskey
+msgid "for record by &TCN"
+msgstr ""
+
+#: staff.main.menu.serials.key
+msgid "l"
+msgstr ""
+
+#: staff.main.menu.serials.label
+#: staff.z39_50.search_class.item_type.ser
+msgid "Serials"
+msgstr ""
+
+#: staff.main.menu.tabs.close
+msgid "Close All Tabs"
+msgstr ""
+
+#: staff.main.menu.title
+msgid "Evergreen Staff Client"
+msgstr ""
+
+#: staff.main.simple_auth.authorization.label
+msgid "Authorization"
+msgstr ""
+
+#: staff.main.simple_auth.authorize.label
+#: staff.main.simple_auth.authorize.accesskey
+msgid "&Authorization"
+msgstr ""
+
+#: staff.main.simple_auth.exception.label
+msgid "Exception"
+msgstr ""
+
+#: staff.main.test.example_template.label
+msgid "Hello world!"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.desc
+msgid "Index"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.field
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field
+#: staff.marc.008.BKS.SER.conf.field
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field
+#: staff.marc.008.BKS.biog.field
+#: staff.marc.008.BKS.cont.field
+#: staff.marc.008.BKS.fest.field
+#: staff.marc.008.BKS.ills.field
+#: staff.marc.008.BKS.litf.field
+#: staff.marc.008.MAP.VIS.form.field
+#: staff.marc.008.SER.alph.field
+#: staff.marc.008.SER.cont.field
+#: staff.marc.008.SER.entw.field
+#: staff.marc.008.SER.freq.field
+#: staff.marc.008.SER.issn.field
+#: staff.marc.008.SER.orig.field
+#: staff.marc.008.SER.regl.field
+#: staff.marc.008.SER.srtp.field
+#: staff.marc.008.SER.succ.field
+#: staff.marc.008.ctry.field
+#: staff.marc.008.date1.field
+#: staff.marc.008.date2.field
+#: staff.marc.008.dtst.field
+#: staff.marc.008.entered.field
+#: staff.marc.008.lang.field
+#: staff.marc.008.mrec.field
+#: staff.marc.008.srce.field
+msgid "008"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.field_end_pos
+#: staff.marc.008.BKS.MAP.indx.field_start_pos
+msgid "31"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.field_size
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_size
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_size
+#: staff.marc.008.BKS.SER.conf.field_size
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_size
+#: staff.marc.008.BKS.biog.field_size
+#: staff.marc.008.BKS.fest.field_size
+#: staff.marc.008.BKS.litf.field_size
+#: staff.marc.008.MAP.VIS.form.field_size
+#: staff.marc.008.SER.alph.field_size
+#: staff.marc.008.SER.entw.field_size
+#: staff.marc.008.SER.freq.field_size
+#: staff.marc.008.SER.issn.field_size
+#: staff.marc.008.SER.orig.field_size
+#: staff.marc.008.SER.regl.field_size
+#: staff.marc.008.SER.srtp.field_size
+#: staff.marc.008.SER.succ.field_size
+#: staff.marc.008.dtst.field_size
+#: staff.marc.008.mrec.field_size
+#: staff.marc.008.srce.field_size
+#: staff.marc.LDR.blvl.field_size
+#: staff.marc.LDR.ctrl.field_size
+#: staff.marc.LDR.desc.field_size
+#: staff.marc.LDR.elvl.field_size
+#: staff.marc.LDR.rec_stat.field_size
+#: staff.marc.LDR.type.field_size
+msgid "1"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/indx.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.MAP.indx.short
+msgid "Indx"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.desc
+#: staff.marc.008.MAP.VIS.form.desc
+msgid "Form of Item"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_end_pos
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_start_pos
+msgid "23"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.help
+#: staff.marc.008.MAP.VIS.form.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/form.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.short
+#: staff.marc.008.MAP.VIS.form.short
+msgid "Form"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.desc
+msgid "Government Publication"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_end_pos
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_start_pos
+msgid "28"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/gpub.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.short
+msgid "GPub"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.conf.desc
+msgid "Conference Publication"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.conf.field_end_pos
+#: staff.marc.008.BKS.SER.conf.field_start_pos
+#: staff.marc.008.MAP.VIS.form.field_end_pos
+#: staff.marc.008.MAP.VIS.form.field_start_pos
+msgid "29"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.conf.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/conf.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.SER.conf.short
+msgid "Conf"
+msgstr ""
+
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.desc
+msgid "Target Audience"
+msgstr ""
+
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_end_pos
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_start_pos
+#: staff.marc.008.SER.orig.field_end_pos
+#: staff.marc.008.SER.orig.field_start_pos
+msgid "22"
+msgstr ""
+
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/audn.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.short
+msgid "Audn"
+msgstr ""
+
+#: staff.marc.008.BKS.biog.field_end_pos
+#: staff.marc.008.BKS.biog.field_start_pos
+#: staff.marc.008.SER.succ.field_end_pos
+#: staff.marc.008.SER.succ.field_start_pos
+msgid "34"
+msgstr ""
+
+#: staff.marc.008.BKS.biog.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/biog.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.biog.short
+msgid "Biog"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.desc
+#: staff.marc.008.SER.cont.desc
+msgid "Nature of Contents"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.field_end_pos
+#: staff.marc.008.SER.cont.field_end_pos
+msgid "27"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.field_size
+#: staff.marc.008.BKS.ills.field_size
+#: staff.marc.008.date1.field_size
+#: staff.marc.008.date2.field_size
+msgid "4"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.field_start_pos
+#: staff.marc.008.SER.entw.field_end_pos
+#: staff.marc.008.SER.entw.field_start_pos
+msgid "24"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.help
+#: staff.marc.008.SER.cont.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/cont.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.cont.short
+#: staff.marc.008.SER.cont.short
+msgid "Cont"
+msgstr ""
+
+#: staff.marc.008.BKS.fest.desc
+msgid "Festschrift"
+msgstr ""
+
+#: staff.marc.008.BKS.fest.field_end_pos
+#: staff.marc.008.BKS.fest.field_start_pos
+msgid "30"
+msgstr ""
+
+#: staff.marc.008.BKS.fest.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/fest.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.fest.short
+msgid "Fest"
+msgstr ""
+
+#: staff.marc.008.BKS.ills.desc
+msgid "Illustrations"
+msgstr ""
+
+#: staff.marc.008.BKS.ills.field_end_pos
+#: staff.marc.008.SER.srtp.field_end_pos
+#: staff.marc.008.SER.srtp.field_start_pos
+msgid "21"
+msgstr ""
+
+#: staff.marc.008.BKS.ills.field_start_pos
+#: staff.marc.008.SER.freq.field_end_pos
+#: staff.marc.008.SER.freq.field_start_pos
+#: staff.marc.LDR.desc.field_end_pos
+#: staff.marc.LDR.desc.field_start_pos
+msgid "18"
+msgstr ""
+
+#: staff.marc.008.BKS.ills.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/ills.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.ills.short
+msgid "Ills"
+msgstr ""
+
+#: staff.marc.008.BKS.litf.desc
+msgid "Literary Form"
+msgstr ""
+
+#: staff.marc.008.BKS.litf.field_end_pos
+#: staff.marc.008.BKS.litf.field_start_pos
+#: staff.marc.008.SER.alph.field_end_pos
+#: staff.marc.008.SER.alph.field_start_pos
+msgid "33"
+msgstr ""
+
+#: staff.marc.008.BKS.litf.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/litf.shtm"
+msgstr ""
+
+#: staff.marc.008.BKS.litf.short
+msgid "LitF"
+msgstr ""
+
+#: staff.marc.008.SER.alph.desc
+msgid "Original Alphabet or Script of Title"
+msgstr ""
+
+#: staff.marc.008.SER.alph.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/alph.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.alph.short
+msgid "Alph"
+msgstr ""
+
+#: staff.marc.008.SER.cont.field_start_pos
+msgid "25"
+msgstr ""
+
+#: staff.marc.008.SER.entw.desc
+msgid "Nature of Entire Work"
+msgstr ""
+
+#: staff.marc.008.SER.entw.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/entw.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.entw.short
+msgid "EntW"
+msgstr ""
+
+#: staff.marc.008.SER.freq.desc
+msgid "Frequency"
+msgstr ""
+
+#: staff.marc.008.SER.freq.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/freq.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.freq.short
+msgid "Freq"
+msgstr ""
+
+#: staff.marc.008.SER.issn.desc
+msgid "ISSN Center"
+msgstr ""
+
+#: staff.marc.008.SER.issn.field_end_pos
+#: staff.marc.008.SER.issn.field_start_pos
+msgid "20"
+msgstr ""
+
+#: staff.marc.008.SER.issn.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/issn.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.issn.short
+#: staff.record_list.issn
+#: staff.z39_50.search_class.issn
+msgid "ISSN"
+msgstr ""
+
+#: staff.marc.008.SER.orig.desc
+msgid "Form of Original Item"
+msgstr ""
+
+#: staff.marc.008.SER.orig.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/orig.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.orig.short
+msgid "Orig"
+msgstr ""
+
+#: staff.marc.008.SER.regl.desc
+msgid "Regularity"
+msgstr ""
+
+#: staff.marc.008.SER.regl.field_end_pos
+#: staff.marc.008.SER.regl.field_start_pos
+msgid "19"
+msgstr ""
+
+#: staff.marc.008.SER.regl.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/regl.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.regl.short
+msgid "Regl"
+msgstr ""
+
+#: staff.marc.008.SER.srtp.desc
+msgid "Type of Continuing Resource"
+msgstr ""
+
+#: staff.marc.008.SER.srtp.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/srtp.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.srtp.short
+msgid "SrTp"
+msgstr ""
+
+#: staff.marc.008.SER.succ.desc
+msgid "Entry Convention"
+msgstr ""
+
+#: staff.marc.008.SER.succ.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/succ.shtm"
+msgstr ""
+
+#: staff.marc.008.SER.succ.short
+msgid "S/L"
+msgstr ""
+
+#: staff.marc.008.ctry.desc
+msgid "Country of Publication, etc."
+msgstr ""
+
+#: staff.marc.008.ctry.field_end_pos
+#: staff.marc.LDR.elvl.field_end_pos
+#: staff.marc.LDR.elvl.field_start_pos
+msgid "17"
+msgstr ""
+
+#: staff.marc.008.ctry.field_start_pos
+msgid "15"
+msgstr ""
+
+#: staff.marc.008.ctry.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/ctry.shtm"
+msgstr ""
+
+#: staff.marc.008.ctry.short
+msgid "Ctry"
+msgstr ""
+
+#: staff.marc.008.date1.desc
+#: staff.marc.008.date1.short
+msgid "Date 1"
+msgstr ""
+
+#: staff.marc.008.date1.field_end_pos
+msgid "10"
+msgstr ""
+
+#: staff.marc.008.date1.field_start_pos
+#: staff.marc.LDR.blvl.field_end_pos
+#: staff.marc.LDR.blvl.field_start_pos
+msgid "7"
+msgstr ""
+
+#: staff.marc.008.date2.desc
+#: staff.marc.008.date2.short
+msgid "Date 2"
+msgstr ""
+
+#: staff.marc.008.date2.field_end_pos
+msgid "14"
+msgstr ""
+
+#: staff.marc.008.date2.field_start_pos
+msgid "11"
+msgstr ""
+
+#: staff.marc.008.dates
+msgid "Dates"
+msgstr ""
+
+#: staff.marc.008.dates.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/dates.shtm"
+msgstr ""
+
+#: staff.marc.008.dtst.desc
+msgid "Type of Date/Publication Status"
+msgstr ""
+
+#: staff.marc.008.dtst.field_end_pos
+#: staff.marc.008.dtst.field_start_pos
+#: staff.marc.008.entered.field_size
+#: staff.marc.LDR.type.field_end_pos
+#: staff.marc.LDR.type.field_start_pos
+msgid "6"
+msgstr ""
+
+#: staff.marc.008.dtst.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/dtst.shtm"
+msgstr ""
+
+#: staff.marc.008.dtst.short
+msgid "DtSt"
+msgstr ""
+
+#: staff.marc.008.entered.desc
+msgid "Date Entered"
+msgstr ""
+
+#: staff.marc.008.entered.field_end_pos
+#: staff.marc.LDR.rec_stat.field_end_pos
+#: staff.marc.LDR.rec_stat.field_start_pos
+msgid "5"
+msgstr ""
+
+#: staff.marc.008.entered.field_start_pos
+msgid "0"
+msgstr ""
+
+#: staff.marc.008.entered.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/entered.shtm"
+msgstr ""
+
+#: staff.marc.008.entered.short
+msgid "Entered"
+msgstr ""
+
+#: staff.marc.008.lang.desc
+msgid "Language Code"
+msgstr ""
+
+#: staff.marc.008.lang.field_end_pos
+msgid "37"
+msgstr ""
+
+#: staff.marc.008.lang.field_start_pos
+msgid "35"
+msgstr ""
+
+#: staff.marc.008.lang.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/lang.shtm"
+msgstr ""
+
+#: staff.marc.008.lang.short
+msgid "Lang"
+msgstr ""
+
+#: staff.marc.008.mrec.desc
+msgid "Modified Record"
+msgstr ""
+
+#: staff.marc.008.mrec.field_end_pos
+#: staff.marc.008.mrec.field_start_pos
+msgid "38"
+msgstr ""
+
+#: staff.marc.008.mrec.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/mrec.shtm"
+msgstr ""
+
+#: staff.marc.008.mrec.short
+msgid "MRec"
+msgstr ""
+
+#: staff.marc.008.srce.desc
+msgid "Cataloging Source"
+msgstr ""
+
+#: staff.marc.008.srce.field_end_pos
+#: staff.marc.008.srce.field_start_pos
+msgid "39"
+msgstr ""
+
+#: staff.marc.008.srce.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/srce.shtm"
+msgstr ""
+
+#: staff.marc.008.srce.short
+msgid "Srce"
+msgstr ""
+
+#: staff.marc.LDR.blvl.desc
+msgid "Bibliographic Level"
+msgstr ""
+
+#: staff.marc.LDR.blvl.field
+#: staff.marc.LDR.ctrl.field
+#: staff.marc.LDR.desc.field
+#: staff.marc.LDR.elvl.field
+#: staff.marc.LDR.rec_stat.field
+#: staff.marc.LDR.type.field
+msgid "LDR"
+msgstr ""
+
+#: staff.marc.LDR.blvl.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/blvl.shtm"
+msgstr ""
+
+#: staff.marc.LDR.blvl.short
+msgid "BLvl"
+msgstr ""
+
+#: staff.marc.LDR.ctrl.desc
+msgid "Type of Control"
+msgstr ""
+
+#: staff.marc.LDR.ctrl.field_end_pos
+#: staff.marc.LDR.ctrl.field_start_pos
+msgid "8"
+msgstr ""
+
+#: staff.marc.LDR.ctrl.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/ctrl.shtm"
+msgstr ""
+
+#: staff.marc.LDR.ctrl.short
+msgid "Ctrl"
+msgstr ""
+
+#: staff.marc.LDR.desc.desc
+msgid "Descriptive Cataloging Form"
+msgstr ""
+
+#: staff.marc.LDR.desc.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/desc.shtm"
+msgstr ""
+
+#: staff.marc.LDR.desc.short
+msgid "Desc"
+msgstr ""
+
+#: staff.marc.LDR.elvl.desc
+msgid "Encoding Level"
+msgstr ""
+
+#: staff.marc.LDR.elvl.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/elvl.shtm"
+msgstr ""
+
+#: staff.marc.LDR.elvl.short
+msgid "ELvl"
+msgstr ""
+
+#: staff.marc.LDR.rec_stat.desc
+msgid "Record Status"
+msgstr ""
+
+#: staff.marc.LDR.rec_stat.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/rec.shtm"
+msgstr ""
+
+#: staff.marc.LDR.rec_stat.short
+msgid "Rec stat"
+msgstr ""
+
+#: staff.marc.LDR.type.desc
+msgid "Type of Record"
+msgstr ""
+
+#: staff.marc.LDR.type.help
+msgid "http://www.oclc.org/bibformats/en/fixedfield/type.shtm"
+msgstr ""
+
+#: staff.marc.close.editor.key
+msgid "W"
+msgstr ""
+
+#: staff.marc.display.control_fields
+msgid "Toggle Control/Data Fields"
+msgstr ""
+
+#: staff.marc.display.cover_art
+msgid "Toggle Cover Art"
+msgstr ""
+
+#: staff.marc.display.explain
+msgid "Explain Errors"
+msgstr ""
+
+#: staff.marc.display.explain.key
+msgid "X"
+msgstr ""
+
+#: staff.marc.display.fixed.BKS
+msgid "Fixed Fields as BKS"
+msgstr ""
+
+#: staff.marc.display.fixed.COM
+msgid "Fixed Fields as COM"
+msgstr ""
+
+#: staff.marc.display.fixed.MAP
+msgid "Fixed Fields as MAP"
+msgstr ""
+
+#: staff.marc.display.fixed.MIX
+msgid "Fixed Fields as MIX"
+msgstr ""
+
+#: staff.marc.display.fixed.REC
+msgid "Fixed Fields as REC"
+msgstr ""
+
+#: staff.marc.display.fixed.SCO
+msgid "Fixed Fields as SCO"
+msgstr ""
+
+#: staff.marc.display.fixed.SER
+msgid "Fixed Fields as SER"
+msgstr ""
+
+#: staff.marc.display.fixed.VIS
+msgid "Fixed Fields as VIS"
+msgstr ""
+
+#: staff.marc.display.legend
+msgid "Legend"
+msgstr ""
+
+#: staff.marc.display.meta_data
+msgid "Toggle Meta Data"
+msgstr ""
+
+#: staff.marc.editor.keys.help
+msgid "Control+D = Delimiter Symbol ; Control+Enter = Insert Row ; Control+Delete = Delete Row;"
+msgstr ""
+
+#: staff.marc.file
+#: staff.marc_editor_interface_label
+msgid "MARC"
+msgstr ""
+
+#: staff.marc.file.close
+msgid "Close Editor"
+msgstr ""
+
+#: staff.marc.file.export
+msgid "Export"
+msgstr ""
+
+#: staff.marc.file.publish
+msgid "Save (to DB)"
+msgstr ""
+
+#: staff.marc.file.reload
+msgid "Reload"
+msgstr ""
+
+#: staff.marc.file.validate
+msgid "Validate"
+msgstr ""
+
+#: staff.marc.groupbox.control
+msgid "Control Fields"
+msgstr ""
+
+#: staff.marc.groupbox.cover
+msgid "Cover Art"
+msgstr ""
+
+#: staff.marc.groupbox.data
+msgid "Data Fields"
+msgstr ""
+
+#: staff.marc.groupbox.fixed
+msgid "Fixed Fields"
+msgstr ""
+
+#: staff.marc.groupbox.meta
+msgid "Meta Data (NOT YET IMPLEMENTED)"
+msgstr ""
+
+#: staff.mbts_balance_owed_label
+msgid "Balance Owed"
+msgstr ""
+
+#: staff.mbts_id_label
+msgid "Bill # "
+msgstr ""
+
+#: staff.mbts_total_owed_label
+msgid "Total Billed"
+msgstr ""
+
+#: staff.mbts_total_paid_label
+msgid "Total Paid"
+msgstr ""
+
+#: staff.mbts_xact_start_label
+msgid "Start"
+msgstr ""
+
+#: staff.mvr_label_doc_id
+msgid "Doc Id"
+msgstr ""
+
+#: staff.next.range
+msgid "Next"
+msgstr ""
+
+#: staff.opac_navigator_interface_label
+msgid "CATALOG NAVIGATOR"
+msgstr ""
+
+#: staff.patron_barcode_entry_interface_label
+#: staff.patron_display_interface_label
+msgid "PATRON"
+msgstr ""
+
+#: staff.patron_display.bills.label
+msgid "Bills:"
+msgstr ""
+
+#: staff.patron_display.checkout.print_receipt_label
+#: staff.patron_display.items.print_receipt_label
+msgid "Print Receipt"
+msgstr ""
+
+#: staff.patron_display.checkout.print_receipt_label.accesskey
+msgid ""
+"_: staff.patron_display.checkout.print_receipt_label.accesskey\n"
+msgstr ""
+
+#: staff.patron_display.checkout.reprint_receipt_label
+msgid "Re-Print Last Receipt"
+msgstr ""
+
+#: staff.patron_display.checkouts.label
+msgid "Check Outs:"
+msgstr ""
+
+#: staff.patron_display.checkouts_overdue.label
+msgid "Overdue:"
+msgstr ""
+
+#: staff.patron_display.contact.caption
+msgid "Identity &amp; Contact Info"
+msgstr ""
+
+#: staff.patron_display.credit.label
+msgid "Credit:"
+msgstr ""
+
+#: staff.patron_display.date_of_birth.label
+msgid "DOB:"
+msgstr ""
+
+#: staff.patron_display.day_phone.label
+msgid "Day Phone:"
+msgstr ""
+
+#: staff.patron_display.email.label
+#: staff.patron_search_form.email.label
+msgid "Email:"
+msgstr ""
+
+#: staff.patron_display.evening_phone.label
+msgid "Evening Phone:"
+msgstr ""
+
+#: staff.patron_display.holds.label
+msgid "Holds:"
+msgstr ""
+
+#: staff.patron_display.holds_available.label
+msgid "Available:"
+msgstr ""
+
+#: staff.patron_display.ident1.label
+msgid "ID 1:"
+msgstr ""
+
+#: staff.patron_display.ident2.label
+msgid "ID 2:"
+msgstr ""
+
+#: staff.patron_display.items_claimed_returned.label
+msgid "Items Claimed Returned:"
+msgstr ""
+
+#: staff.patron_display.library_card.label
+msgid "Library Card:"
+msgstr ""
+
+#: staff.patron_display.mailing.city.label
+msgid "Mailing City:"
+msgstr ""
+
+#: staff.patron_display.mailing.post_code.label
+msgid "Mailing ZIP:"
+msgstr ""
+
+#: staff.patron_display.mailing.state.label
+msgid "Mailing State:"
+msgstr ""
+
+#: staff.patron_display.mailing.street1.label
+msgid "Mailing Address 1:"
+msgstr ""
+
+#: staff.patron_display.mailing.street2.label
+msgid "Mailing Address 2:"
+msgstr ""
+
+#: staff.patron_display.other_phone.label
+msgid "Other Phone:"
+msgstr ""
+
+#: staff.patron_display.physical.city.label
+msgid "Physical City:"
+msgstr ""
+
+#: staff.patron_display.physical.post_code.label
+msgid "Physical ZIP:"
+msgstr ""
+
+#: staff.patron_display.physical.state.label
+msgid "Physical State:"
+msgstr ""
+
+#: staff.patron_display.physical.street1.label
+msgid "Physical Address 1:"
+msgstr ""
+
+#: staff.patron_display.physical.street2.label
+msgid "Physical Address 2:"
+msgstr ""
+
+#: staff.patron_display.physical_address
+msgid "Physical Address"
+msgstr ""
+
+#: staff.patron_display.second_given_name.label
+#: staff.patron_search_form.second_given_name.label
+msgid "Middle Name:"
+msgstr ""
+
+#: staff.patron_display.standing.label
+msgid "Standing:"
+msgstr ""
+
+#: staff.patron_editor_interface_label
+msgid "PATRON EDIT"
+msgstr ""
+
+#: staff.patron_interface_label
+msgid "PATRON "
+msgstr ""
+
+#: staff.patron_navbar.bills
+msgid "Bills"
+msgstr ""
+
+#: staff.patron_navbar.checkout
+msgid "Check Out"
+msgstr ""
+
+#: staff.patron_navbar.holds
+msgid "Holds"
+msgstr ""
+
+#: staff.patron_navbar.info
+msgid "Info"
+msgstr ""
+
+#: staff.patron_navbar.info.accesskey
+msgid "o"
+msgstr ""
+
+#: staff.patron_navbar.items
+msgid "Items Out"
+msgstr ""
+
+#: staff.patron_register_interface_label
+msgid "NEW PATRON"
+msgstr ""
+
+#: staff.patron_search_form.caption
+msgid "Search for Patron"
+msgstr ""
+
+#: staff.patron_search_form.city.accesskey
+msgid ""
+"_: staff.patron_search_form.city.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.city.label
+msgid "City:"
+msgstr ""
+
+#: staff.patron_search_form.clear.label
+#: staff.patron_search_form.clear.accesskey
+msgid "&Clear Form"
+msgstr ""
+
+#: staff.patron_search_form.email.accesskey
+msgid ""
+"_: staff.patron_search_form.email.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.family_name.label
+#: staff.patron_search_form.family_name.accesskey
+msgid "&Last Name:"
+msgstr ""
+
+#: staff.patron_search_form.first_given_name.accesskey
+msgid ""
+"_: staff.patron_search_form.first_given_name.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.ident.accesskey
+msgid ""
+"_: staff.patron_search_form.ident.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.ident.label
+msgid "ID:"
+msgstr ""
+
+#: staff.patron_search_form.phone.label
+#: staff.patron_search_form.phone.accesskey
+msgid "&Phone:"
+msgstr ""
+
+#: staff.patron_search_form.post_code.accesskey
+msgid ""
+"_: staff.patron_search_form.post_code.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.post_code.label
+msgid "ZIP:"
+msgstr ""
+
+#: staff.patron_search_form.search.label
+#: staff.patron_search_form.search.accesskey
+msgid "&Search"
+msgstr ""
+
+#: staff.patron_search_form.second_given_name.accesskey
+msgid ""
+"_: staff.patron_search_form.second_given_name.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.state.accesskey
+msgid ""
+"_: staff.patron_search_form.state.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.state.label
+msgid "State:"
+msgstr ""
+
+#: staff.patron_search_form.street1.label
+#: staff.patron_search_form.street1.accesskey
+msgid "A&ddress 1:"
+msgstr ""
+
+#: staff.patron_search_form.street2.accesskey
+msgid ""
+"_: staff.patron_search_form.street2.accesskey\n"
+msgstr ""
+
+#: staff.patron_search_form.street2.label
+msgid "Address 2:"
+msgstr ""
+
+#: staff.patron_search_interface_label
+msgid "PATRON SEARCH"
+msgstr ""
+
+#: staff.patron_stat_cat_editor_interface_label
+msgid "PATRON STAT-CATS"
+msgstr ""
+
+#: staff.previous.range
+msgid "Previous"
+msgstr ""
+
+#: staff.receipt_template_editor_interface_label
+msgid "RECEIPTS"
+msgstr ""
+
+#: staff.record_list.copy_count
+msgid "Copies&#740;"
+msgstr ""
+
+#: staff.record_list.publisher
+#: staff.z39_50.search_class.publisher
+msgid "Publisher"
+msgstr ""
+
+#: staff.retrieving.record
+msgid "Retrieving..."
+msgstr ""
+
+#: staff.survey.wizard.page1
+msgid "Initial Settings"
+msgstr ""
+
+#: staff.survey.wizard.page2
+msgid "Add Questions for Survey:"
+msgstr ""
+
+#: staff.survey.wizard.title
+msgid "Add a Survey Wizard"
+msgstr ""
+
+#: staff.survey_admin_interface_label
+msgid "SURVEY ADMIN"
+msgstr ""
+
+#: staff.volume.attr.owning_lib
+#: staff.server.admin.copy_locations.editor.library
+#: staff.server.admin.stat_cat.owning_library.label
+msgid "Owning Library"
+msgstr ""
+
+#: staff.volume.wizard.page1
+msgid "Entering Volumes"
+msgstr ""
+
+#: staff.volume.wizard.page2
+msgid "Entering Copies"
+msgstr ""
+
+#: staff.volume.wizard.page3
+msgid "Entering Barcodes"
+msgstr ""
+
+#: staff.volume.wizard.page4
+msgid "Entering Copy-Level Attribute Defaults"
+msgstr ""
+
+#: staff.volume.wizard.title
+msgid "Batch Add Volumes/Copies Wizard"
+msgstr ""
+
+#: staff.xuleditor_label
+msgid "XUL TEST"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type
+msgid "Item Type"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.all
+msgid "All Formats"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.art
+msgid "Papers/Articles"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.bks
+msgid "Books"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.com
+msgid "Computer files"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.map
+msgid "Maps"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.mix
+msgid "Mixed material"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.rec
+msgid "Sound recordings"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.sco
+msgid "Musical scores"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.url
+msgid "Internet Resources"
+msgstr ""
+
+#: staff.z39_50.search_class.item_type.vis
+msgid "Visual materials"
+msgstr ""
+
+#: staff.z39_50.search_class.lccn
+msgid "LCCN"
+msgstr ""
+
+#: staff.z39_50.search_class.pubdate
+msgid "PubDate"
+msgstr ""
+
+#: staff.z39_50.search_class.tcn
+msgid "Accession #"
+msgstr ""
+
+#: staff.z39_50_import_interface_label
+msgid "Z39.50 IMPORT"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.caption
+msgid "Offline Sessions"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.create.label
+#: staff.server.admin.non_cat_types.editor.create
+msgid "Create"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.execute.label
+msgid "Process"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.update.label
+msgid "Update"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.status.label
+msgid "Uploaded Transaction Files"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.status.desc
+msgid "The transactions from the following workstations have been uploaded, but not processed.  When all expected workstations are present here, use the Process button above."
+msgstr ""
+
+#: staff.server.admin.offline.xacts.errors.label
+msgid "Exceptions"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.errors.desc
+msgid "All transactions from this session have been processed.  The errors, if any, are listed below."
+msgstr ""
+
+#: staff.server.admin.offline.xacts.export.label
+msgid "Export List"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.print.label
+msgid "Print Export"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.get_item.label
+msgid "Retrieve Item"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.get_details.label
+msgid "Details"
+msgstr ""
+
+#: staff.server.admin.offline.xacts.errors.caption
+msgid "The session is now processing.  Hit Refresh to check its status."
+msgstr ""
+
+#: staff.server.admin.font.sound.caption
+msgid "Adjust Sound"
+msgstr ""
+
+#: staff.server.admin.font.sound.checkbox
+msgid "Disable sound?"
+msgstr ""
+
+#: staff.server.admin.save_disk
+msgid "Save to Disk"
+msgstr ""
+
+#: staff.server.admin.font.global.caption
+msgid "Adjust Global Font"
+msgstr ""
+
+#: staff.server.admin.font.smaller
+msgid "Smaller than Default"
+msgstr ""
+
+#: staff.server.admin.font.default
+msgid "Default"
+msgstr ""
+
+#: staff.server.admin.font.larger
+msgid "Larger than Default"
+msgstr ""
+
+#: staff.server.admin.font.xxsmall
+msgid "XX-Small"
+msgstr ""
+
+#: staff.server.admin.font.xsmall
+msgid "X-Small"
+msgstr ""
+
+#: staff.server.admin.font.small
+msgid "Small"
+msgstr ""
+
+#: staff.server.admin.font.medium
+msgid "Medium"
+msgstr ""
+
+#: staff.server.admin.font.large
+msgid "Large"
+msgstr ""
+
+#: staff.server.admin.font.xlarge
+msgid "X-Large"
+msgstr ""
+
+#: staff.server.admin.font.xxlarge
+msgid "XX-Large"
+msgstr ""
+
+#: staff.server.admin.font.5pt
+msgid "5pt"
+msgstr ""
+
+#: staff.server.admin.font.6pt
+msgid "6pt"
+msgstr ""
+
+#: staff.server.admin.font.7pt
+msgid "7pt"
+msgstr ""
+
+#: staff.server.admin.font.8pt
+msgid "8pt"
+msgstr ""
+
+#: staff.server.admin.font.9pt
+msgid "9pt"
+msgstr ""
+
+#: staff.server.admin.font.10pt
+msgid "10pt"
+msgstr ""
+
+#: staff.server.admin.font.11pt
+msgid "11pt"
+msgstr ""
+
+#: staff.server.admin.font.12pt
+msgid "12pt"
+msgstr ""
+
+#: staff.server.admin.font.13pt
+msgid "13pt"
+msgstr ""
+
+#: staff.server.admin.font.14pt
+msgid "14pt"
+msgstr ""
+
+#: staff.server.admin.font.15pt
+msgid "15pt"
+msgstr ""
+
+#: staff.server.admin.font.16pt
+msgid "16pt"
+msgstr ""
+
+#: staff.server.admin.font.17pt
+msgid "17pt"
+msgstr ""
+
+#: staff.server.admin.font.18pt
+msgid "18pt"
+msgstr ""
+
+#: staff.server.admin.font.restore
+msgid "Restore Default"
+msgstr ""
+
+#: staff.server.admin.transit.filter.caption
+msgid "Transit Filter"
+msgstr ""
+
+#: staff.server.admin.transit.library.label
+msgid "Transit Library"
+msgstr ""
+
+#: staff.server.admin.transit.to.label
+msgid "Transit to"
+msgstr ""
+
+#: staff.server.admin.transit.from.label
+msgid "Transit from"
+msgstr ""
+
+#: staff.server.admin.transit.date.label
+msgid "Transit Date falls between"
+msgstr ""
+
+#: staff.server.admin.transit.date.today
+msgid "Today"
+msgstr ""
+
+#: staff.server.admin.transit.date.week
+msgid "Today - 7 days"
+msgstr ""
+
+#: staff.server.admin.transit.date.2weeks
+msgid "Today - 14 days"
+msgstr ""
+
+#: staff.server.admin.transit.date.3weeks
+msgid "Today - 21 days"
+msgstr ""
+
+#: staff.server.admin.transit.date.30days
+msgid "Today - 30 days"
+msgstr ""
+
+#: staff.server.admin.transit.date.start
+msgid "The Beginning"
+msgstr ""
+
+#: staff.server.admin.transit.retrieve.label
+#: staff.server.admin.transit.retrieve.accesskey
+msgid "Retrieve &Transits"
+msgstr ""
+
+#: staff.server.admin.transit.list.label
+#: staff.server.admin.index.transits
+msgid "Transits"
+msgstr ""
+
+#: staff.server.admin.transit.list.print
+msgid "Print Transits"
+msgstr ""
+
+#: staff.server.admin.transit.list.actions
+msgid "Actions for Selected Transits"
+msgstr ""
+
+#: staff.server.admin.transit.list.copy.label
+#: staff.server.admin.transit.list.copy.accesskey
+msgid "&Copy to Clipboard"
+msgstr ""
+
+#: staff.server.admin.transit.list.add.label
+#: staff.server.admin.transit.list.add.accesskey
+msgid "&Add to Item Bucket"
+msgstr ""
+
+#: staff.server.admin.transit.list.show.label
+#: staff.server.admin.transit.list.show.accesskey
+msgid "&Show in Catalog"
+msgstr ""
+
+#: staff.server.admin.transit.list.details.label
+#: staff.server.admin.transit.list.details.accesskey
+msgid "Show &Item Details"
+msgstr ""
+
+#: staff.server.admin.transit.list.circs.label
+#: staff.server.admin.transit.list.circs.accesskey
+msgid "Show &Last Few Circulations"
+msgstr ""
+
+#: staff.server.admin.transit.list.edit.label
+#: staff.server.admin.transit.list.edit.accesskey
+msgid "&Edit Item Attributes"
+msgstr ""
+
+#: staff.server.admin.transit.list.abort.label
+msgid "Abort Transits"
+msgstr ""
+
+#: staff.server.admin.transit.list.save.label
+msgid "Save Columns"
+msgstr ""
+
+#: staff.server.admin.cash.title
+msgid "Evergreen: Cash Reports"
+msgstr ""
+
+# This will be followed by the user's name
+#: staff.server.admin.cash.welcome
+#: staff.server.admin.closed_dates.welcome
+#: staff.server.admin.hold_pull.greeting
+#: staff.server.admin.non_cat_types.greeting
+#: staff.server.admin.org_settings.greeting
+#: staff.server.admin.stat_cat.greeting
+msgid "Welcome "
+msgstr ""
+
+#: staff.server.admin.cash.start_date
+msgid "Start Date:"
+msgstr ""
+
+#: staff.server.admin.cash.date.select
+msgid "Date selector"
+msgstr ""
+
+#: staff.server.admin.cash.end_date
+msgid "End Date:"
+msgstr ""
+
+#: staff.server.admin.cash.date_format
+msgid "(YYYY-MM-DD)"
+msgstr ""
+
+#: staff.server.admin.cash.view
+msgid "View reports for : "
+msgstr ""
+
+#: staff.server.admin.cash.submit
+msgid "Go!"
+msgstr ""
+
+#: staff.server.admin.cash.desk
+msgid "Desk Payments"
+msgstr ""
+
+#: staff.server.admin.cash.user
+msgid "User Payments"
+msgstr ""
+
+#: staff.server.admin.closed_dates.title
+msgid "Evergreen: Library Closed Dates Editor"
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.title
+msgid " Closed Dates Editor "
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.for
+msgid "Edit Closed Dates for: "
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.duration
+msgid "Closed Duration"
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.reason
+msgid "Reason for Closing"
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.allmultiday.delete
+msgid "delete"
+msgstr ""
+
+# Translators: do not translate "<b>YYYY-MM-DD</b>" or "<b>HH:MM</b>"
+#: staff.server.admin.closed_dates.editor.allmultiday.format
+msgid "Note: All dates must have the form <b>YYYY-MM-DD</b>.  Times must have the form <b>HH:MM</b>"
+msgstr ""
+
+#: staff.server.admin.closed_dates.add.allday
+msgid "Add Single Day Closing"
+msgstr ""
+
+#: staff.server.admin.closed_dates.add.multiday
+msgid "Add Mult-Date Closing"
+msgstr ""
+
+#: staff.server.admin.closed_dates.add.detailed
+msgid "Add Detailed Closing"
+msgstr ""
+
+#: staff.server.admin.closed_dates.date.start
+msgid "Start Date"
+msgstr ""
+
+#: staff.server.admin.closed_dates.time.start
+msgid "Start Time"
+msgstr ""
+
+#: staff.server.admin.closed_dates.date.end
+msgid "End Date"
+msgstr ""
+
+#: staff.server.admin.closed_dates.time.end
+msgid "End Time"
+msgstr ""
+
+#: staff.server.admin.closed_dates.allday.label
+msgid "All Day"
+msgstr ""
+
+#: staff.server.admin.closed_dates.editor.reason.label
+msgid "Reason for closing: "
+msgstr ""
+
+#: staff.server.admin.closed_dates.apply_all
+msgid "Apply to all of my libraries"
+msgstr ""
+
+#: staff.server.admin.closed_dates.save
+msgid "Save"
+msgstr ""
+
+#: staff.server.admin.closed_dates.confirm_delete
+msgid "Are you sure you wish to delete the selected close date?"
+msgstr ""
+
+#: staff.server.admin.closed_dates.date.invalid
+msgid "Invalid date format"
+msgstr ""
+
+#: staff.server.admin.closed_dates.time.invalid
+msgid "Invalid time format"
+msgstr ""
+
+#: staff.server.admin.closed_dates.success
+msgid "Closed date successfully updated"
+msgstr ""
+
+#: staff.server.admin.copy_locations.title
+msgid "Evergreen: Copy Locations Editor"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor
+msgid " Copy Locations Editor "
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.create
+msgid "Create a new copy location"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.name
+msgid "Name: "
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.holdable.label
+msgid "Holdable: "
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.opac_visible.label
+msgid "OPAC Visible: "
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.circulate.label
+msgid "Circulate: "
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.library.label
+msgid "Owning Library:"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.name
+#: staff.server.admin.non_cat_types.name
+msgid "Name"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.holdable
+msgid "Holdable"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.opac_visible
+msgid "OPAC Visible"
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.help.holdable
+msgid "If a copy location is 'Holdable', copies in that location may have holds placed on them."
+msgstr ""
+
+#: staff.server.admin.copy_locations.editor.delete.confirm
+msgid "Are you sure you wish to delete the selected copy location?  Note: If copies are currently attached to this location, the delete operation will fail."
+msgstr ""
+
+#: staff.server.admin.copy_locations.update_success
+msgid "Update Succeeded"
+msgstr ""
+
+#: staff.server.admin.hold_pull.title
+msgid "Evergreen Holds Pull List"
+msgstr ""
+
+# This will be followed by the org_unit name
+#: staff.server.admin.hold_pull.header
+msgid "Evergreen Holds Pull List : "
+msgstr ""
+
+#: staff.server.admin.hold_pull.sort.note
+msgid "Note: Click on a column header to sort the column"
+msgstr ""
+
+#: staff.server.admin.hold_pull.copy_location
+msgid "Copy Location"
+msgstr ""
+
+#: staff.server.admin.hold_pull.patron_barcode
+msgid "Patron Barcode"
+msgstr ""
+
+#: staff.server.admin.hold_pull.hold_date
+msgid "Hold Placement Date"
+msgstr ""
+
+#: staff.server.admin.hold_pull.hold_type
+msgid "Hold Type"
+msgstr ""
+
+#: staff.server.admin.hold_pull.book
+msgid "Book"
+msgstr ""
+
+#: staff.server.admin.hold_pull.large_book
+msgid "Large Print Book"
+msgstr ""
+
+#: staff.server.admin.hold_pull.audiobook
+msgid "Audiobook"
+msgstr ""
+
+#: staff.server.admin.hold_pull.video
+msgid "Video Recording"
+msgstr ""
+
+#: staff.server.admin.hold_pull.music
+msgid "Music"
+msgstr ""
+
+#: staff.server.admin.hold_pull.eresource
+msgid "Electronic Resource"
+msgstr ""
+
+#: staff.server.admin.hold_pull.copy_hold
+msgid "Copy Hold"
+msgstr ""
+
+#: staff.server.admin.hold_pull.volume_hold
+msgid "Volume Hold"
+msgstr ""
+
+#: staff.server.admin.hold_pull.title_hold
+msgid "Title Hold"
+msgstr ""
+
+#: staff.server.admin.hold_pull.metarecord_hold
+msgid "Metarecord Hold"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.title
+msgid "Evergreen: Non Cataloged Types Editor"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.title
+msgid " Non Cataloged Types Editor "
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.header
+msgid "Create a new non-cataloged type"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.minutes
+msgid "Minutes"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.hours
+msgid "Hours"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.days
+msgid "Days"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.weeks
+msgid "Weeks"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.editor.months
+msgid "Months"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.in_house_circ
+msgid "Circulate In-House?"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.owning_location
+msgid "Owning Location"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.duration
+msgid "Duration"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.in_house.circulate
+msgid "Circulate In House"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.delete.confirm
+msgid "Are you sure you wish to delete the selected non-cataloged type?"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.in_house.help
+msgid "If the \"In-House\" flag is set on a non-cataloged type, items that circulate as that type will create \"In-House\" circulations.  This is ideal for computer use, room \"rentals\", etc."
+msgstr ""
+
+#: staff.server.admin.non_cat_types.update.success
+msgid "Non-cataloged type successfully updated"
+msgstr ""
+
+#: staff.server.admin.non_cat_types.name_exists
+msgid "A non-cataloged type with the selected name already exists."
+msgstr ""
+
+#: staff.server.admin.index.title
+msgid "Local System Administration"
+msgstr ""
+
+#: staff.server.admin.index.workstation_configuration
+msgid "Workstation Configuration"
+msgstr ""
+
+#: staff.server.admin.index.library_configuration
+msgid "Library Configuration"
+msgstr ""
+
+#: staff.server.admin.index.maintenance_reports
+msgid "Maintenance Reports"
+msgstr ""
+
+#: staff.server.admin.index.fonts_and_sounds
+msgid "Global Font and Sound Settings"
+msgstr ""
+
+#: staff.server.admin.index.printer
+msgid "Printer Settings Editor"
+msgstr ""
+
+#: staff.server.admin.index.closed_dates
+msgid "Closed Dates Editor"
+msgstr ""
+
+#: staff.server.admin.index.copy_locations
+msgid "Copy Locations Editor"
+msgstr ""
+
+#: staff.server.admin.index.library_settings
+msgid "Library Settings Editor"
+msgstr ""
+
+#: staff.server.admin.index.non_cataloged_types
+msgid "Non-cataloged Types Editor"
+msgstr ""
+
+#: staff.server.admin.index.statistical_categories
+msgid "Statistical Categories Editor"
+msgstr ""
+
+#: staff.server.admin.index.hold_pull_list
+msgid "Pull List for Hold Requests"
+msgstr ""
+
+#: staff.server.admin.index.testing
+msgid "(Testing)"
+msgstr ""
+
+#: staff.server.admin.index.hold_pull_list_classic
+msgid "Pull List for Hold Requests (Classic)"
+msgstr ""
+
+#: staff.server.admin.index.cash_reports
+msgid "Cash Reports"
+msgstr ""
+
+#: staff.server.admin.index.transit_list
+msgid "Transit List"
+msgstr ""
+
+#: staff.server.admin.org_settings.title
+msgid "Evergreen: Library Settings Editor"
+msgstr ""
+
+#: staff.server.admin.org_settings.header
+msgid " Library Settings Editor "
+msgstr ""
+
+# This will be followed by the library's name
+#: staff.server.admin.org_settings.select_library
+msgid "Edit Settings for : "
+msgstr ""
+
+# This will be followed by the library's name
+#: staff.server.admin.org_settings.selected_library
+msgid "Library Settings for "
+msgstr ""
+
+#: staff.server.admin.org_settings.opac_timeout
+msgid "OPAC Inactivity Timeout (in seconds)"
+msgstr ""
+
+#: staff.server.admin.org_settings.apply
+msgid "Apply"
+msgstr ""
+
+#: staff.server.admin.org_settings.apply_all
+msgid "Apply to all Locations"
+msgstr ""
+
+#: staff.server.admin.org_settings.staff_timeout
+msgid "Staff Login Inactivity Timeout (in seconds)"
+msgstr ""
+
+#: staff.server.admin.org_settings.lost_fee
+msgid "Lost Materials Processing Fee"
+msgstr ""
+
+#: staff.server.admin.org_settings.default_price
+msgid "Default Item Price"
+msgstr ""
+
+#: staff.server.admin.org_settings.from_address
+msgid "\"FROM\" email address for patron notices"
+msgstr ""
+
+#: staff.server.admin.org_settings.bounce_note
+msgid "(note: delivery failures will be returned this address)"
+msgstr ""
+
+#: staff.server.admin.org_settings.apply_all.note
+msgid "I. \"Apply to all Locations\" will force the new setting to be applied to all locations in the location dropdown."
+msgstr ""
+
+#: staff.server.admin.org_settings.update_success
+msgid "Update succeeded."
+msgstr ""
+
+#: staff.server.admin.org_settings.apply_all.confirm
+msgid "This will update the setting for all of the locations listed in the dropdown menu. Are you sure you wish to continue?"
+msgstr ""
+
+#: staff.server.admin.stat_cat.title
+msgid "Evergreen: Statistical Category Editor"
+msgstr ""
+
+#: staff.server.admin.stat_cat.heading
+msgid " Statistical Category Editor"
+msgstr ""
+
+#: staff.server.admin.stat_cat.create
+msgid "Create a new statistical category"
+msgstr ""
+
+#: staff.server.admin.stat_cat.name
+msgid "Enter the name: "
+msgstr ""
+
+#: staff.server.admin.stat_cat.owning_library
+msgid "Owning Library: "
+msgstr ""
+
+#: staff.server.admin.stat_cat.opac_visibility
+msgid "OPAC Visibility: "
+msgstr ""
+
+#: staff.server.admin.stat_cat.on
+msgid "On"
+msgstr ""
+
+#: staff.server.admin.stat_cat.off
+msgid "Off"
+msgstr ""
+
+#: staff.server.admin.stat_cat.type
+msgid "Type: "
+msgstr ""
+
+#: staff.server.admin.stat_cat.patron
+msgid "Patron"
+msgstr ""
+
+#: staff.server.admin.stat_cat.create.submit
+msgid "Create new statistical category"
+msgstr ""
+
+#: staff.server.admin.stat_cat.loading_status
+msgid "Loading permissions and statistical categories..."
+msgstr ""
+
+#: staff.server.admin.stat_cat.copy_stat_cats
+msgid "Copy Statistical Categories"
+msgstr ""
+
+#: staff.server.admin.stat_cat.patron_stat_cats
+msgid "Patron Statistical Categories"
+msgstr ""
+
+#: staff.server.admin.stat_cat.info_prompt
+msgid "* To edit or view information about an entry, click on the entry in the drop-down menu"
+msgstr ""
+
+#: staff.server.admin.stat_cat.none_defined
+msgid "No statistical categories are defined"
+msgstr ""
+
+#: staff.server.admin.stat_cat.name.label
+msgid "Statistical Category Name"
+msgstr ""
+
+#: staff.server.admin.stat_cat.opac_visibility.label
+msgid "OPAC Visibility"
+msgstr ""
+
+#: staff.server.admin.stat_cat.entries.label
+msgid "Entries"
+msgstr ""
+
+#: staff.server.admin.stat_cat.add_entry
+msgid "Add Entry"
+msgstr ""
+
+#: staff.server.admin.stat_cat.none
+msgid "(none)"
+msgstr ""
+
+#: staff.server.admin.stat_cat.add.label
+msgid "Add"
+msgstr ""
+
+#: staff.server.admin.stat_cat.add.prompt
+msgid "Enter the value for the new statistical category entry"
+msgstr ""
+
+#: staff.server.admin.stat_cat.delete.confirm
+msgid "This will delete the selected statistical category and all attached entries. Are you sure you wish to continue?"
+msgstr ""
+
+#: staff.server.admin.stat_cat.entry_delete.confirm
+msgid "Are you sure you wish to remove this statistical category entry?"
+msgstr ""
+
+#: staff.server.admin.stat_cat.edit_submit
+msgid "Update Statistical Category"
+msgstr ""
+
+#: staff.server.admin.stat_cat.edit_delete
+msgid "Delete Statistical Category"
+msgstr ""
+
+#: staff.server.admin.stat_cat.edit_entry_owner
+msgid "Owned By "
+msgstr ""
+
+#: staff.server.admin.stat_cat.edit_entry_name_submit
+msgid "Update Entry Value"
+msgstr ""
+
+#: staff.server.admin.stat_cat.edit_entry_delete
+msgid "Delete Entry"
+msgstr ""
+
+#: staff.server.admin.stat_cat.new_entry_name
+msgid "Enter the value of the new entry: "
+msgstr ""
+
+#: staff.server.admin.stat_cat.new_entry_create
+msgid "Create new entry"
+msgstr ""
+
+#: staff.server.admin.stat_cat.update_success
+msgid "Update succeeded"
+msgstr ""
+
+#: staff.server.admin.upload_xacts.title
+msgid "Upload Offline Transactions"
+msgstr ""
+
+#: staff.server.admin.upload_xacts.header
+msgid "Uploading transactions..."
+msgstr ""
diff --git a/build/i18n/po/en-US/offline.properties.pot b/build/i18n/po/en-US/offline.properties.pot
new file mode 100644 (file)
index 0000000..391b2a8
--- /dev/null
@@ -0,0 +1,104 @@
+# extracted from ../../Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+#: common.exception
+msgid ""
+"!! This software has encountered an error.  Please tell your friendly system "
+"administrator or software developer the following:\n"
+"%1$s\n"
+"%2$s\n"
+msgstr ""
+
+#: common.jsan.missing
+msgid "The JSAN library object is missing."
+msgstr ""
+
+#: common.ok
+msgid "Ok"
+msgstr ""
+
+#: common.clear
+msgid "Clear"
+msgstr ""
+
+#: common.confirm
+msgid "Check here to confirm this message."
+msgstr ""
+
+#: common.error.default
+msgid "Please report that this happened."
+msgstr ""
+
+#: common.barcode.status.warning
+msgid "Warning: As of %1$s, this barcode (%2$s) was flagged %3."
+msgstr ""
+
+#: common.barcode.status.warning.lost
+msgid "Lost"
+msgstr ""
+
+#: common.barcode.status.warning.expired
+msgid "Expired"
+msgstr ""
+
+#: common.barcode.status.warning.barred
+msgid "Barred"
+msgstr ""
+
+#: common.barcode.status.warning.blocked
+msgid "Blocked"
+msgstr ""
+
+#: common.barcode.status.warning.unknown
+msgid "with an unknown code: %1$s"
+msgstr ""
+
+#: common.date.invalid
+msgid "Invalid Date"
+msgstr ""
+
+#: cat.bib_record
+msgid "Bib Record: %1$s"
+msgstr ""
+
+#: cat.save_record
+msgid "Save Record"
+msgstr ""
+
+#: cat.save.success
+msgid "Record successfully saved."
+msgstr ""
+
+#: cat.save.failure
+msgid "Record not likely updated."
+msgstr ""
+
+#: cat.record.counter
+msgid "Record %1$s of %2$s"
+msgstr ""
+
+#: cat.preference.error
+msgid "Preference not likely updated."
+msgstr ""
+
+#: staff.admin.survey.save_response.label
+msgid "Save this response"
+msgstr ""
+
+#: staff.admin.survey.save_response.accesskey
+msgid "R"
+msgstr ""
diff --git a/build/i18n/po/en-US/opac.dtd.pot b/build/i18n/po/en-US/opac.dtd.pot
new file mode 100644 (file)
index 0000000..ea04194
--- /dev/null
@@ -0,0 +1,2000 @@
+# extracted from ../../Open-ILS/web/opac/locale/en-US/opac.dtd
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-20 23:22-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+# =================================================================
+# Some generic stuff
+# =================================================================
+#: lang.version
+msgid "remote v1"
+msgstr ""
+
+#: lang.description
+msgid "English"
+msgstr ""
+
+#: lang.author
+msgid "PINES"
+msgstr ""
+
+#: common.all
+msgid "All"
+msgstr ""
+
+#: common.currency
+msgid "$"
+msgstr ""
+
+#: common.name
+msgid "Name"
+msgstr ""
+
+#: common.none
+msgid "None"
+msgstr ""
+
+#: common.title
+msgid "Title"
+msgstr ""
+
+#: common.author
+msgid "Author"
+msgstr ""
+
+#: common.authors
+msgid "Authors"
+msgstr ""
+
+#: common.callnumber
+#: opac.advanced.quick.cn
+msgid "Call Number"
+msgstr ""
+
+#: common.edition
+msgid "Edition"
+msgstr ""
+
+#: common.subject
+msgid "Subject"
+msgstr ""
+
+#: common.series
+msgid "Series"
+msgstr ""
+
+#: common.keyword
+msgid "Keyword"
+msgstr ""
+
+#: common.type
+msgid "Search Type"
+msgstr ""
+
+#: common.isbn
+#: opac.advanced.quick.isbn
+msgid "ISBN"
+msgstr ""
+
+#: common.format
+msgid "Format"
+msgstr ""
+
+# Message displayed while search results are loading
+#: common.loading
+#: myopac.fines.status
+msgid "Loading..."
+msgstr ""
+
+#: common.login
+#: opac.login.login
+msgid "Login"
+msgstr ""
+
+#: common.logout
+msgid "Log Out"
+msgstr ""
+
+#: common.physical
+msgid "Physical Description"
+msgstr ""
+
+#: common.pubdate
+msgid "Publication Date"
+msgstr ""
+
+#: common.publisher
+msgid "Publisher"
+msgstr ""
+
+#: common.results
+msgid "Results"
+msgstr ""
+
+#: common.select
+msgid "Select"
+msgstr ""
+
+#: common.status
+msgid "Status"
+msgstr ""
+
+#: common.at
+msgid "at"
+msgstr ""
+
+#: common.of
+msgid "of"
+msgstr ""
+
+#: common.no
+msgid "No"
+msgstr ""
+
+#: common.yes
+msgid "Yes"
+msgstr ""
+
+#: common.cancel
+#: common.org.cancel
+#: myopac.holds.cancel
+#: myopac.holds.cancel_selected
+msgid "Cancel"
+msgstr ""
+
+#: common.library
+#: rdetail.copyInfo.library
+msgid "Library"
+msgstr ""
+
+#: common.username
+msgid "Username"
+msgstr ""
+
+#: common.password
+msgid "Password"
+msgstr ""
+
+#: common.submit
+msgid "Submit"
+msgstr ""
+
+#: common.close
+msgid "close"
+msgstr ""
+
+#: common.and
+msgid "and"
+msgstr ""
+
+#: common.user_not_found
+msgid "User not found"
+msgstr ""
+
+#: opac.advanced.wizard.title
+#: opac.navigate.advanced
+msgid "Advanced Search"
+msgstr ""
+
+#: common.nowSearching
+msgid "Now searching "
+msgstr ""
+
+#: common.ofAtLeast
+msgid " of at least "
+msgstr ""
+
+#: common.relevancy
+msgid "Match Score: "
+msgstr ""
+
+#: common.tips
+msgid "Tips:"
+msgstr ""
+
+#: common.tips.tip1
+msgid "Click on a folder icon in the sidebar to access related quick searches"
+msgstr ""
+
+#: common.tips.tip2
+msgid "If you don't find what you want try expanding your search using the range selector at the right of the search bar"
+msgstr ""
+
+#: common.org.openAll
+msgid "Expand All"
+msgstr ""
+
+#: common.org.closeAll
+msgid "Close All"
+msgstr ""
+
+#: common.org.loading
+msgid "Loading library selector..."
+msgstr ""
+
+# ==========================================================
+# Tips
+#: common.org.note
+#: tips.label
+msgid "Tip:"
+msgstr ""
+
+#: common.org.notetext
+msgid "Click on a location's name to select it.  Click on the folder icons to expand a section."
+msgstr ""
+
+# =================================================================
+# Footer
+#: opac.basic
+#: footer.basic
+msgid "Basic Catalog (HTML only)"
+msgstr ""
+
+#: common.password_criteria
+msgid "The password must be at least 7 characters in length, "
+"\tcontain at least one letter (a-z/A-Z), "
+"\tand contain at least one number."
+msgstr ""
+
+#: common.a2z.title
+msgid "Title: A to Z"
+msgstr ""
+
+#: common.z2a.title
+msgid "Title: Z to A"
+msgstr ""
+
+#: common.a2z.author
+msgid "Author: A to Z"
+msgstr ""
+
+#: common.z2a.author
+msgid "Author: Z to A"
+msgstr ""
+
+#: common.new2old.pubdate
+msgid "Date: Newest to Oldest"
+msgstr ""
+
+#: common.old2new.pubdate
+msgid "Date: Oldest to Newest"
+msgstr ""
+
+#: opac.style.reddish
+msgid "Reddish"
+msgstr ""
+
+#: holds.where_am_i
+msgid "PINES is a statewide system with both patrons and items "
+"\tassociated with over 250 libraries, holds lists are not as simple as "
+"\t'first come, first served' in PINES.  A complex matrix combining "
+"\tconsideration of item ownership, patron home library, and item purchase "
+"\tdate determines  priorities for holds; the list is dynamic, changing "
+"\twith every hold placed.  Therefore, any indication of a place in the "
+"\tholds list would be inaccurate.  The PINES holds system is designed to "
+"\tobtain a requested item in the fastest and most efficient way possible. "
+"\tYour PINES library will contact you when you hold items become "
+"\tavailable."
+msgstr ""
+
+#: holds.advanced_options
+msgid "If you wish to broaden the scope of your hold to include other "
+"\tversions of this title, select the formats that would be acceptable. "
+"\tThe first available copy will be sent to you."
+msgstr ""
+
+# =================================================================
+# Events and Permissions
+# =================================================================
+#: ilsevent.0
+msgid "Operation Succeeded"
+msgstr ""
+
+#: ilsevent.1000
+msgid "Login failed.  The username or password entered was incorrect."
+msgstr ""
+
+#: ilsevent.1001
+msgid "Login session has timed out or does not exist"
+msgstr ""
+
+#: ilsevent.1002
+msgid "User was not found in the database"
+msgstr ""
+
+#: ilsevent.1200
+msgid "The given username already exists in the database"
+msgstr ""
+
+#: ilsevent.5000
+msgid "Permission Denied"
+msgstr ""
+
+#: ilsperm.CREATE_HOLD
+msgid "User is not allowed to create holds for other users at this location"
+msgstr ""
+
+# =================================================================
+# common/pages
+# =================================================================
+#: common.cn.loading
+msgid "Loading Callnumber Page..."
+msgstr ""
+
+#: common.cn.browsing
+msgid "You are now browsing"
+msgstr ""
+
+#: common.cn.previous
+msgid "&lt;&lt; Previous Page"
+msgstr ""
+
+#: common.cn.shelf
+#: rdetail.extras.browser
+msgid "Shelf Browser"
+msgstr ""
+
+#: common.cn.next
+msgid "Next Page &gt;&gt;"
+msgstr ""
+
+#: common.textsize.title
+msgid "Text Size: "
+msgstr ""
+
+#: common.textsize.regular
+msgid "Regular"
+msgstr ""
+
+# Regular / Large
+#: common.textsize.separator
+msgid "/"
+msgstr ""
+
+#: common.textsize.large
+msgid "Large"
+msgstr ""
+
+#: home.js.disabled
+msgid "JavaScript must be enabled in order for you to use the regular Evergreen Catalog. "
+"However, it seems JavaScript is either disabled or not supported by your browser. "
+"To use the regular Evergreen Catalog, enable JavaScript by changing your browser options, then "
+"<a style='color: blue; text-decoration: underline;' href='/'>try again</a>. "
+"<br/><br/>Alternatively, you can use the basic HTML-only catalog "
+"<a style='color: blue; text-decoration: underline;' href='/opac/extras/slimpac/start.html'>here</a>."
+msgstr ""
+
+# =================================================================
+# MyOPAC bookbag page
+# =================================================================
+#: myopac.delete.bookbag
+msgid "This will remove the selected bookbag and all items contained within the bookbag. "
+"Are you sure you wish to continue?"
+msgstr ""
+
+#: myopac.no.bookbags
+msgid "You have not created any bookbags"
+msgstr ""
+
+#: myopac.bookbags.title
+#: myopac.bookbags
+msgid "My Bookbags"
+msgstr ""
+
+#: myopac.bookbag.items
+msgid "# Items"
+msgstr ""
+
+#: myopac.bookbag.shared
+msgid "Shared"
+msgstr ""
+
+#: myopac.bookbag.toggle
+msgid "Share / Hide"
+msgstr ""
+
+#: myopac.bookbag.delete
+msgid "Delete this bookbag?"
+msgstr ""
+
+#: myopac.items
+msgid "Items"
+msgstr ""
+
+#: myopac.view
+msgid "(View)"
+msgstr ""
+
+#: myopac.atom.feed
+msgid "ATOM Feed"
+msgstr ""
+
+#: myopac.bookbag.hide
+msgid "Hide"
+msgstr ""
+
+#: myopac.bookbag.share
+msgid "Share"
+msgstr ""
+
+#: myopac.delete
+msgid "Delete"
+msgstr ""
+
+#: myopac.bookbag.create
+msgid "Create a new Bookbag"
+msgstr ""
+
+#: myopac.bookbag.naming
+msgid "Enter the name of the new Bookbag: "
+msgstr ""
+
+#: myopac.bookbag.share
+msgid "Share this Bookbag"
+msgstr ""
+
+#: myopac.bookbag.no.items
+msgid "The selected bookbag contains no items..."
+msgstr ""
+
+#: myopac.bookbag.remove
+msgid "Remove this item?"
+msgstr ""
+
+#: myopac.remove.link
+msgid "remove"
+msgstr ""
+
+#: myopac.publish.text
+msgid "Sharing a Bookbag means that the contents of the Bookbag will be visible to others. "
+"To see the public view of a shared Bookbag, click the \"View\" link in the "
+"\"Shared\" column of the Bookbag list at the top of this page."
+msgstr ""
+
+#: myopac.item.confirm
+msgid "Are you sure you wish to remove this bookbag item?"
+msgstr ""
+
+#: myopac.publish.confirm
+msgid "Sharing this bookbag will allow the contents "
+"of the bookback to be seen by others.  Are you sure you wish to share this bookbag?"
+msgstr ""
+
+#: myopac.unpublish.confirm
+msgid "Are you sure you wish to hide this bookbag?"
+msgstr ""
+
+#: myopac.update.success
+msgid "The Bookbag was successfully updated."
+msgstr ""
+
+#: myopac.updated.success
+msgid "Bookbag successfully updated"
+msgstr ""
+
+#: myopac.create.warning
+msgid "Warning: Adding items to a bookbag creates a link between you and the "
+"items in the database.  The contents of the bookbag are NOT publicly "
+"viewable unless the bookbag is shared. However, if you prefer not to "
+"have any link between your patron record and a particular item or items, "
+"we suggest that you do not place said items in a bookbag or that you "
+"avoid using bookbags all together.  Thank you."
+msgstr ""
+
+#: myopac.describe.bookbags
+msgid "Bookbags are..."
+msgstr ""
+
+# =================================================================
+# MyOPAC Checked Page
+# =================================================================
+#: myopac.checked.out
+msgid "Total items out:"
+msgstr ""
+
+#: myopac.checked.overdue
+msgid "Total items overdue:"
+msgstr ""
+
+#: myopac.checked.renew
+msgid "Renew Selected Items"
+msgstr ""
+
+#: myopac.checked.renewing
+msgid "Renewing..."
+msgstr ""
+
+#: myopac.checked.renew.remaining
+msgid "Renewals Remaining"
+msgstr ""
+
+#: myopac.checked.noitems
+msgid "You have no items checked out at this time"
+msgstr ""
+
+#: myopac.checked.other.circ
+msgid "Other Circulations"
+msgstr ""
+
+#: myopac.checked.circ.lib
+msgid "Circulating Library"
+msgstr ""
+
+#: myopac.checked.item.type
+msgid "Circulation Type"
+msgstr ""
+
+#: myopac.checked.circ.time
+msgid "Please return by ..."
+msgstr ""
+
+#: myopac.checked.renew.success
+msgid "item(s) successfully renewed"
+msgstr ""
+
+#: myopac.checked.renew.confirm
+msgid "Are you sure you wish to renew the selected item(s)?"
+msgstr ""
+
+#: myopac.checked.renew.fail
+msgid "The system is unable to renew the selected item at this time.  This usually means the item is needed to fulfill a hold.  Please see a librarian for further help."
+msgstr ""
+
+#: myopac.checked.renew.fail2
+msgid "PINES policy prevents the renewal of this item at this time.  Please see a librarian for further details."
+msgstr ""
+
+# =================================================================
+# MyOPAC Fines Page
+# =================================================================
+#: myopac.fines.title
+msgid "Summary"
+msgstr ""
+
+#: myopac.fines.owed
+msgid "Total Owed"
+msgstr ""
+
+#: myopac.fines.paid
+msgid "Total Paid"
+msgstr ""
+
+#: myopac.fines.balance
+msgid "Balance Owed"
+msgstr ""
+
+#: myopac.fines.overdue
+msgid "Overdue Materials"
+msgstr ""
+
+#: myopac.fines.checkout
+msgid "Checkout Date"
+msgstr ""
+
+#: myopac.fines.due
+#: rdetail.cn.due
+msgid "Due Date"
+msgstr ""
+
+#: myopac.fines.returned
+msgid "Date Returned"
+msgstr ""
+
+#: myopac.fines.accruing
+msgid "(fines accruing)"
+msgstr ""
+
+#: myopac.fines.other
+msgid "Other Fees"
+msgstr ""
+
+#: myopac.fines.time.start
+msgid "Transaction Start Time"
+msgstr ""
+
+#: myopac.fines.time.paid
+msgid "Last Payment Time"
+msgstr ""
+
+#: myopac.fines.owed.initial
+msgid "Initial Amount Owed"
+msgstr ""
+
+#: myopac.fines.paid.amount
+msgid "Total Amount Paid"
+msgstr ""
+
+#: myopac.fines.type
+msgid "Billing Type"
+msgstr ""
+
+# =================================================================
+# MyOPAC Holds Page
+# =================================================================
+#: myopac.holds.formats
+msgid "Formats"
+msgstr ""
+
+#: myopac.holds.location
+msgid "Pickup Location"
+msgstr ""
+
+#: myopac.holds.edit
+msgid "Edit"
+msgstr ""
+
+#: myopac.holds.status.none
+msgid "You have no items on hold at this time"
+msgstr ""
+
+#: myopac.holds.status.waiting
+msgid "Waiting for copy"
+msgstr ""
+
+#: myopac.holds.status.intransit
+msgid "In Transit"
+msgstr ""
+
+#: myopac.holds.status.available
+msgid "Ready for Pickup"
+msgstr ""
+
+#: myopac.holds.verify
+msgid "If you wish to cancel the selected hold, click OK, otherwise click Cancel."
+msgstr ""
+
+#: myopac.holds.freeze_selected
+msgid "Freeze"
+msgstr ""
+
+#: myopac.holds.thaw_selected
+msgid "Un-freeze"
+msgstr ""
+
+#: myopac.holds.thaw_date_selected
+msgid "Set Un-freeze date"
+msgstr ""
+
+#: myopac.holds.processing
+msgid "Processing holds... This may take a moment."
+msgstr ""
+
+#: myopac.holds.actions
+msgid "Actions for selected holds"
+msgstr ""
+
+#: myopac.holds.cancel.confirm
+msgid "Are you sure you wish to cancel the selected holds?"
+msgstr ""
+
+#: myopac.holds.freeze.confirm
+msgid "Are you sure you wish to freeze the selected holds? "
+"Note that if an item has already been selected to fulfill the hold, it will not be frozen"
+msgstr ""
+
+#: myopac.holds.thaw.confirm
+msgid "Are you sure you wish to un-freeze the selected holds?"
+msgstr ""
+
+#: myopac.holds.thaw_date.confirm
+msgid "Are you sure you wish to change the un-freeze date for the selected holds?"
+msgstr ""
+
+#: myopac.holds.freeze.select_thaw
+msgid "Select an 'Un-Freeze' date.  This is the date at which the holds will become active again. "
+"If no date is chosen, the holds will remain frozen until they are manually un-frozen."
+msgstr ""
+
+#: opac.holds.freeze
+msgid "Freeze this hold"
+msgstr ""
+
+#: opac.holds.freeze.help
+msgid "A 'frozen' will retain its place in the queue, but will not be fulfilled until it has been unfrozen."
+msgstr ""
+
+#: opac.holds.freeze.thaw_date
+msgid "Automatically un-freeze hold on:"
+msgstr ""
+
+#: opac.holds.freeze.thaw_date.format
+msgid "YYYY-MM-DD"
+msgstr ""
+
+# =================================================================
+# MyOPAC Preferences Page
+# =================================================================
+#: myopac.prefs.title
+msgid "Preferences"
+msgstr ""
+
+#: myopac.prefs.hits
+msgid "Search hits per page"
+msgstr ""
+
+#: myopac.prefs.font
+msgid "Default Font Size"
+msgstr ""
+
+#: myopac.prefs.font.regular
+msgid "Regular Font"
+msgstr ""
+
+#: myopac.prefs.font.large
+msgid "Large Font"
+msgstr ""
+
+#: myopac.prefs.holds.notify
+msgid "Default Hold Notification Method"
+msgstr ""
+
+#: myopac.prefs.holds.both
+msgid "Use Phone and Email"
+msgstr ""
+
+#: myopac.prefs.holds.phone
+msgid "Use Phone Only"
+msgstr ""
+
+#: myopac.prefs.holds.email
+msgid "Use Email Only"
+msgstr ""
+
+#: myopac.prefs.search.location
+msgid "Default Search Location"
+msgstr ""
+
+#: myopac.prefs.search.home
+msgid "Always search my home library by default."
+msgstr ""
+
+#: myopac.prefs.search.range
+msgid "Default Search Range"
+msgstr ""
+
+#: myopac.prefs.save
+msgid "Save Preference Changes"
+msgstr ""
+
+#: myopac.prefs.save.success
+msgid "Preferences successfully updated"
+msgstr ""
+
+#: myopac.prefs.save.failed
+msgid "Preferences update failed!"
+msgstr ""
+
+#: myopac.prefs.help
+msgid "This setting defines how you will be notified of holds that are ready to be picked up from the library. "
+"By default, holds will use the notification style you choose here. "
+"However, you will still have the option to change individual holds regardless of this setting."
+msgstr ""
+
+#: myopac.holds.unfrozen
+msgid "Un-Frozen"
+msgstr ""
+
+#: myopac.holds.frozen.until
+msgid "Frozen Until"
+msgstr ""
+
+# =================================================================
+# MyOPAC Summary page
+# =================================================================
+#: myopac.summary.expired
+msgid "Your account expired on <span id='myopac.expired.date'/>! "
+"Please see a librarian to renew your account."
+msgstr ""
+
+#: myopac.summary.notes
+msgid "* Staff Notes *"
+msgstr ""
+
+#: myopac.summary.phone.day
+msgid "Day Phone"
+msgstr ""
+
+#: myopac.summary.phone.evening
+msgid "Evening Phone"
+msgstr ""
+
+#: myopac.summary.phone.other
+msgid "Other Phone"
+msgstr ""
+
+#: myopac.summary.change
+msgid "Change"
+msgstr ""
+
+#: myopac.summary.username.enter
+msgid "Enter new username:"
+msgstr ""
+
+#: myopac.summary.password.text
+msgid "(not shown)"
+msgstr ""
+
+#: myopac.summary.password.current
+msgid "Enter current password:"
+msgstr ""
+
+#: myopac.summary.password.new
+msgid "Enter new password:"
+msgstr ""
+
+#: myopac.summary.password.reenter
+msgid "Re-enter new password:"
+msgstr ""
+
+#: myopac.summary.email
+msgid "Email Address"
+msgstr ""
+
+#: myopac.summary.email.new
+msgid "Enter new email address:"
+msgstr ""
+
+#: myopac.summary.id.primary
+msgid "Primary Identification"
+msgstr ""
+
+#: myopac.summary.barcode
+msgid "Active Barcode"
+msgstr ""
+
+#: myopac.summary.home
+msgid "Home Library"
+msgstr ""
+
+#: myopac.summary.genesis
+msgid "Account Creation Date"
+msgstr ""
+
+#: myopac.summary.addresses
+msgid "Addresses"
+msgstr ""
+
+#: myopac.summary.address.type
+msgid "Address Type"
+msgstr ""
+
+#: myopac.summary.address.street
+msgid "Street"
+msgstr ""
+
+#: myopac.summary.address.city
+msgid "City"
+msgstr ""
+
+#: myopac.summary.address.county
+msgid "County"
+msgstr ""
+
+#: myopac.summary.address.state
+msgid "State"
+msgstr ""
+
+#: myopac.summary.address.zip
+msgid "Zip"
+msgstr ""
+
+#: myopac.summary.username.error
+msgid "Please enter a username"
+msgstr ""
+
+#: myopac.summary.username.dup
+msgid "The requested username is not available.  Please choose a different username."
+msgstr ""
+
+#: myopac.summary.username.success
+msgid "Username successfully updated"
+msgstr ""
+
+#: myopac.summary.username.failure
+msgid "Username update failed"
+msgstr ""
+
+#: myopac.summary.username.invalid
+msgid "Username cannot contain spaces or have the same format as a barcode"
+msgstr ""
+
+#: myopac.summary.email.error
+msgid "Please enter a valid email address"
+msgstr ""
+
+#: myopac.summary.email.success
+msgid "Email address successfully updated"
+msgstr ""
+
+#: myopac.summary.email.failed
+msgid "Email address update failed"
+msgstr ""
+
+#: myopac.summary.password.error
+msgid "Passwords are empty or do not match"
+msgstr ""
+
+#: myopac.summary.password.success
+#: login.password.success
+msgid "Password successfully updated"
+msgstr ""
+
+#: myopac.summary.password.failure
+msgid "Password update failed"
+msgstr ""
+
+# =================================================================
+# Advanced Search Page
+# =================================================================
+#: opac.advanced.wizard.contains
+msgid "Selected field contains the following words"
+msgstr ""
+
+#: opac.advanced.wizard.nocontains
+msgid "Selected field does <u>not</u> contain the following words"
+msgstr ""
+
+#: opac.advanced.wizard.exact
+msgid "Selected field contains the <u>exact</u> phrase"
+msgstr ""
+
+#: opac.advanced.refined.title
+msgid "Refined Advanced Search"
+msgstr ""
+
+#: opac.advanced.refined.title_contains
+msgid "Title contains the following words"
+msgstr ""
+
+#: opac.advanced.refined.author_contains
+msgid "Author contains the following words"
+msgstr ""
+
+#: opac.advanced.refined.subject_contains
+msgid "Subject contains the following words"
+msgstr ""
+
+#: opac.advanced.refined.series_contains
+msgid "Series contains the following words"
+msgstr ""
+
+#: opac.advanced.refined.contains
+msgid "Contains"
+msgstr ""
+
+#: opac.advanced.refined.nocontains
+msgid "Does not contain"
+msgstr ""
+
+#: opac.advanced.refined.exact
+msgid "Matches Exactly"
+msgstr ""
+
+#: opac.advanced.marc.warning
+msgid "For Librarians"
+msgstr ""
+
+# ==========================================================
+# MARC expert search
+#: opac.advanced.marc.title
+#: search.marc
+msgid "MARC Expert Search"
+msgstr ""
+
+#: opac.advanced.marc.tag
+msgid "MARC Tag"
+msgstr ""
+
+#: opac.advanced.marc.ind1
+msgid "Indicator 1"
+msgstr ""
+
+#: opac.advanced.marc.ind2
+msgid "Indicator 2"
+msgstr ""
+
+#: opac.advanced.marc.subfield
+msgid "Subfield"
+msgstr ""
+
+#: opac.advanced.marc.value
+msgid "Value"
+msgstr ""
+
+#: opac.advanced.marc.addrow
+msgid "Add a new row"
+msgstr ""
+
+#: opac.advanced.quick.title
+#: sidebar.quick.search
+msgid "Quick Search"
+msgstr ""
+
+#: opac.advanced.quick.issn
+msgid "ISSN"
+msgstr ""
+
+#: opac.advanced.quick.lccn
+msgid "LCCN"
+msgstr ""
+
+# title control number
+#: opac.advanced.quick.tcn
+msgid "TCN"
+msgstr ""
+
+#: opac.advanced.quick.barcode
+msgid "Item Barcode"
+msgstr ""
+
+#: search.marc.tag
+msgid "Tag:"
+msgstr ""
+
+#: search.marc.subfield
+msgid "Subfield:"
+msgstr ""
+
+#: search.marc.value
+msgid "Value:"
+msgstr ""
+
+#: search.marc.add.row
+msgid "Add Row"
+msgstr ""
+
+# ==========================================================
+# Status bar
+# ==========================================================
+#: status.results
+msgid "Including results for"
+msgstr ""
+
+# =================================================================
+# More generic stuff
+# =================================================================
+#: opac.session_expiring
+msgid "Your login session will timeout in 1 minute unless there is activity."
+msgstr ""
+
+#: opac.session_expired
+msgid "Your login session has expired"
+msgstr ""
+
+#: navigate.home
+msgid "Home"
+msgstr ""
+
+#: navigate.home.title
+msgid "Go to the Home page"
+msgstr ""
+
+#: opac.navigate.advanced.title
+msgid "Go to the Advanced Search Page"
+msgstr ""
+
+#: navigate.myopac
+#: opac.navigate.myopac
+msgid "My Account"
+msgstr ""
+
+#: navigate.myopac.title
+msgid "Go to My OPAC"
+msgstr ""
+
+#: navigate.login
+msgid "Log in"
+msgstr ""
+
+#: navigate.login.title
+msgid "Log in for personalized features"
+msgstr ""
+
+#: navigate.logout
+#: navigate.logout.title
+msgid "Log out"
+msgstr ""
+
+#: opac.navigate.selectNewOrg
+msgid "Choose a different library"
+msgstr ""
+
+#: opac.navigate.selectOrg
+#: library.select.help
+msgid "Choose a library to search"
+msgstr ""
+
+#: navigate.loggedinas
+msgid "You are logged in as "
+msgstr ""
+
+#: navigate.loggedinas.title
+msgid "Logged in as..."
+msgstr ""
+
+#: navigate.titleGroupResults
+msgid "My Search Results"
+msgstr ""
+
+#: navigate.titleResults
+msgid "My Title Results"
+msgstr ""
+
+#: navigate.title.details
+msgid "My Title Details"
+msgstr ""
+
+#: navigate.record.details
+msgid "Record Details"
+msgstr ""
+
+#: footer.find.library
+msgid "Find a Library Near Me"
+msgstr ""
+
+#: footer.find.url
+msgid "http://www.georgialibraries.org/lib/directories/pineslibdir.html"
+msgstr ""
+
+#: footer.help.url
+msgid "http://open-ils.org/dokuwiki/doku.php?id=evergreen-user:opac_help"
+msgstr ""
+
+#: footer.help
+msgid "Help"
+msgstr ""
+
+#: footer.library.url
+msgid "http://www.georgialibraries.org/public/pines.html"
+msgstr ""
+
+#: footer.library.about
+msgid "About PINES"
+msgstr ""
+
+#: footer.union.url
+msgid "http://www.galileo.usg.edu/"
+msgstr ""
+
+#: footer.union
+msgid "GALILEO"
+msgstr ""
+
+#: footer.copyright
+msgid "Copyright &#xA9; 2006 Georgia Public Library Service"
+msgstr ""
+
+# Introduces the logo for the project
+#: footer.logo
+msgid "Powered by"
+msgstr ""
+
+# =================================================================
+# My OPAC
+# =================================================================
+#: myopac.account
+msgid "Account Summary"
+msgstr ""
+
+#: myopac.checkouts
+msgid "Items Checked Out"
+msgstr ""
+
+#: myopac.holds
+msgid "Items on Hold"
+msgstr ""
+
+#: myopac.fines
+msgid "Fines"
+msgstr ""
+
+#: myopac.preferences
+msgid "Account Preferences"
+msgstr ""
+
+# =================================================================
+# Sidebar
+# =================================================================
+#: sidebar.relevantSubjects.headerLabel
+msgid "Relevant Subjects"
+msgstr ""
+
+#: sidebar.relevantAuthors.headerLabel
+msgid "Relevant Authors"
+msgstr ""
+
+#: sidebar.relevantSeries.headerLabel
+msgid "Relevant Series"
+msgstr ""
+
+#: sidebar.relevantReviews.headerLabel
+#: rdetail.extras.reviews
+msgid "Reviews"
+msgstr ""
+
+#: sidebar.copy.not.found
+msgid "No copy with the requested barcode was found"
+msgstr ""
+
+# =================================================================
+# Search formats
+# =================================================================
+#: opac.search.books
+msgid "Books"
+msgstr ""
+
+#: opac.search.allFormats
+msgid "All Formats"
+msgstr ""
+
+#: opac.search.largePrint
+msgid "Large Print Books"
+msgstr ""
+
+#: opac.search.audioBooks
+msgid "Audiobooks"
+msgstr ""
+
+#: opac.search.videoRecordings
+msgid "Video Recordings"
+msgstr ""
+
+#: opac.search.music
+msgid "Music"
+msgstr ""
+
+#: opac.search.electronic
+msgid "Electronic Resources"
+msgstr ""
+
+#: opac.search.nowSearching
+msgid "Now Searching"
+msgstr ""
+
+# =================================================================
+# Page Titles
+# =================================================================
+#: opac.title.home
+msgid "Evergreen Home"
+msgstr ""
+
+#: opac.title.mresult
+msgid "Evergreen Title Groups"
+msgstr ""
+
+#: opac.title.rresult
+msgid "Evergreen Titles"
+msgstr ""
+
+#: opac.title.myopac
+msgid "Evergreen My Account"
+msgstr ""
+
+#: opac.title.rdetail
+msgid "Evergreen Title Details"
+msgstr ""
+
+#: opac.title.advanced
+msgid "Evergreen Advanced Search"
+msgstr ""
+
+#: opac.title.reqitems
+msgid "Evergreen Request Items"
+msgstr ""
+
+#: opac.title.cnbrowse
+msgid "Evergreen Call Number Browse"
+msgstr ""
+
+#: opac.holds.forMe
+msgid "Place this hold for myself"
+msgstr ""
+
+#: opac.holds.xulRecipient
+msgid "Enter recipient barcode"
+msgstr ""
+
+#: opac.holds.recipient
+msgid "Recipient"
+msgstr ""
+
+#: opac.holds.placeHold
+msgid "Place Hold"
+msgstr ""
+
+#: opac.holds.contactPhone
+msgid "Contact telephone number"
+msgstr ""
+
+#: opac.holds.contactEmail
+msgid "Contact email address"
+msgstr ""
+
+#: opac.holds.pickupLocation
+msgid "Pickup location"
+msgstr ""
+
+#: opac.holds.success
+msgid "Hold was successfully placed"
+msgstr ""
+
+#: opac.holds.failure
+msgid "Hold was not successfully placed"
+msgstr ""
+
+# =================================================================
+# Advanced
+# =================================================================
+#: advanced.search.title
+msgid "Search Input"
+msgstr ""
+
+#: advanced.add.row
+msgid "Add Search Row"
+msgstr ""
+
+#: advanced.search.submit
+msgid "Submit Search"
+msgstr ""
+
+#: advanced.search.filters
+msgid "Search Filters"
+msgstr ""
+
+#: advanced.item.form
+msgid "Item Form"
+msgstr ""
+
+#: advanced.item.type
+msgid "Item Type"
+msgstr ""
+
+#: advanced.link
+msgid "Advanced"
+msgstr ""
+
+#: advanced.basic.link
+msgid "Basic"
+msgstr ""
+
+#: advanced.literary.form
+msgid "Literary&nbsp;Form"
+msgstr ""
+
+#: advanced.non.fiction
+msgid "Non Fiction"
+msgstr ""
+
+#: advanced.fiction
+msgid "Fiction"
+msgstr ""
+
+#: advanced.language
+msgid "Language"
+msgstr ""
+
+#: advanced.audience
+msgid "Audience"
+msgstr ""
+
+#: advanced.adult
+msgid "Adult"
+msgstr ""
+
+#: advanced.juvenile
+msgid "Juvenile"
+msgstr ""
+
+#: advanced.general
+msgid "General"
+msgstr ""
+
+#: advanced.sort.criteria
+msgid "Sort Criteria"
+msgstr ""
+
+#: advanced.search.library
+msgid "Search Library"
+msgstr ""
+
+#: advanced.relevance
+msgid "Relevance"
+msgstr ""
+
+#: advanced.pubdate
+msgid "Publication date"
+msgstr ""
+
+#: advanced.sort.asc
+msgid "Ascending / A to Z"
+msgstr ""
+
+#: advanced.sort.desc
+msgid "Descending / Z to A"
+msgstr ""
+
+#: advanced.frbrize
+msgid "Group Formats and Editions"
+msgstr ""
+
+#: advanced.go
+msgid "Go"
+msgstr ""
+
+# =================================================================
+# Rdetail
+# =================================================================
+#: rdetail.print
+msgid "print these details"
+msgstr ""
+
+#: rdetail.cn.barcode
+msgid "Barcode"
+msgstr ""
+
+#: rdetail.cn.location
+msgid "Location"
+msgstr ""
+
+#: rdetail.cn.hold.age
+msgid "Age Hold Protection"
+msgstr ""
+
+#: rdetail.cn.genesis
+msgid "Create Date"
+msgstr ""
+
+#: rdetail.cn.holdable
+msgid "Holdable"
+msgstr ""
+
+#: rdetail.cn.more
+msgid "more info..."
+msgstr ""
+
+#: rdetail.cn.less
+msgid "less info"
+msgstr ""
+
+#: rdetail.cn.hold
+#: rdetail.copyInfo.hold
+msgid "place hold"
+msgstr ""
+
+#: rdetail.cn.disabled
+msgid "- Disabled -"
+msgstr ""
+
+#: rdetail.cn.note
+msgid "Copy Note"
+msgstr ""
+
+#: rdetail.cn.category
+msgid "Copy Category"
+msgstr ""
+
+#: rdetail.cn.print
+msgid "Print Page"
+msgstr ""
+
+#: rdetail.page.results
+msgid "First results page"
+msgstr ""
+
+# Result # &common.of; #
+#: rdetail.result
+msgid "Result"
+msgstr ""
+
+#: rdetail.start
+msgid "Start"
+msgstr ""
+
+#: rdetail.page.previous
+msgid "Previous page"
+msgstr ""
+
+#: rdetail.page.next
+msgid "Next page"
+msgstr ""
+
+#: rdetail.page.last
+msgid "Last results page"
+msgstr ""
+
+#: rdetail.end
+msgid "End"
+msgstr ""
+
+#: rdetail.more
+msgid "More Actions..."
+msgstr ""
+
+#: rdetail.bookbag.add
+msgid "Add to bookbag"
+msgstr ""
+
+#: rdetail.bookbag.create
+msgid "Create a new bookbag"
+msgstr ""
+
+#: rdetail.record.deleted
+msgid "This record has been deleted from the database. "
+"We recommend that you remove this title from any bookbags it may have been added to."
+msgstr ""
+
+#: rdetail.none
+msgid "(none)"
+msgstr ""
+
+#: rdetail.bookbag.add.success
+msgid "Item successfully added to bookbag"
+msgstr ""
+
+#: rdetail.bookbag.name
+msgid "Enter the name of the new bookbag"
+msgstr ""
+
+#: rdetail.bookbag.create.success
+msgid "Bookbag successfully created"
+msgstr ""
+
+#: rdetail.detailMain.headerLabel
+msgid "Record Summary"
+msgstr ""
+
+#: rdetail.detailMain.subjects
+msgid "Subjects"
+msgstr ""
+
+#: rdetail.detailMain.abstract
+msgid "Abstract"
+msgstr ""
+
+#: rdetail.detailMain.viewMarc
+msgid "View MARC"
+msgstr ""
+
+#: rdetail.detailMain.hideMarc
+msgid "Return to title details"
+msgstr ""
+
+#: rdetail.author.search
+msgid "Perform an author search"
+msgstr ""
+
+#: rdetail.copyInfo.headerLabel
+msgid "Copy Information"
+msgstr ""
+
+#: rdetail.copyInfo.callnumber
+msgid "Callnumber"
+msgstr ""
+
+#: rdetail.copyInfo.local
+msgid "View Copy Information for this location only"
+msgstr ""
+
+#: rdetail.copyInfo.all
+msgid "View copy information for all libraries"
+msgstr ""
+
+#: rdetail.copyInfo.actions
+msgid "Actions"
+msgstr ""
+
+#: rdetail.copyInfo.print
+msgid "Print Call Numbers for this library"
+msgstr ""
+
+#: rdetail.copyInfo.details
+msgid "details"
+msgstr ""
+
+#: rdetail.copyInfo.browse
+msgid "browse"
+msgstr ""
+
+#: rdetail.extras.summary
+msgid "Copy Summary"
+msgstr ""
+
+#: rdetail.extras.toc
+msgid "Table of Contents"
+msgstr ""
+
+#: rdetail.extras.excerpt
+msgid "Excerpt"
+msgstr ""
+
+#: rdetail.extras.author.notes
+msgid "Author Notes"
+msgstr ""
+
+#: rdetail.extras.annotation
+msgid "Annotation"
+msgstr ""
+
+#: rdetail.extras.marc
+msgid "MARC Record"
+msgstr ""
+
+#: rdetail.extras.call.null
+msgid "There are no call numbers for this item at this location."
+msgstr ""
+
+#: rdetail.extras.call.local
+msgid "Local Call Numbers:"
+msgstr ""
+
+#: rdetail.loading
+msgid "Loading copy infomation..."
+msgstr ""
+
+#: rdetail.noneAvailable
+msgid " * There are no copies in this location"
+msgstr ""
+
+#: rdetail.summary.online
+msgid "Online Resources"
+msgstr ""
+
+#: result.sort_by
+msgid "Sort Results by Relevance"
+msgstr ""
+
+#: result.sort_by.title
+msgid "Sort Results by Title"
+msgstr ""
+
+#: result.sort_by.author
+msgid "Sort Results by Author"
+msgstr ""
+
+#: result.sort_by.pubdate
+msgid "Sort Results by Publication Date"
+msgstr ""
+
+#: result.limit2avail
+msgid "Limit to Available"
+msgstr ""
+
+#: result.info.copies
+msgid "Available copies / Total copies"
+msgstr ""
+
+#: result.info.no.items
+msgid "No items with the selected format were found in this location."
+msgstr ""
+
+#: result.info.format.items
+msgid "Listed below are all items in the catalog with the chosen format."
+msgstr ""
+
+#: result.info.show
+msgid "Show records for"
+msgstr ""
+
+#: result.lowhits.few
+msgid "Few hits were returned for your search."
+msgstr ""
+
+#: result.lowhits.zero
+msgid "Zero hits were returned for your search."
+msgstr ""
+
+#: result.lowhits.did.you.mean
+msgid "Maybe you meant:"
+msgstr ""
+
+#: result.lowhits.formats
+msgid "You will find more hits when searching all item formats:"
+msgstr ""
+
+#: result.lowhits.formats.search
+msgid "Search again with all formats?"
+msgstr ""
+
+#: result.lowhits.related
+msgid "You may also like to try these related searches:"
+msgstr ""
+
+#: result.lowhits.expand
+msgid "You may also wish to expand your search range to:"
+msgstr ""
+
+#: result.lowhits.class
+msgid "You can try searching the same terms by:"
+msgstr ""
+
+#: result.lowhits.title
+msgid "title"
+msgstr ""
+
+#: result.lowhits.author
+msgid "author"
+msgstr ""
+
+#: result.lowhits.subject
+msgid "subject"
+msgstr ""
+
+#: result.lowhits.series
+msgid "series"
+msgstr ""
+
+#: result.lowhits.keyword
+msgid "keyword"
+msgstr ""
+
+#: result.table.keyword
+msgid "View titles for this record"
+msgstr ""
+
+#: result.table.author
+msgid "Perform an Author Search"
+msgstr ""
+
+#: common.call.number.label
+msgid "Call Number:"
+msgstr ""
+
+#: common.isbn.label
+msgid "ISBN:"
+msgstr ""
+
+#: common.issn.label
+msgid "ISSN:"
+msgstr ""
+
+#: common.copy.barcode.label
+msgid "Copy Barcode:"
+msgstr ""
+
+#: common.hold.place
+msgid "Place hold for me"
+msgstr ""
+
+#: common.hold.check
+msgid "Checking for possibility of hold fulfillment..."
+msgstr ""
+
+#: common.hold.create
+msgid "Create / Edit a Hold"
+msgstr ""
+
+#: common.hold.update
+msgid "Update Hold"
+msgstr ""
+
+#: common.hold.type.label
+msgid "Hold Type:"
+msgstr ""
+
+#: common.hold.volume
+msgid "Volume Hold"
+msgstr ""
+
+#: common.hold.copy
+msgid "Copy Hold"
+msgstr ""
+
+#: common.hold.advanced
+msgid "Advanced Hold Options"
+msgstr ""
+
+#: common.hold.delivery
+msgid "Please select a physical location where your hold can be delivered."
+msgstr ""
+
+#: common.hold.exists
+msgid "A hold already exists on the requested item."
+msgstr ""
+
+#: common.hold.exists.override
+msgid "A hold already exists on the requested "
+"item. Would you like to create the hold anyway?"
+msgstr ""
+
+#: common.hold.barred
+msgid "PATRON BARRED. Please see any notes in the "
+"\"Staff Notes\" section of your \"My Account\" page or contact your local library."
+msgstr ""
+
+#: common.hold.item.invalid
+msgid "This hold is no longer valid. It's likely that the "
+"target for the hold was deleted from the system.  Please cancel this hold and "
+"place a new one."
+msgstr ""
+
+#: common.hold.patron.invalid
+msgid "The patron barcode entered as the hold recipient is invalid."
+msgstr ""
+
+# Was (??), perhaps change to a button or icon?
+#: common.help
+msgid "(Help)"
+msgstr ""
+
+#: common.phone.format.help
+msgid "The phone number does not have the correct format. The expected format is XXX-YYY-ZZZZ"
+msgstr ""
+
+#: common.hold.failed
+msgid "No items were found that could fulfill the requested holds. "
+"It's possible that choosing a different format will result in a successful hold. "
+"It is also possible that you have exceeded the number of allowable holds. "
+"For further information, please consult your local librarian."
+msgstr ""
+
+#: common.control.click
+msgid "(control-click to select multiple formats)"
+msgstr ""
+
+#: common.format.alternatives
+msgid "Acceptable Alternative Formats:"
+msgstr ""
+
+#: common.phone.format
+msgid "(XXX-YYY-ZZZZ)"
+msgstr ""
+
+#: common.phone.enable
+msgid "Enable phone notifications for this hold?"
+msgstr ""
+
+#: common.email.enable
+msgid "Enable email notifications for this hold?"
+msgstr ""
+
+#: common.email.none
+msgid "(Patron has no configured email address)"
+msgstr ""
+
+#: common.email.set
+msgid "(See <a class='classic_link' id='holds.no_email.my_account'>My Account</a> for setting your email address)"
+msgstr ""
+
+#: common.keywords.label
+msgid "Keywords:"
+msgstr ""
+
+#: common.physical.label
+msgid "Physical Description:"
+msgstr ""
+
+#: common.series.label
+msgid "Series:"
+msgstr ""
+
+#: common.subject.label
+msgid "Subject:"
+msgstr ""
+
+#: common.title.label
+msgid "Title:"
+msgstr ""
+
+#: common.author.label
+msgid "Author:"
+msgstr ""
+
+#: common.format.label
+msgid "Format:"
+msgstr ""
+
+#: library.select
+msgid "Find results in"
+msgstr ""
+
+#: library.select.label
+msgid "Choose a different library..."
+msgstr ""
+
+#: login.username
+msgid "Enter your username or library barcode"
+msgstr ""
+
+#: login.password.change
+msgid "Change Password"
+msgstr ""
+
+#: login.first.time
+msgid "This appears to be the first time you have logged in. "
+"You will need to change your password."
+msgstr ""
+
+#: login.password.current.enter
+msgid "Enter your current password"
+msgstr ""
+
+#: login.password.new.enter
+msgid "Enter the new password"
+msgstr ""
+
+#: login.password.new.reenter
+msgid "Re-type the new password for verification"
+msgstr ""
+
+#: login.password.update
+msgid "Update Password"
+msgstr ""
+
+#: login.password.nomatch
+msgid "Passwords do not match"
+msgstr ""
+
+#: login.password.strength
+msgid "The password provided is not strong enough."
+msgstr ""
+
+#: login.barcode.inactive
+msgid "The barcode used to login is marked as inactive.  Please contact your local library."
+msgstr ""
+
+#: login.account.inactive
+msgid "This account has been deactivated.  Please contact your local library."
+msgstr ""
+
+#: login.failed
+msgid "Login failed. The username or password provided was not valid. "
+"Ensure Caps-Lock is off and try again or contact your local library."
+msgstr ""
+
+#: button.go
+msgid "Go!"
+msgstr ""
+
+# =================================================================
+# Slimpac Simple Search
+# =================================================================
+#: slimpac.start.title
+msgid "Simple Search"
+msgstr ""
+
+#: slimpac.start.nowSearching
+msgid "Now searching: "
+msgstr ""
+
+#: slimpac.start.dynamic
+msgid "Dynamic Catalog"
+msgstr ""
+
+# =================================================================
+# Slimpac Advanced Search
+# =================================================================
+#: slimpac.advanced.language
+msgid "Item Language"
+msgstr ""
+
+#: slimpac.advanced.create_date
+msgid "Record Creation Date"
+msgstr ""
+
+#: slimpac.advanced.edit_date
+msgid "Record Edit Date"
+msgstr ""
+
+#: opac.image_provided
+msgid "Image provided by"
+msgstr ""
+
+#: vendor.name
+msgid "Amazon"
+msgstr ""
+
+#: vendor.base_link
+msgid "http://amazon.com/dp/"
+msgstr ""
diff --git a/build/i18n/po/fm_IDL.pot b/build/i18n/po/fm_IDL.pot
deleted file mode 100644 (file)
index 2b3d390..0000000
+++ /dev/null
@@ -1,2148 +0,0 @@
-# 
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-12-11 13:27:35-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: field.aihu.org_unit.label:240 field.ancihu.org_unit.label:257
-msgid "Using Library"
-msgstr ""
-
-#: field.rxbt.voided.label:2475
-msgid "Voided Billing Amount"
-msgstr ""
-
-#: field.bre.source.label:524
-msgid "Record Source"
-msgstr ""
-
-#: field.bre.marc.label:522
-msgid "MARC21Slim"
-msgstr ""
-
-#: field.mbts.xact_start.label:179
-msgid "Transaction Start Time"
-msgstr ""
-
-#: field.mrd.vr_format.label:906
-msgid "Video Recording Format"
-msgstr ""
-
-#: field.aua.within_city_limits.label:957
-msgid "Within City Limits?"
-msgstr ""
-
-#: field.rhrr.hold_type.label:2460
-msgid "Hold Request Type"
-msgstr ""
-
-#: field.au.demographic.label:698
-msgid "Demographic Info"
-msgstr ""
-
-#: class.mwp.label:1630
-msgid "Work Payment"
-msgstr ""
-
-#: field.au.ident_value2.label:679
-msgid "Secondary Identification"
-msgstr ""
-
-#: field.mbts.last_payment_note.label:172
-#: field.rccbs.last_payment_note.label:2604
-msgid "Last Payment Note"
-msgstr ""
-
-#: field.au.expire_date.label:671
-msgid "Privilege Expiration Date"
-msgstr ""
-
-#: field.ac.id.label:1346
-msgid "Card ID"
-msgstr ""
-
-#: field.mp.credit_card_payment.label:2029
-#: field.mbp.credit_card_payment.label:2060
-msgid "Credit Card Payment Detail"
-msgstr ""
-
-#: class.rssr.label:2372
-msgid "Simple Record Extracts"
-msgstr ""
-
-#: field.au.id.label:675 field.rud.id.label:2433
-msgid "User ID"
-msgstr ""
-
-#: field.asc.entries.label:1328 field.actsc.entries.label:1358
-msgid "Entries"
-msgstr ""
-
-#: field.acp.dummy_title.label:1784
-msgid "Precat Dummy Title"
-msgstr ""
-
-#: field.acpn.create_date.label:747
-msgid "Note Creation Date/Time"
-msgstr ""
-
-#: field.aua.street2.label:954
-msgid "Street (2)"
-msgstr ""
-
-#: field.mcrp.amount.label:1408 field.mwp.amount.label:1636
-#: field.mgp.amount.label:1657 field.mckp.amount.label:1745
-#: field.mp.amount.label:2021 field.mbp.amount.label:2052
-#: field.mndp.amount.label:2083 field.mdp.amount.label:2106
-#: field.mb.amount.label:2189
-msgid "Amount"
-msgstr ""
-
-#: field.mcrp.id.label:1410
-msgid "Pyament ID"
-msgstr ""
-
-#: field.au.claims_returned_count.label:664
-msgid "Claims-returned Count"
-msgstr ""
-
-#: field.bre.series_field_entries.label:534
-msgid "Indexed Series Field Entries"
-msgstr ""
-
-#: field.rccbs.demographic_general_division.label:2611
-msgid "User Age Demographic"
-msgstr ""
-
-#: field.rccc.dewey.label:2522
-msgid "Call Number Dewey/Prefix"
-msgstr ""
-
-#: field.crahp.name.label:1822 field.crmf.name.label:1834
-msgid "Rule Name"
-msgstr ""
-
-#: field.clfm.code.label:1624
-msgid "LitF Code"
-msgstr ""
-
-#: field.mrd.type_mat.label:905
-msgid "TMat"
-msgstr ""
-
-#: class.mckp.label:1739 field.mdp.check_payment.label:2117
-msgid "Check Payment"
-msgstr ""
-
-#: field.rccc.stat_cat_1.label:2529
-msgid "Legacy CAT1 Link"
-msgstr ""
-
-#: field.mfr.tag.label:770
-msgid "Tag"
-msgstr ""
-
-#: field.aout.org_units.label:1468
-msgid "Org Units"
-msgstr ""
-
-#: field.rccbs.profile_group.label:2617
-msgid "User Profile Group"
-msgstr ""
-
-#: field.ahr.bib_rec.label:1249
-msgid "Bib Record link"
-msgstr ""
-
-#: field.ahn.method.label:1106
-msgid "Notification Method"
-msgstr ""
-
-#: field.au.groups.label:695
-msgid "Additional Permission Groups"
-msgstr ""
-
-#: field.ahr.request_lib.label:1238
-msgid "Requesting Library"
-msgstr ""
-
-#: field.ahtc.source.label:2170
-msgid "Sending Library"
-msgstr ""
-
-#: field.rccc.call_number.label:2520
-msgid "Call Number Link"
-msgstr ""
-
-#: field.ahr.target.label:1243
-msgid "Target Object ID"
-msgstr ""
-
-#: field.circ.checkin_lib.label:1002 field.rodcirc.checkin_lib.label:2667
-msgid "Check In Library"
-msgstr ""
-
-#: field.aua.state.label:952
-msgid "State"
-msgstr ""
-
-#: field.mp.voided.label:2027 field.mbp.voided.label:2058
-#: field.mndp.voided.label:2089 field.mdp.voided.label:2114
-#: field.mb.voided.label:2195
-msgid "Voided?"
-msgstr ""
-
-#: class.citm.label:1148
-msgid "Item Type Map"
-msgstr ""
-
-#: field.rccbs.billing_location_shortname.label:2585
-msgid "Billing Location Short (Policy) Name"
-msgstr ""
-
-#: field.rud.general_division.label:2435
-msgid "General Demographic Division"
-msgstr ""
-
-#: field.asvq.responses.label:151 field.asv.responses.label:1179
-msgid "Responses"
-msgstr ""
-
-#: field.mrd.item_form.label:899
-msgid "Form"
-msgstr ""
-
-#: field.aou.ou_type.label:1281 class.aout.label:1455
-msgid "Organizational Unit Type"
-msgstr ""
-
-#: field.mcrp.payment_ts.label:1412 field.mwp.payment_ts.label:1640
-#: field.mgp.payment_ts.label:1661 field.mckp.payment_ts.label:1751
-msgid "Payment Timestamp"
-msgstr ""
-
-#: field.mfr.ind1.label:766
-msgid "Indicator 1"
-msgstr ""
-
-#: field.mfr.ind2.label:767
-msgid "Indicator 2"
-msgstr ""
-
-#: field.bre.call_numbers.label:511
-msgid "Call Numbers"
-msgstr ""
-
-#: field.mp.payment_ts.label:2024 field.mbp.payment_ts.label:2055
-#: field.mndp.payment_ts.label:2086 field.mdp.payment_ts.label:2109
-msgid "Payment Date/Time"
-msgstr ""
-
-#: field.ac.active.label:1344
-msgid "IsActive?"
-msgstr ""
-
-#: None:723
-msgid "Check-ins Performed as Staff"
-msgstr ""
-
-#: field.au.other_phone.label:684
-msgid "Other Phone"
-msgstr ""
-
-#: field.bre.simple_record.label:536
-msgid "Simple Record Extracts "
-msgstr ""
-
-#: class.actsce.label:1575
-msgid "User Stat Cat Entry"
-msgstr ""
-
-#: field.rccc.stat_cat_2_value.label:2536
-msgid "Legacy CAT2 Value"
-msgstr ""
-
-#: class.acn.label:442 field.acp.call_number.label:1772
-msgid "Call Number/Volume"
-msgstr ""
-
-#: field.mrd.control_type.label:896
-msgid "Ctrl"
-msgstr ""
-
-#: field.au.family_name.label:672
-msgid "Last Name"
-msgstr ""
-
-#: field.rccc.stat_cat_2.label:2530
-msgid "Legacy CAT2 Link"
-msgstr ""
-
-#: field.au.stat_cat_entries.label:655
-msgid "Statistical Category Entries"
-msgstr ""
-
-#: field.mrd.audience.label:892
-msgid "Audn"
-msgstr ""
-
-#: class.ancihu.label:250
-msgid "Non-cataloged In House Use"
-msgstr ""
-
-#: field.ahr.holdable_formats.label:1233
-msgid "Holdable Formats (for M-type hold)"
-msgstr ""
-
-#: field.acp.notes.label:1796
-msgid "Copy Notes"
-msgstr ""
-
-#: field.mbts.total_owed.label:175
-msgid "Total Owed"
-msgstr ""
-
-#: field.au.ident_type2.label:677
-msgid "Secondary Identification Type"
-msgstr ""
-
-#: field.actscecm.stat_cat.label:1943
-msgid "Statistical Category"
-msgstr ""
-
-#: field.mbts.last_payment_ts.label:173
-msgid "Last Payment Timestamp"
-msgstr ""
-
-#: field.ahr.usr.label:1244
-msgid "Hold User"
-msgstr ""
-
-#: class.mdp.label:2101
-msgid "Payments: Desk"
-msgstr ""
-
-#: field.asvr.answer.label:296
-msgid "Answer"
-msgstr ""
-
-#: field.aun.pub.label:194 field.acpn.pub.label:751
-#: field.acpl.opac_visible.label:1125
-msgid "Is OPAC Visible?"
-msgstr ""
-
-#: field.ahr.notifications.label:1248
-msgid "Notifications"
-msgstr ""
-
-#: field.aou.shortname.label:1283
-msgid "Short (Policy) Name"
-msgstr ""
-
-#: field.asvr.answer_date.label:297
-msgid "Answer Date/Time"
-msgstr ""
-
-#: field.rccc.dewey_block_hundreds.label:2534
-msgid "Dewey Block -- Hundreds"
-msgstr ""
-
-#: field.acn.deleted.label:450 field.au.deleted.label:696
-#: field.acp.deleted.label:1780
-msgid "Is Deleted"
-msgstr ""
-
-#: field.acn.edit_date.label:451 field.acp.edit_date.label:1785
-msgid "Last Edit Date/Time"
-msgstr ""
-
-#: field.mbts.xact_type.label:180 field.rccbs.xact_type.label:2598
-msgid "Transaction Type"
-msgstr ""
-
-#: field.mbt.xact_start.label:1557 field.rccbs.xact_start.label:2596
-msgid "Transaction Start Date/Time"
-msgstr ""
-
-#: class.mbts.label:162
-msgid "Billable Transaction Summary"
-msgstr ""
-
-#: field.mb.billing_ts.label:2190
-msgid "Billing Timestamp"
-msgstr ""
-
-#: field.au.billing_address.label:662
-msgid "Physical Address"
-msgstr ""
-
-#: field.mrd.item_lang.label:900
-msgid "Lang"
-msgstr ""
-
-#: field.actsce.stat_cat.label:1582 field.asce.stat_cat.label:2150
-msgid "Stat Cat"
-msgstr ""
-
-#: field.mrd.id.label:898
-msgid "Descriptor ID"
-msgstr ""
-
-#: field.cit.name.label:141
-msgid "Identification Name"
-msgstr ""
-
-#: field.rccc.dewey_range_tens.label:2531
-msgid "Dewey Range -- Tens"
-msgstr ""
-
-#: field.mdp.accepting_usr.label:2112
-msgid "Accepting User"
-msgstr ""
-
-#: field.rssr.biblio_record.label:2388 field.rsr.biblo_record.label:2421
-msgid "Full Bibliographic record"
-msgstr ""
-
-#: field.mb.billing_type.label:2191
-msgid "Billing Type"
-msgstr ""
-
-#: class.iatc.label:2628
-msgid "Inter-system Copy Transit"
-msgstr ""
-
-#: class.aihu.label:233
-msgid "In House Use"
-msgstr ""
-
-#: field.circ.circ_type.label:1030 class.rcirct.label:2441
-#: field.rcirct.type.label:2447 field.rccc.circ_type.label:2509
-#: field.rodcirc.circ_type.label:2694
-msgid "Circulation Type"
-msgstr ""
-
-#: field.ahtc.hold.label:2166
-msgid "Hold requiring Transit"
-msgstr ""
-
-#: field.ahr.transit.label:1224
-msgid "Transit"
-msgstr ""
-
-#: field.aou.ill_address.label:1278
-msgid "ILL Receiving Address"
-msgstr ""
-
-#: field.aout.name.label:1465
-msgid "Type Name"
-msgstr ""
-
-#: field.rssr.author.label:2383 field.rsr.author.label:2407
-msgid "Author (normalized)"
-msgstr ""
-
-#: field.circ.stop_fines_time.label:1021
-#: field.rodcirc.stop_fines_time.label:2686
-msgid "Fine Stop Date/Time"
-msgstr ""
-
-#: field.au.settings.label:653
-msgid "All User Settings"
-msgstr ""
-
-#: field.acn.copies.label:447
-msgid "Copies"
-msgstr ""
-
-#: field.ahr.cancel_time.label:1245
-msgid "Hold Cancel Date/Time"
-msgstr ""
-
-#: field.pgt.perm_interval.label:1848
-msgid "User Expiration Interval"
-msgstr ""
-
-#: field.circ.fine_interval.label:1011 field.rodcirc.fine_interval.label:2676
-msgid "Fine Interval"
-msgstr ""
-
-#: class.mrd.label:887
-msgid "Basic Record Descriptor"
-msgstr ""
-
-#: field.circ.billing_total.label:1031 field.mg.billing_total.label:1524
-#: field.mbt.billing_total.label:1562 field.rodcirc.billing_total.label:2695
-msgid "Billing Totals"
-msgstr ""
-
-#: class.aua.label:941
-msgid "User Address"
-msgstr ""
-
-#: class.aou.label:1269
-msgid "Organizational Unit"
-msgstr ""
-
-#: field.ancc.circ_time.label:1878 field.rccc.xact_start.label:2508
-msgid "Circulation Date/Time"
-msgstr ""
-
-#: field.mwp.id.label:1638 field.mgp.id.label:1659 field.mckp.id.label:1749
-#: field.mp.id.label:2022 field.mbp.id.label:2053 field.mndp.id.label:2084
-#: field.mdp.id.label:2107
-msgid "Payment ID"
-msgstr ""
-
-#: field.rssr.issn.label:2387 field.rsr.issn.label:2414
-msgid "ISSN"
-msgstr ""
-
-#: field.au.usrname.label:694
-msgid "OPAC/Staff Client User Name"
-msgstr ""
-
-#: field.rssr.title.label:2382 field.rsr.title.label:2405
-msgid "Title Proper (normalized)"
-msgstr ""
-
-#: field.ahr.selection_depth.label:1241
-msgid "Item Selection Depth"
-msgstr ""
-
-#: field.circ.circ_lib.label:1005 field.acp.circ_lib.label:1774
-#: field.ancc.circ_lib.label:1877 field.rodcirc.circ_lib.label:2670
-msgid "Circulating Library"
-msgstr ""
-
-#: field.rxpt.unvoided.label:2488
-msgid "Unvoided Paid Amount"
-msgstr ""
-
-#: field.aou.opac_visible.label:1286 field.asc.opac_visible.label:1331
-#: field.actsc.opac_visible.label:1361 field.acp.opac_visible.label:1792
-msgid "OPAC Visible"
-msgstr ""
-
-#: field.cam.code.label:426
-msgid "Audience Code"
-msgstr ""
-
-#: field.rssr.publisher.label:2384 field.rsr.publisher.label:2408
-msgid "Publisher (normalized)"
-msgstr ""
-
-#: field.mbts.usr.label:177
-msgid "Billed User"
-msgstr ""
-
-#: field.circ.max_fine_rule.label:1014 class.crmf.label:1827
-#: field.rodcirc.max_fine_rule.label:2679
-msgid "Max Fine Rule"
-msgstr ""
-
-#: field.rccc.circ_lib_id.label:2507
-msgid "Library Circulation Location Link"
-msgstr ""
-
-#: field.au.alert_message.label:660 field.acp.alert_message.label:1770
-msgid "Alert Message"
-msgstr ""
-
-#: field.rccbs.last_payment_ts.label:2603
-msgid "Last Payment Date/Time"
-msgstr ""
-
-#: field.mbts.id.label:168 field.mg.id.label:1516 field.mbt.id.label:1554
-#: field.mwp.xact.label:1641 field.mgp.xact.label:1662
-#: field.rxbt.xact.label:2473 field.rxpt.xact.label:2487
-#: field.rccbs.id.label:2583
-msgid "Transaction ID"
-msgstr ""
-
-#: field.rssr.quality.label:2379 field.rsr.quality.label:2402
-msgid "Overall Record Quality"
-msgstr ""
-
-#: field.au.barred.label:661
-msgid "Barred"
-msgstr ""
-
-#: field.ahn.notify_time.label:1109
-msgid "Notification Date/Time"
-msgstr ""
-
-#: field.bre.subject_field_entries.label:531
-msgid "Indexed Subject Field Entries"
-msgstr ""
-
-#: class.acpl.label:1116
-msgid "Copy/Shelving Location"
-msgstr ""
-
-#: field.auoi.org_unit.label:110
-msgid "Allowed Org Unit"
-msgstr ""
-
-#: class.clfm.label:1619 field.rccc.lit_form.label:2514
-msgid "Literary Form"
-msgstr ""
-
-#: field.ahr.prev_check_time.label:1237
-msgid "Last Targeting Date/Time"
-msgstr ""
-
-#: field.asvr.response_group_id.label:301
-msgid "Response Group ID"
-msgstr ""
-
-#: class.cifm.label:432
-msgid "Item Form Map"
-msgstr ""
-
-#: class.aus.label:204
-msgid "User Setting"
-msgstr ""
-
-#: field.circ.duration.label:1009 field.cnct.circ_duration.label:1445
-#: field.rodcirc.duration.label:2674
-msgid "Circulation Duration"
-msgstr ""
-
-#: field.rccc.language.label:2513
-msgid "Item Language"
-msgstr ""
-
-#: class.mbp.label:2047
-msgid "Payments: Brick-and-mortar"
-msgstr ""
-
-#: class.actscecm.label:1937
-msgid "User Statistical Category Entry"
-msgstr ""
-
-#: field.ahn.note.label:1107
-msgid "Notification Note"
-msgstr ""
-
-#: field.circ.recuring_fine_rule.label:1018
-#: field.rodcirc.recuring_fine_rule.label:2683
-msgid "Recurring Fine Rule"
-msgstr ""
-
-#: field.circ.duration_rule.label:1010 field.rodcirc.duration_rule.label:2675
-msgid "Circ Duration Rule"
-msgstr ""
-
-#: field.aout.opac_label.label:1466
-msgid "OPAC Label"
-msgstr ""
-
-#: field.asv.required.label:1187
-msgid "Is Required?"
-msgstr ""
-
-#: field.au.survey_responses.label:656
-msgid "Survey Responses"
-msgstr ""
-
-#: field.atc.id.label:275 field.ahtc.id.label:2167 field.iatc.id.label:2645
-msgid "Transit ID"
-msgstr ""
-
-#: field.rccbs.usr_home_ou_name.label:2590
-msgid "User Home Library Name"
-msgstr ""
-
-#: field.au.credit_forward_balance.label:666
-msgid "User Credit Balance"
-msgstr ""
-
-#: class.rsce2.label:2564
-msgid "CAT2 Entry"
-msgstr ""
-
-#: field.aun.create_date.label:191 field.acp.create_date.label:1778
-msgid "Creation Date/Time"
-msgstr ""
-
-#: field.aout.id.label:1464
-msgid "Type ID"
-msgstr ""
-
-#: field.circ.payments.label:1028 field.rodcirc.payments.label:2692
-msgid "Transaction Payments"
-msgstr ""
-
-#: class.bre.label:506
-msgid "Bibliographic Record"
-msgstr ""
-
-#: field.ahr.eligible_copies.label:1250
-msgid "Eligible Copies"
-msgstr ""
-
-#: field.mp.cash_payment.label:2028 field.mbp.cash_payment.label:2059
-msgid "Cash Payment Detail"
-msgstr ""
-
-#: field.mfr.id.label:765
-msgid "Field ID"
-msgstr ""
-
-#: field.bre.tcn_value.label:526 field.rssr.tcn_value.label:2381
-#: field.rsr.tcn_value.label:2404
-msgid "TCN Value"
-msgstr ""
-
-#: field.rccbs.total_owed.label:2601
-msgid "Total Billed"
-msgstr ""
-
-#: class.aun.label:186
-msgid "User Note"
-msgstr ""
-
-#: class.actsc.label:1353
-msgid "User Statistical Category"
-msgstr ""
-
-#: class.pgt.label:1838
-msgid "Permission Group"
-msgstr ""
-
-#: field.mp.forgive_payment.label:2033 field.mbp.forgive_payment.label:2064
-#: field.mndp.forgive_payment.label:2091
-msgid "Forgive Payment Detail"
-msgstr ""
-
-#: field.rhrr.target.label:2459
-msgid "Hold Target"
-msgstr ""
-
-#: field.au.suffix.label:691
-msgid "Suffix/Title"
-msgstr ""
-
-#: field.asvr.effective_date.label:298
-msgid "Effective Answer Date/Time"
-msgstr ""
-
-#: field.acp.deposit.label:1781
-msgid "Is Deposit Required"
-msgstr ""
-
-#: field.ahr.capture_time.label:1225
-msgid "Capture Date/Time"
-msgstr ""
-
-#: field.mbts.balance_owed.label:167 field.rccbs.balance_owed.label:2616
-msgid "Balance Owed"
-msgstr ""
-
-#: field.aua.street1.label:953
-msgid "Street (1)"
-msgstr ""
-
-#: field.rhrr.bib_record.label:2461
-msgid "Target Bib Record"
-msgstr ""
-
-#: class.ac.label:1339
-msgid "Library Card"
-msgstr ""
-
-#: field.au.second_given_name.label:689
-msgid "Middle Name"
-msgstr ""
-
-#: field.aihu.staff.label:241 field.ancihu.staff.label:258
-msgid "Recording Staff"
-msgstr ""
-
-#: field.aou.billing_address.label:1275
-msgid "Billing Address"
-msgstr ""
-
-#: field.acp.stat_cat_entries.label:1768
-msgid "Statistical Catagory Entries"
-msgstr ""
-
-#: field.crahp.id.label:1821 field.crmf.id.label:1833
-msgid "Rule ID"
-msgstr ""
-
-#: field.acp.loan_duration.label:1790
-msgid "Loan Duration"
-msgstr ""
-
-#: field.mrd.item_type.label:901 field.aua.address_type.label:946
-msgid "Type"
-msgstr ""
-
-#: field.ahr.expire_time.label:1228
-msgid "Hold Expire Date/Time"
-msgstr ""
-
-#: field.bre.full_record_entries.label:535
-msgid "Flattened MARC Fields "
-msgstr ""
-
-#: class.mg.label:1510
-msgid "Grocery Transaction"
-msgstr ""
-
-#: field.acn.record.label:456
-msgid "Bib Record"
-msgstr ""
-
-#: field.rccbs.patron_city.label:2613
-msgid "User City"
-msgstr ""
-
-#: field.ahn.hold.label:1104 field.aufh.hold.label:1913
-msgid "Hold"
-msgstr ""
-
-#: field.cifm.value.label:438
-msgid "Item Form"
-msgstr ""
-
-#: class.cit.label:135
-msgid "Identification Type"
-msgstr ""
-
-#: field.ahr.requestor.label:1240
-msgid "Requesting User"
-msgstr ""
-
-#: field.auoi.opt_in_ws.label:107 class.aws.label:121
-msgid "Workstation"
-msgstr ""
-
-#: field.mcrp.xact.label:1413 field.mb.xact.label:2197
-msgid "Transaction"
-msgstr ""
-
-#: field.rccc.circ_lib.label:2506
-msgid "Library Circulation Location Short (Policy) Name"
-msgstr ""
-
-#: field.acp.fine_level.label:1787
-msgid "Fine Level"
-msgstr ""
-
-#: field.rxpt.total.label:2490
-msgid "Total Paid Amount"
-msgstr ""
-
-#: field.aun.id.label:193 field.acpn.id.label:749
-msgid "Note ID"
-msgstr ""
-
-#: field.pgt.application_perm.label:1849
-msgid "Required Permission"
-msgstr ""
-
-#: field.rsr.uniform_title.label:2406
-msgid "Uniform Title (normalized)"
-msgstr ""
-
-#: field.mg.xact_finish.label:1519
-msgid "Transaction Finish Timestamp"
-msgstr ""
-
-#: class.ahr.label:1218
-msgid "Hold Request"
-msgstr ""
-
-#: field.bre.notes.label:529
-msgid "Non-MARC Record Notes"
-msgstr ""
-
-#: field.ancihu.item_type.label:256 field.citm.value.label:1154
-msgid "Item Type"
-msgstr ""
-
-#: field.ahr.phone_notify.label:1235
-msgid "Notifications Phone Number"
-msgstr ""
-
-#: field.mg.billable_transaction.label:1523
-msgid "Billable Transaction link"
-msgstr ""
-
-#: field.circ.id.label:1012 field.rodcirc.id.label:2677
-msgid "Circ ID"
-msgstr ""
-
-#: field.bre.deleted.label:516
-msgid "Is Deleted?"
-msgstr ""
-
-#: field.mbt.billings.label:1560
-msgid "Billing Line Items"
-msgstr ""
-
-#: field.acp.circulate.label:1776
-msgid "Can Circulate"
-msgstr ""
-
-#: field.bre.last_xact_id.label:521
-msgid "Last Transaction ID"
-msgstr ""
-
-#: field.mp.check_payment.label:2031 field.mbp.check_payment.label:2062
-msgid "Check Payment Detail"
-msgstr ""
-
-#: field.ahr.id.label:1234 field.rhrr.id.label:2458
-msgid "Hold ID"
-msgstr ""
-
-#: field.mbts.last_billing_ts.label:170
-msgid "Last Billing Timestamp"
-msgstr ""
-
-#: field.pgt.usergroup.label:1850
-msgid "Is User Group"
-msgstr ""
-
-#: field.rccbs.usr.label:2594
-msgid "User Link"
-msgstr ""
-
-#: field.acpl.circulate.label:1121
-msgid "Can Circulate?"
-msgstr ""
-
-#: field.acp.stat_cat_entry_copy_maps.label:1797
-msgid "Stat-Cat entry maps"
-msgstr ""
-
-#: field.aout.children.label:1460
-msgid "Subordinate Types"
-msgstr ""
-
-#: field.bre.fixed_fields.label:512
-msgid "Fixed Field Entry"
-msgstr ""
-
-#: field.bre.fingerprint.label:519 field.rssr.fingerprint.label:2378
-#: field.rsr.fingerprint.label:2401
-msgid "Fingerprint"
-msgstr ""
-
-#: field.pgt.children.label:1843
-msgid "Child Groups"
-msgstr ""
-
-#: field.aws.owning_lib.label:128 field.acn.owning_lib.label:455
-#: field.asv.owner.label:1185 field.asc.owner.label:1332
-#: field.actsc.owner.label:1362 field.cnct.owning_lib.label:1449
-msgid "Owning Library"
-msgstr ""
-
-#: field.mg.billing_location.label:1515
-msgid "Billing Location"
-msgstr ""
-
-#: field.circ.circ_staff.label:1006 field.ancc.staff.label:1882
-#: field.rodcirc.circ_staff.label:2671
-msgid "Circulating Staff"
-msgstr ""
-
-#: class.asce.label:2143
-msgid "Item Stat Cat Entry"
-msgstr ""
-
-#: field.atc.hold_transit_copy.label:281 class.ahtc.label:2158
-#: field.iatc.hold_transit_copy.label:2651
-msgid "Hold Transit"
-msgstr ""
-
-#: field.asv.opac.label:1184
-msgid "OPAC Surevey?"
-msgstr ""
-
-#: field.aun.creator.label:192
-msgid "Creating Staff"
-msgstr ""
-
-#: field.circ.due_date.label:1008 field.rodcirc.due_date.label:2673
-msgid "Due Date/Time"
-msgstr ""
-
-#: field.asvq.id.label:152
-msgid "Question ID"
-msgstr ""
-
-#: class.mb.label:2184
-msgid "Billing Line Item"
-msgstr ""
-
-#: field.rsr.external_uri.label:2420
-msgid "External URI List (normalized)"
-msgstr ""
-
-#: field.actsce.id.label:1580 field.actscecm.id.label:1942
-#: field.asce.id.label:2148 field.rsce1.id.label:2555
-#: field.rsce2.id.label:2569
-msgid "Entry ID"
-msgstr ""
-
-#: field.acp.age_protect.label:1769
-msgid "Age Hold Protection"
-msgstr ""
-
-#: field.acp.copy_number.label:1777
-msgid "Copy Number on Volume"
-msgstr ""
-
-#: field.mbts.last_payment_type.label:174
-#: field.rccbs.last_payment_type.label:2605
-msgid "Last Payment Type"
-msgstr ""
-
-#: class.mgp.label:1651
-msgid "Goods Payment"
-msgstr ""
-
-#: field.rssr.isbn.label:2386 field.rsr.isbn.label:2413
-msgid "ISBN"
-msgstr ""
-
-#: field.circ.checkin_staff.label:1003 field.rodcirc.checkin_staff.label:2668
-msgid "Check In Staff"
-msgstr ""
-
-#: field.mdp.cash_drawer.label:2113
-msgid "Cash Drawer"
-msgstr ""
-
-#: class.asvr.label:291
-msgid "Survey Response"
-msgstr ""
-
-#: field.au.first_given_name.label:673
-msgid "First Name"
-msgstr ""
-
-#: field.acpl.owning_lib.label:1126
-msgid "Owning Org Unit"
-msgstr ""
-
-#: field.au.permissions.label:652
-msgid "All Permissions"
-msgstr ""
-
-#: field.mbts.xact_finish.label:178
-msgid "Transaction Finish Time"
-msgstr ""
-
-#: field.cit.id.label:140
-msgid "Identification ID"
-msgstr ""
-
-#: field.atc.source_send_time.label:279 field.ahtc.source_send_time.label:2171
-#: field.iatc.source_send_time.label:2649
-msgid "Send Date/Time"
-msgstr ""
-
-#: field.clm.value.label:373
-msgid "Language"
-msgstr ""
-
-#: field.acp.price.label:1793
-msgid "Price"
-msgstr ""
-
-#: field.ac.barcode.label:1345 field.acp.barcode.label:1771
-msgid "Barcode"
-msgstr ""
-
-#: field.pgt.id.label:1845
-msgid "Group ID"
-msgstr ""
-
-#: field.mrd.pub_status.label:903
-msgid "Pub Status"
-msgstr ""
-
-#: field.acp.deposit_amount.label:1782
-msgid "Deposit Amount"
-msgstr ""
-
-#: field.rxbt.total.label:2476
-msgid "Total Billing Amount"
-msgstr ""
-
-#: field.circ.xact_finish.label:1024 field.mbt.xact_finish.label:1556
-#: field.rodcirc.xact_finish.label:2689
-msgid "Transaction Finish Date/Time"
-msgstr ""
-
-#: field.rsr.genre.label:2417
-msgid "Genres (normalized)"
-msgstr ""
-
-#: field.aus.name.label:210 field.acpl.name.label:1124
-#: field.asv.name.label:1183 field.aou.name.label:1280
-#: field.asc.name.label:1330 field.actsc.name.label:1360
-#: field.cnct.name.label:1448
-msgid "Name"
-msgstr ""
-
-#: field.circ.opac_renewal.label:1015 field.rodcirc.opac_renewal.label:2680
-msgid "OPAC Renewal"
-msgstr ""
-
-#: field.rccc.item_type.label:2516
-msgid "MARC Type"
-msgstr ""
-
-#: field.bre.edit_date.label:517
-msgid "Last Edit Data/Time"
-msgstr ""
-
-#: field.clm.code.label:372 field.bre.language.label:528
-msgid "Language Code"
-msgstr ""
-
-#: field.pgt.parent.label:1847
-msgid "Parent Group"
-msgstr ""
-
-#: field.circ.xact_start.label:1025 field.rodcirc.xact_start.label:2690
-msgid "Check Out Date/Time"
-msgstr ""
-
-#: field.rxbt.unvoided.label:2474
-msgid "Unvoided Billing Amount"
-msgstr ""
-
-#: field.circ.billable_transaction.label:1029
-#: field.rodcirc.billable_transaction.label:2693
-msgid "Base Transaction"
-msgstr ""
-
-#: field.rccc.patron_home_lib_shortname.label:2525
-msgid "Patron Home Library Short (Policy) Name"
-msgstr ""
-
-#: field.cnct.in_house.label:1447
-msgid "In House?"
-msgstr ""
-
-#: field.rsr.geographic_subject.label:2416
-msgid "Geographic Subjects (normalized)"
-msgstr ""
-
-#: field.au.card.label:663
-msgid "Current Library Card"
-msgstr ""
-
-#: field.atc.target_copy.label:280 field.ahtc.target_copy.label:2172
-#: field.iatc.target_copy.label:2650
-msgid "Transited Copy"
-msgstr ""
-
-#: field.actsce.value.label:1583 field.rsce1.value.label:2557
-#: field.rsce2.value.label:2571
-msgid "Entry Value"
-msgstr ""
-
-#: field.acpn.creator.label:748
-msgid "Note Creator"
-msgstr ""
-
-#: field.aou.holds_address.label:1276
-msgid "Holds Receiving Address"
-msgstr ""
-
-#: field.mfr.record.label:768 field.mrd.record.label:904
-msgid "Bib Record Entry"
-msgstr ""
-
-#: field.rccbs.usr_home_ou.label:2591
-msgid "User Home Library Link"
-msgstr ""
-
-#: field.rccc.dewey_block_tens.label:2533
-msgid "Dewey Block -- Tens"
-msgstr ""
-
-#: field.acp.id.label:1789
-msgid "Copy ID"
-msgstr ""
-
-#: field.au.day_phone.label:667
-msgid "Daytime Phone"
-msgstr ""
-
-#: field.circ.target_copy.label:1022 field.rodcirc.target_copy.label:2687
-msgid "Circulating Item"
-msgstr ""
-
-#: field.ahr.email_notify.label:1227
-msgid "Notify by Email?"
-msgstr ""
-
-#: field.circ.payment_total.label:1032 field.mg.payment_total.label:1525
-#: field.mbt.payment_total.label:1563 field.rodcirc.payment_total.label:2696
-msgid "Payment Totals"
-msgstr ""
-
-#: field.rccc.patron_id.label:2523
-msgid "Patron Link"
-msgstr ""
-
-#: field.mp.goods_payment.label:2034 field.mbp.goods_payment.label:2065
-#: field.mndp.goods_payment.label:2092
-msgid "Goods Payment Detail"
-msgstr ""
-
-#: field.au.notes.label:697
-msgid "User Notes"
-msgstr ""
-
-#: field.asc.id.label:1329 field.actsc.id.label:1359
-msgid "Stat Cat ID"
-msgstr ""
-
-#: field.aus.value.label:212 field.asce.value.label:2151
-msgid "Value"
-msgstr ""
-
-#: field.bre.tcn_source.label:525 field.rssr.tcn_source.label:2380
-#: field.rsr.tcn_source.label:2403
-msgid "TCN Source"
-msgstr ""
-
-#: class.rsce1.label:2550
-msgid "CAT1 Entry"
-msgstr ""
-
-#: field.mrd.enc_level.label:897
-msgid "ELvl"
-msgstr ""
-
-#: field.ahtc.dest.label:2164
-msgid "Destination Library"
-msgstr ""
-
-#: class.aufh.label:1905
-msgid "Unfulfilled Hold Targets"
-msgstr ""
-
-#: field.rccc.dewey_range_hundreds.label:2532
-msgid "Dewey Range -- Hundreds"
-msgstr ""
-
-#: field.rccc.copy_id.label:2510
-msgid "Copy Link"
-msgstr ""
-
-#: field.ahr.selection_ou.label:1242
-msgid "Selection Locus"
-msgstr ""
-
-#: field.rsr.series_statement.label:2411
-msgid "Series Statement (normalized)"
-msgstr ""
-
-#: class.rccbs.label:2578
-msgid "Classic Open Transaction Summary"
-msgstr ""
-
-#: class.cnct.label:1440
-msgid "Non-cataloged Type"
-msgstr ""
-
-#: field.asvq.question.label:153 field.asvr.question.label:300
-#: field.asva.question.label:1865
-msgid "Question"
-msgstr ""
-
-#: field.ahtc.prev_hop.label:2169
-msgid "Previous Stop"
-msgstr ""
-
-#: field.atc.source.label:278 field.iatc.source.label:2648
-msgid "Source"
-msgstr ""
-
-#: class.ahn.label:1099
-msgid "Hold Notification"
-msgstr ""
-
-#: field.rcirct.id.label:2446
-msgid "Circulation ID"
-msgstr ""
-
-#: field.aua.county.label:949
-msgid "County"
-msgstr ""
-
-#: field.rsr.topic_subject.label:2415
-msgid "Topic Subjects (normalized)"
-msgstr ""
-
-#: field.rccbs.barcode.label:2593
-msgid "User Barcode"
-msgstr ""
-
-#: field.au.profile.label:688
-msgid "Main (Profile) Permission Group"
-msgstr ""
-
-#: field.mfr.subfield.label:769
-msgid "Subfield"
-msgstr ""
-
-#: field.acn.creator.label:449 field.acp.creator.label:1779
-msgid "Creating User"
-msgstr ""
-
-#: field.acp.holdable.label:1788
-msgid "Is Holdable"
-msgstr ""
-
-#: field.acn.editor.label:452 field.bre.editor.label:518
-#: field.acp.editor.label:1786
-msgid "Last Editing User"
-msgstr ""
-
-#: field.circ.max_fine.label:1013 field.crmf.amount.label:1832
-#: field.rodcirc.max_fine.label:2678
-msgid "Max Fine Amount"
-msgstr ""
-
-#: field.ahtc.copy_status.label:2163
-msgid "Copy Status at Transit"
-msgstr ""
-
-#: field.ahr.hold_type.label:1232
-msgid "Hold Type"
-msgstr ""
-
-#: field.mrd.bib_level.label:893
-msgid "BLvl"
-msgstr ""
-
-#: field.mp.credit_payment.label:2030 field.mbp.credit_payment.label:2061
-msgid "Credit Payment Detail"
-msgstr ""
-
-#: field.ahr.request_time.label:1239
-msgid "Request Date/Time"
-msgstr ""
-
-#: field.rccbs.xact_finish.label:2597
-msgid "Transaction End Date/Time"
-msgstr ""
-
-#: class.crahp.label:1815
-msgid "Age Hold Protection Rule"
-msgstr ""
-
-#: field.au.hold_requests.label:651
-msgid "All Hold Requests"
-msgstr ""
-
-#: field.au.master_account.label:682
-msgid "Is Group Lead Account"
-msgstr ""
-
-#: field.ahr.frozen.label:1251
-msgid "Currently Frozen"
-msgstr ""
-
-#: field.mfr.value.label:771
-msgid "Normalized Value"
-msgstr ""
-
-#: field.mcrp.accepting_usr.label:1407 field.mwp.accepting_usr.label:1635
-#: field.mgp.accepting_usr.label:1656 field.mckp.accepting_usr.label:1744
-msgid "Accepting Staff Member"
-msgstr ""
-
-#: field.rccc.demographic_general_division.label:2519
-msgid "Patron Age Demographic"
-msgstr ""
-
-#: field.rsr.corporate_subject.label:2419
-msgid "Corporate Name Subjects (normalized)"
-msgstr ""
-
-#: class.rodcirc.label:2662
-msgid "Overdue Circulation"
-msgstr ""
-
-#: field.bre.active.label:513
-msgid "Is Active?"
-msgstr ""
-
-#: field.crahp.prox.label:1823
-msgid "Allowed Proximity"
-msgstr ""
-
-#: field.ahr.fulfillment_time.label:1231
-msgid "Fulfillment Date/Time"
-msgstr ""
-
-#: field.mg.note.label:1517 field.mwp.note.label:1639
-#: field.mgp.note.label:1660 field.mckp.note.label:1750
-#: field.mp.note.label:2023 field.mbp.note.label:2054
-#: field.mndp.note.label:2085 field.mdp.note.label:2108
-#: field.mb.note.label:2193
-msgid "Note"
-msgstr ""
-
-#: field.aua.id.label:950
-msgid "Address ID"
-msgstr ""
-
-#: field.rccbs.patron_county.label:2612
-msgid "User County"
-msgstr ""
-
-#: field.acn.id.label:453
-msgid "Call Number/Volume ID"
-msgstr ""
-
-#: class.asc.label:1323
-msgid "Asset Statistical Category"
-msgstr ""
-
-#: class.au.label:643
-msgid "ILS User"
-msgstr ""
-
-#: class.asvq.label:145
-msgid "User Survey Question"
-msgstr ""
-
-#: field.circ.phone_renewal.label:1016 field.rodcirc.phone_renewal.label:2681
-msgid "Phone Renewal"
-msgstr ""
-
-#: field.mbt.payments.label:1561
-msgid "Payment Line Items"
-msgstr ""
-
-#: field.bre.quality.label:523
-msgid "Overall Quality"
-msgstr ""
-
-#: field.au.active.label:659
-msgid "Active"
-msgstr ""
-
-#: field.au.addresses.label:648
-msgid "All Addresses"
-msgstr ""
-
-#: field.mdp.cash_payment.label:2115
-msgid "Cash Payment"
-msgstr ""
-
-#: field.ahr.fulfillment_lib.label:1229
-msgid "Fulfilling Library"
-msgstr ""
-
-#: field.aua.post_code.label:951
-msgid "Postal Code"
-msgstr ""
-
-#: field.mb.voider.label:2196
-msgid "Voiding Staff Member"
-msgstr ""
-
-#: field.mcrp.note.label:1411
-msgid "Payment Note"
-msgstr ""
-
-#: field.mbts.total_paid.label:176 field.rccbs.total_paid.label:2600
-msgid "Total Paid"
-msgstr ""
-
-#: field.ahtc.transit_copy.label:2173
-msgid "Base Transit"
-msgstr ""
-
-#: field.aufh.fail_time.label:1912
-msgid "Retargeting Date/Time"
-msgstr ""
-
-#: None:725
-msgid "Circulations Performed as Staff"
-msgstr ""
-
-#: field.asvr.id.label:299 field.asva.id.label:1864
-msgid "Answer ID"
-msgstr ""
-
-#: field.mcrp.payment.label:1415 field.mwp.payment.label:1642
-#: field.mgp.payment.label:1663 field.mckp.payment.label:1753
-msgid "Payment link"
-msgstr ""
-
-#: field.aua.city.label:947
-msgid "City"
-msgstr ""
-
-#: field.acpl.holdable.label:1122
-msgid "Is Holdable?"
-msgstr ""
-
-#: field.bre.create_date.label:514 field.au.create_date.label:665
-#: field.circ.create_date.label:1026
-msgid "Record Creation Date/Time"
-msgstr ""
-
-#: field.rccc.item_form.label:2515
-msgid "MARC Form"
-msgstr ""
-
-#: field.rccc.patron_city.label:2527
-msgid "Patron City"
-msgstr ""
-
-#: field.aou.children.label:1274
-msgid "Subordinate Organizational Units"
-msgstr ""
-
-#: field.asva.responses.label:1862
-msgid "Responses using this Answer"
-msgstr ""
-
-#: field.ahr.thaw_date.label:1252
-msgid "Thaw Date (if frozen)"
-msgstr ""
-
-#: class.circ.label:997 field.rccc.id.label:2505
-msgid "Circulation"
-msgstr ""
-
-#: field.asvr.usr.label:303
-msgid "Responding User"
-msgstr ""
-
-#: class.rccc.label:2500
-msgid "Classic Circulation View"
-msgstr ""
-
-#: field.aihu.use_time.label:242 field.ancihu.use_time.label:259
-msgid "Use Date/Time"
-msgstr ""
-
-#: field.aihu.id.label:238 field.ancihu.id.label:255
-msgid "Use ID"
-msgstr ""
-
-#: field.atc.dest_recv_time.label:274 field.ahtc.dest_recv_time.label:2165
-#: field.iatc.dest_recv_time.label:2644
-msgid "Receive Date/Time"
-msgstr ""
-
-#: field.asv.poll.label:1186
-msgid "Poll Style?"
-msgstr ""
-
-#: field.rssr.pubdate.label:2385 field.rsr.pubdate.label:2409
-msgid "Publication Year (normalized)"
-msgstr ""
-
-#: field.cnct.id.label:1446
-msgid "Non-cat Type ID"
-msgstr ""
-
-#: field.asva.answer.label:1863
-msgid "Answer Text"
-msgstr ""
-
-#: field.acpn.owning_copy.label:750
-msgid "Copy"
-msgstr ""
-
-#: field.aout.can_have_vols.label:1462
-msgid "Can Have Volumes?"
-msgstr ""
-
-#: field.bre.id.label:520 field.aufh.id.label:1914 field.rssr.id.label:2377
-#: field.rsr.id.label:2399
-msgid "Record ID"
-msgstr ""
-
-#: class.cam.label:421
-msgid "Audience Map"
-msgstr ""
-
-#: field.au.email.label:669 field.aou.email.label:1284
-msgid "Email Address"
-msgstr ""
-
-#: field.clfm.description.label:1625
-msgid "LitF Description"
-msgstr ""
-
-#: field.au.passwd.label:685
-msgid "Password (obfuscated)"
-msgstr ""
-
-#: field.aihu.item.label:239 class.acp.label:1763
-msgid "Item"
-msgstr ""
-
-#: field.cam.value.label:428
-msgid "Audience"
-msgstr ""
-
-#: field.aout.parent.label:1467
-msgid "Parent Type"
-msgstr ""
-
-#: class.rud.label:2428
-msgid "User Demographics"
-msgstr ""
-
-#: field.atc.prev_hop.label:277 field.iatc.prev_hop.label:2647
-msgid "Previous Hop (unused)"
-msgstr ""
-
-#: field.circ.usr.label:1023 field.ancc.patron.label:1881
-#: field.rodcirc.usr.label:2688
-msgid "Patron"
-msgstr ""
-
-#: class.mcrp.label:1402
-msgid "House Credit Payment"
-msgstr ""
-
-#: field.acp.dummy_author.label:1783
-msgid "Precat Dummy Author"
-msgstr ""
-
-#: field.au.cards.label:649
-msgid "All Library Cards"
-msgstr ""
-
-#: field.rxpt.voided.label:2489
-msgid "Voided (Returned) Paid Amount"
-msgstr ""
-
-#: field.mbts.last_billing_note.label:169
-#: field.rccbs.last_billing_note.label:2608
-msgid "Last Billing Note"
-msgstr ""
-
-#: field.rccbs.billing_location.label:2587
-msgid "Billing Location Link"
-msgstr ""
-
-#: field.mrd.cat_form.label:894
-msgid "Cat Form"
-msgstr ""
-
-#: field.atc.dest.label:273 field.iatc.dest.label:2643
-msgid "Destination"
-msgstr ""
-
-#: field.au.evening_phone.label:670
-msgid "Evening Phone"
-msgstr ""
-
-#: field.au.ident_type.label:676
-msgid "Primary Identification Type"
-msgstr ""
-
-#: class.mndp.label:2078
-msgid "Payments: Non-drawer Staff"
-msgstr ""
-
-#: field.pgt.name.label:1846
-msgid "Group Name"
-msgstr ""
-
-#: field.mckp.xact.label:1752
-msgid "Transaction link"
-msgstr ""
-
-#: class.clm.label:367
-msgid "Language Map"
-msgstr ""
-
-#: field.bre.author_field_entries.label:533
-msgid "Indexed Author Field Entries"
-msgstr ""
-
-#: field.aou.phone.label:1285
-msgid "Phone Number"
-msgstr ""
-
-#: field.acn.create_date.label:448
-msgid "Create Date/Time"
-msgstr ""
-
-#: class.atc.label:267
-msgid "Copy Transit"
-msgstr ""
-
-#: field.au.super_user.label:692
-msgid "Is Super User"
-msgstr ""
-
-#: class.mfr.label:760
-msgid "Flattened MARC Fields"
-msgstr ""
-
-#: field.acp.circ_as_type.label:1773
-msgid "Circulation Type (MARC)"
-msgstr ""
-
-#: field.auoi.staff.label:108
-msgid "Staff Member"
-msgstr ""
-
-#: field.aws.id.label:126
-msgid "Workstation ID"
-msgstr ""
-
-#: class.acpn.label:742
-msgid "Copy Note"
-msgstr ""
-
-#: field.atc.persistant_transfer.label:276
-#: field.iatc.persistant_transfer.label:2646
-msgid "Is Persistent? (unused)"
-msgstr ""
-
-#: field.rccc.patron_zip.label:2528
-msgid "Patron ZIP Code"
-msgstr ""
-
-#: field.ahtc.persistant_transfer.label:2168
-msgid "Is Persistent?"
-msgstr ""
-
-#: field.au.net_access_level.label:683
-msgid "Internet Access Level"
-msgstr ""
-
-#: field.ancc.item_type.label:1880
-msgid "Non-cat Item Type"
-msgstr ""
-
-#: field.rccbs.patron_zip.label:2614
-msgid "User ZIP Code"
-msgstr ""
-
-#: field.mcrp.payment_type.label:1414 field.mwp.payment_type.label:1643
-#: field.mgp.payment_type.label:1664 field.mckp.payment_type.label:1754
-#: field.mp.payment_type.label:2025 field.mbp.payment_type.label:2056
-#: field.mndp.payment_type.label:2087 field.mdp.payment_type.label:2110
-msgid "Payment Type"
-msgstr ""
-
-#: field.mdp.credit_card_payment.label:2116
-msgid "Credit Card Payment"
-msgstr ""
-
-#: field.au.usrgroup.label:693
-msgid "Family Linkage or other Group"
-msgstr ""
-
-#: field.ahn.id.label:1105
-msgid "Notification ID"
-msgstr ""
-
-#: field.rccbs.last_billing_ts.label:2607
-msgid "Last Billing Date/Time"
-msgstr ""
-
-#: field.mcrp.amount_collected.label:1409
-#: field.mwp.amount_collected.label:1637 field.mgp.amount_collected.label:1658
-#: field.mckp.amount_collected.label:1746
-msgid "Amount Collected"
-msgstr ""
-
-#: field.ahr.current_copy.label:1226
-msgid "Currently Targeted Copy"
-msgstr ""
-
-#: field.aout.depth.label:1463
-msgid "Type Depth"
-msgstr ""
-
-#: field.rccc.stat_cat_1_value.label:2535
-msgid "Legacy CAT1 Value"
-msgstr ""
-
-#: class.auoi.label:101
-msgid "User Sharing Opt-in"
-msgstr ""
-
-#: field.rccc.profile_group.label:2518
-msgid "Patron Profile Group"
-msgstr ""
-
-#: field.rccbs.usr_home_ou_shortname.label:2589
-msgid "User Home Library Short (Policy) Name"
-msgstr ""
-
-#: field.au.dob.label:668 field.rud.dob.label:2434
-msgid "Date of Birth"
-msgstr ""
-
-#: field.mckp.cash_drawer.label:1747
-msgid "Workstation link"
-msgstr ""
-
-#: field.aun.title.label:195 field.acpn.title.label:752
-msgid "Note Title"
-msgstr ""
-
-#: field.auoi.id.label:106
-msgid "Opt-in ID"
-msgstr ""
-
-#: field.asvq.answers.label:150
-msgid "Answers"
-msgstr ""
-
-#: field.bre.creator.label:515
-msgid "Record Creator"
-msgstr ""
-
-#: field.acpl.id.label:1123
-msgid "Location ID"
-msgstr ""
-
-#: field.rccc.owning_lib_name.label:2512
-msgid "Owning Library Short (Policy) Name"
-msgstr ""
-
-#: class.ancc.label:1872
-msgid "Non-cataloged Circulation"
-msgstr ""
-
-#: class.asva.label:1857
-msgid "Survey Answer"
-msgstr ""
-
-#: class.mbt.label:1549 field.mp.xact.label:2026 field.mbp.xact.label:2057
-#: field.mndp.xact.label:2088 field.mdp.xact.label:2111
-msgid "Billable Transaction"
-msgstr ""
-
-#: field.rccc.patron_home_lib.label:2524
-msgid "Patron Home Library Link"
-msgstr ""
-
-#: field.aou.parent_ou.label:1282
-msgid "Parent Organizational Unit"
-msgstr ""
-
-#: field.circ.billings.label:1027 field.rodcirc.billings.label:2691
-msgid "Transaction Billings"
-msgstr ""
-
-#: field.au.photo_url.label:686
-msgid "Photo URL"
-msgstr ""
-
-#: class.mp.label:2016
-msgid "Payments: All"
-msgstr ""
-
-#: field.asv.questions.label:1178
-msgid "Questions"
-msgstr ""
-
-#: field.cifm.code.label:437
-msgid "Item Form Code"
-msgstr ""
-
-#: field.clfm.value.label:1626
-msgid "LitF Name"
-msgstr ""
-
-#: field.aun.value.label:197 field.acpn.value.label:753
-msgid "Note Content"
-msgstr ""
-
-#: field.asv.start_date.label:1188
-msgid "Survey Start Date/Time"
-msgstr ""
-
-#: field.au.checkouts.label:650
-msgid "All Circulations"
-msgstr ""
-
-#: field.aws.name.label:127
-msgid "Workstation Name"
-msgstr ""
-
-#: field.mckp.check_number.label:1748
-msgid "Check Number"
-msgstr ""
-
-#: field.rsr.summary.label:2412
-msgid "Summary (normalized)"
-msgstr ""
-
-#: field.au.ident_value.label:678
-msgid "Primary Identification"
-msgstr ""
-
-#: field.ahr.fulfillment_staff.label:1230
-msgid "Fulfilling Staff"
-msgstr ""
-
-#: field.mrd.char_encoding.label:895
-msgid "Character Encoding"
-msgstr ""
-
-#: field.mp.work_payment.label:2032 field.mbp.work_payment.label:2063
-#: field.mndp.work_payment.label:2090
-msgid "Work Payment Detail"
-msgstr ""
-
-#: field.ancc.id.label:1879
-msgid "Non-cat Circulation ID"
-msgstr ""
-
-#: field.auoi.usr.label:109 field.aun.usr.label:196 field.aus.usr.label:211
-#: field.aua.usr.label:955 field.ac.usr.label:1347 field.mg.usr.label:1518
-#: field.mbt.usr.label:1555 field.actscecm.target_usr.label:1945
-msgid "User"
-msgstr ""
-
-#: field.mg.billings.label:1521
-msgid "Billings"
-msgstr ""
-
-#: field.mrd.lit_form.label:902
-msgid "LitF"
-msgstr ""
-
-#: field.rccbs.billing_location_name.label:2586
-msgid "Billing Location Name"
-msgstr ""
-
-#: field.circ.stop_fines.label:1020 field.rodcirc.stop_fines.label:2685
-msgid "Fine Stop Reason"
-msgstr ""
-
-#: field.acp.ref.label:1794
-msgid "Is Reference"
-msgstr ""
-
-#: field.aua.valid.label:956
-msgid "Valid Address?"
-msgstr ""
-
-#: field.acp.status.label:1795
-msgid "Copy Status"
-msgstr ""
-
-#: field.asvq.survey.label:154 field.asvr.survey.label:302
-#: class.asv.label:1173
-msgid "Survey"
-msgstr ""
-
-#: field.mb.id.label:2192
-msgid "Billing ID"
-msgstr ""
-
-#: field.acp.circulations.label:1798
-msgid "Circulations"
-msgstr ""
-
-#: field.aus.id.label:209
-msgid "Setting ID"
-msgstr ""
-
-#: field.au.mailing_address.label:681 field.aou.mailing_address.label:1279
-msgid "Mailing Address"
-msgstr ""
-
-#: field.acn.label.label:454 field.rccc.call_number_label.label:2521
-msgid "Call Number Label"
-msgstr ""
-
-#: field.au.standing_penalties.label:654
-msgid "Standing Penalties"
-msgstr ""
-
-#: field.asv.id.label:1182
-msgid "Survey ID"
-msgstr ""
-
-#: field.bre.metarecord.label:527 field.rsr.metarecord.label:2400
-msgid "Metarecord"
-msgstr ""
-
-#: field.aout.can_have_users.label:1461
-msgid "Can Have Users?"
-msgstr ""
-
-#: field.au.prefix.label:687
-msgid "Prefix"
-msgstr ""
-
-#: field.rccc.patron_county.label:2526
-msgid "Patron County"
-msgstr ""
-
-#: field.actsce.owner.label:1581 field.asce.owner.label:2149
-#: field.rsce1.owner.label:2556 field.rsce2.owner.label:2570
-msgid "Entry Owner"
-msgstr ""
-
-#: field.rccc.circ_modifier.label:2511
-msgid "Circ Modifier"
-msgstr ""
-
-#: field.rsr.series_title.label:2410
-msgid "Series Title (normalized)"
-msgstr ""
-
-#: field.mbt.grocery.label:1558
-msgid "Grocery Billing link"
-msgstr ""
-
-#: field.actscecm.stat_cat_entry.label:1944
-msgid "Entry Text"
-msgstr ""
-
-#: field.aufh.current_copy.label:1911
-msgid "Non-fulfilling Copy"
-msgstr ""
-
-#: field.acp.location.label:1791 field.rccc.shelving_location.label:2517
-msgid "Shelving Location"
-msgstr ""
-
-#: field.aou.id.label:1277
-msgid "Organizational Unit ID"
-msgstr ""
-
-#: field.ahr.pickup_lib.label:1236
-msgid "Pickup Library"
-msgstr ""
-
-#: field.cam.description.label:427 field.asv.description.label:1180
-#: field.pgt.description.label:1844
-msgid "Description"
-msgstr ""
-
-#: field.bre.keyword_field_entries.label:530
-msgid "Indexed Keyword Field Entries"
-msgstr ""
-
-#: field.aufh.circ_lib.label:1910
-msgid "Non-fulfilling Library"
-msgstr ""
-
-#: field.au.home_ou.label:674
-msgid "Home Library"
-msgstr ""
-
-#: field.mbt.circulation.label:1559
-msgid "Circulation Billing link"
-msgstr ""
-
-#: field.atc.copy_status.label:272 field.iatc.copy_status.label:2642
-msgid "Pretransit Copy Status"
-msgstr ""
-
-#: field.crahp.age.label:1820
-msgid "Item Age"
-msgstr ""
-
-#: field.au.standing.label:690
-msgid "Standing (unused)"
-msgstr ""
-
-#: field.rsr.name_subject.label:2418
-msgid "Personal Name Subjects (normalized)"
-msgstr ""
-
-#: field.asv.usr_summary.label:1189
-msgid "Display in User Summary"
-msgstr ""
-
-#: field.ahn.notify_staff.label:1108
-msgid "Notifying Staff"
-msgstr ""
-
-#: field.aua.country.label:948
-msgid "Country"
-msgstr ""
-
-#: field.circ.checkin_time.label:1004 field.rodcirc.checkin_time.label:2669
-msgid "Check In Date/Time"
-msgstr ""
-
-#: field.mg.payments.label:1522
-msgid "Payments"
-msgstr ""
-
-#: field.mbts.last_billing_type.label:171
-#: field.rccbs.last_billing_type.label:2609
-msgid "Last Billing Type"
-msgstr ""
-
-#: field.circ.recuring_fine.label:1017 field.rodcirc.recuring_fine.label:2682
-msgid "Recurring Fine Amount"
-msgstr ""
-
-#: field.asv.end_date.label:1181
-msgid "Survey End Date/Time"
-msgstr ""
-
-#: field.mg.xact_start.label:1520
-msgid "Transaction Start Timestamp"
-msgstr ""
-
-#: field.bre.title_field_entries.label:532
-msgid "Indexed Title Field Entries"
-msgstr ""
-
-#: field.acp.circ_modifier.label:1775
-msgid "Circulation Modifier"
-msgstr ""
-
-#: field.auoi.opt_in_ts.label:111
-msgid "Opt-in Date/Time"
-msgstr ""
-
-#: field.circ.desk_renewal.label:1007 field.rodcirc.desk_renewal.label:2672
-msgid "Desk Renewal"
-msgstr ""
-
-#: field.citm.code.label:1153
-msgid "Item Type Code"
-msgstr ""
-
-#: field.circ.renewal_remaining.label:1019
-#: field.rodcirc.renewal_remaining.label:2684
-msgid "Remaining Renewals"
-msgstr ""
-
-#: field.mb.void_time.label:2194
-msgid "Void Timestamp"
-msgstr ""
-
-#: None:718
-msgid "Billable Transactions"
-msgstr ""
diff --git a/build/i18n/po/hy/opac.dtd.po b/build/i18n/po/hy/opac.dtd.po
new file mode 100644 (file)
index 0000000..bd0a447
--- /dev/null
@@ -0,0 +1,2109 @@
+# extracted from ../../Open-ILS/web/opac/locale/en-US/opac.dtd
+msgid ""
+msgstr ""
+"Project-Id-Version: Evergreen 1.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 11:26-0400\n"
+"PO-Revision-Date: 2007-12-14 12:40-0800\n"
+"Last-Translator: Tigran <tigran@flib.sci.am>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+"X-Accelerator-Marker: &\n"
+
+# =================================================================
+# Some generic stuff
+# =================================================================
+#: lang.version
+msgid "remote v1"
+msgstr "հեռացրու v1"
+
+#: lang.description
+msgid "English"
+msgstr "Անգլերեն"
+
+#: lang.author
+msgid "PINES"
+msgstr "PINES"
+
+#: common.all
+msgid "All"
+msgstr "Լրիվ"
+
+#: common.currency
+msgid "$"
+msgstr "$"
+
+#: common.name
+msgid "Name"
+msgstr "Անուն"
+
+#: common.none
+msgid "None"
+msgstr "Ոչ մեկը"
+
+#: common.title
+msgid "Title"
+msgstr "Վերնագիր"
+
+#: common.author
+msgid "Author"
+msgstr "Հեղինակ"
+
+#: common.authors
+msgid "Authors"
+msgstr "Հեղինակներ"
+
+#: common.callnumber opac.advanced.quick.cn
+msgid "Call Number"
+msgstr "Դասիչ"
+
+#: common.edition
+msgid "Edition"
+msgstr "Հրատարակություն"
+
+#: common.subject
+msgid "Subject"
+msgstr "Խորագիր"
+
+#: common.series
+msgid "Series"
+msgstr "Մատենաշար"
+
+#: common.keyword
+msgid "Keyword"
+msgstr "Վճռորոշ բառ"
+
+#: common.type
+msgid "Search Type"
+msgstr "Փնտրման տեսակ"
+
+#: common.isbn opac.advanced.quick.isbn
+msgid "ISBN"
+msgstr "ISBN"
+
+#: common.format
+msgid "Format"
+msgstr "Ձևաչափ"
+
+# Message displayed while search results are loading
+#: common.loading myopac.fines.status
+msgid "Loading..."
+msgstr "Բեռնավորում..."
+
+#: common.login opac.login.login
+msgid "Login"
+msgstr "Գրանցում"
+
+#: common.logout
+msgid "Log Out"
+msgstr "Հեռանալ"
+
+#: common.physical
+msgid "Physical Description"
+msgstr "Ֆիզիկական նկարագրություն"
+
+#: common.pubdate
+msgid "Publication Date"
+msgstr "Հրատարակման ամսաթիվ"
+
+#: common.publisher
+msgid "Publisher"
+msgstr "Հրատարակիչ"
+
+#: common.results
+msgid "Results"
+msgstr "Արդյունքներ"
+
+#: common.select
+msgid "Select"
+msgstr "Ընտրել"
+
+#: common.status
+msgid "Status"
+msgstr "Կարգավիճակ"
+
+#: common.at
+msgid "at"
+msgstr "at"
+
+#: common.of
+msgid "of"
+msgstr "of"
+
+#: common.no
+msgid "No"
+msgstr "Ոչ"
+
+#: common.yes
+msgid "Yes"
+msgstr "Այո"
+
+#: common.cancel common.org.cancel myopac.holds.cancel
+#: myopac.holds.cancel_selected
+msgid "Cancel"
+msgstr "Չեղյալ անել"
+
+#: common.library rdetail.copyInfo.library
+msgid "Library"
+msgstr "Գրադարան"
+
+#: common.username
+msgid "Username"
+msgstr "Օգտվողի անուն"
+
+#: common.password
+msgid "Password"
+msgstr "Գաղտնաբառ"
+
+#: common.submit
+msgid "Submit"
+msgstr "Հաստատել"
+
+#: common.close
+msgid "close"
+msgstr "փակել"
+
+#: common.and
+msgid "and"
+msgstr "և"
+
+#: common.user_not_found
+msgid "User not found"
+msgstr "Օգտվողը չի գտնվել"
+
+#: opac.advanced.wizard.title opac.navigate.advanced
+msgid "Advanced Search"
+msgstr "Խորացված փնտրում"
+
+#: common.nowSearching
+msgid "Now searching "
+msgstr "Հիմա որոնում է"
+
+#: common.ofAtLeast
+msgid " of at least "
+msgstr "ամենաքիչը"
+
+#: common.relevancy
+msgid "Match Score: "
+msgstr "Հաշվի առ հաշիվը։"
+
+#: common.tips
+msgid "Tips:"
+msgstr "Հնարքներ։"
+
+#: common.tips.tip1
+msgid "Click on a folder icon in the sidebar to access related quick searches"
+msgstr ""
+"Սեղմիր կողային մասում առկա թղթապանակի պատկերիկի վրա առագ փնտրումը հասանելի "
+"դարձնելու համար"
+
+#: common.tips.tip2
+msgid ""
+"If you don't find what you want try expanding your search using the range "
+"selector at the right of the search bar"
+msgstr ""
+"Եթե չես գտնում այն ինչ որ պետք է քեզ, ապա ընդլայնիր որոնումը օգտագործելով "
+"փնտրման ցանկի աջ մասում եղած շղթայական ընտրիչը"
+
+#: common.org.openAll
+msgid "Expand All"
+msgstr "Ընդլայնիր բոլորը"
+
+#: common.org.closeAll
+msgid "Close All"
+msgstr "Փակիր բոլորը"
+
+#: common.org.loading
+msgid "Loading library selector..."
+msgstr "Գրադարանի ընտրիչի բեռնավորում..."
+
+# ==========================================================
+# Tips
+#: common.org.note tips.label
+msgid "Tip:"
+msgstr "Հնարք։"
+
+#: common.org.notetext
+msgid ""
+"Click on a location's name to select it.  Click on the folder icons to "
+"expand a section."
+msgstr ""
+"Ընտրության համար սեղմիր տեղաբաշխման անվան վրա։ Սեղմիր թղթապանակի "
+"պատկերիկների վրա բաժինը ընդլայնելու համար։"
+
+# =================================================================
+# Footer
+#: opac.basic footer.basic
+msgid "Basic Catalog (HTML only)"
+msgstr "Հիմնական քարտարան (միայն HTML)"
+
+#: common.password_criteria
+msgid ""
+"The password must be at least 7 characters in length, \tcontain at least one "
+"letter (a-z/A-Z), \tand contain at least one number."
+msgstr ""
+"Գաղտնաբառը առնվազն պետք է լինի 7 նիշից ոչ պակաս, \tև պարունակի գոնե մեկ տառ "
+"(a-z/A-Z), \tև առնվազն մեկ թիվ։"
+
+#: common.a2z.title
+msgid "Title: A to Z"
+msgstr "Վերնագիր։ Ա մինչև Ֆ"
+
+#: common.z2a.title
+msgid "Title: Z to A"
+msgstr "Վերնագիր։ Ֆ մինչև Ա"
+
+#: common.a2z.author
+msgid "Author: A to Z"
+msgstr "Հեղինակ։ Ա մինչև Ֆ"
+
+#: common.z2a.author
+msgid "Author: Z to A"
+msgstr "Հեղինակ։ Ֆ մինչև Ա "
+
+#: common.new2old.pubdate
+msgid "Date: Newest to Oldest"
+msgstr "Ամսաթիվ։ թարմից դեպի հին"
+
+#: common.old2new.pubdate
+msgid "Date: Oldest to Newest"
+msgstr "Ամսաթիվ։ հնից դեպի թարմ"
+
+#: opac.style.reddish
+msgid "Reddish"
+msgstr "Կարմրավուն"
+
+#: holds.where_am_i
+msgid ""
+"PINES is a statewide system with both patrons and items \tassociated with "
+"over 250 libraries, holds lists are not as simple as \t'first come, first "
+"served' in PINES.  A complex matrix combining \tconsideration of item "
+"ownership, patron home library, and item purchase \tdate determines  "
+"priorities for holds; the list is dynamic, changing \twith every hold "
+"placed.  Therefore, any indication of a place in the \tholds list would be "
+"inaccurate.  The PINES holds system is designed to \tobtain a requested item "
+"in the fastest and most efficient way possible. \tYour PINES library will "
+"contact you when you hold items become \tavailable."
+msgstr ""
+"PINES դա նահանգային համակարգ է, ընթերցողներով և նյութերով \tփոխկապակցված "
+"ավելի քան 250 գրադարաններում, պահումների ցուցակները PINES-ում այդքան էլ պարզ "
+"չեն ինչպես\t'առաջին մուտք առաջին սպասարկված'։  Բարդ մատրիցան որը "
+"կոմբինացնում է \tնյութի պատկանելիության, ընթերցողի հիմնական գրադարանի, և "
+"նյութի պատվերի դիտարկումները \tորքան ամսաթիվը սահմանում է "
+"առաջնայնությունները պահումների համար. ցուցակը դինամիկ է, փոփոխվաղ "
+"\tյուրաքանչյուր տեղադրված պահման հետ։  Հետևաբար, տեղաբաշխման յուրաքանչյուր "
+"ցուցում \tպահման ցուցակում կլինի ոչ ճիշտ։  PINES-ի պահումների համակարգը "
+"նախագծված է \tպահանջվող նյութը հնարավորինս արագ և արդյունավետ կերպով "
+"ստանալու համար։ \tՁեր PINES գրադարանը կկապվի ձեր հետ երբ պահվող նյութերը "
+"կդառնան \tհասանելի։ "
+
+#: holds.advanced_options
+msgid ""
+"If you wish to broaden the scope of your hold to include other \tversions of "
+"this title, select the formats that would be acceptable. \tThe first "
+"available copy will be sent to you."
+msgstr ""
+"Եթե ցանկանում ես ընդլայնել քո պահումների տիրույթը ընդգրկելով \tայս վերնագրի "
+"այլ տարբերակներ, ընտրիր քեզ ընդունելի ձևաչափեր։ \tԱռաջին մատչելի օրինակը "
+"կառաքվի քեզ։ "
+
+# =================================================================
+# Events and Permissions
+# =================================================================
+#: ilsevent.0
+msgid "Operation Succeeded"
+msgstr "Հաջողված գործողություն"
+
+#: ilsevent.1000
+msgid "Login failed.  The username or password entered was incorrect."
+msgstr "Գրանցումը տապալվեց։ մուտք արված պայմանաբառը կամ գաղտնաբառը սխալ են։"
+
+#: ilsevent.1001
+msgid "Login session has timed out or does not exist"
+msgstr "Գրանցման սեսիայի ժամանակը լրացել է կամ գոյություն չունի։"
+
+#: ilsevent.1002
+msgid "User was not found in the database"
+msgstr "Շտեմարանում օգտվողը չի գտնվել։"
+
+#: ilsevent.1200
+msgid "The given username already exists in the database"
+msgstr "Այս ընթերցողը շտեմարանում արդեն գոյություն ունի։"
+
+#: ilsevent.5000
+msgid "Permission Denied"
+msgstr "Թույլատվությունը արգելված է"
+
+#: ilsperm.CREATE_HOLD
+msgid "User is not allowed to create holds for other users at this location"
+msgstr ""
+"Օգտվողը իրավունք չունի այս վայրում ստեղծել պահումներ այլ օգտվողների համար"
+
+# =================================================================
+# common/pages
+# =================================================================
+#: common.cn.loading
+msgid "Loading Callnumber Page..."
+msgstr "Բեռնավորում է դասիչների էջը..."
+
+#: common.cn.browsing
+msgid "You are now browsing"
+msgstr "Դու հիմա դիտում ես"
+
+#: common.cn.previous
+msgid "&lt;&lt; Previous Page"
+msgstr "&lt;&lt; նախորդ էջ"
+
+#: common.cn.shelf rdetail.extras.browser
+msgid "Shelf Browser"
+msgstr "Դարակի դիտակ"
+
+#: common.cn.next
+msgid "Next Page &gt;&gt;"
+msgstr "Հաջորդ էջ &gt;&gt;"
+
+#: common.textsize.title
+msgid "Text Size: "
+msgstr "Տեքստի մեծություն։"
+
+#: common.textsize.regular
+msgid "Regular"
+msgstr "Սովորական"
+
+# Regular / Large
+#: common.textsize.separator
+msgid "/"
+msgstr "/"
+
+#: common.textsize.large
+msgid "Large"
+msgstr "Լայն"
+
+#: home.js.disabled
+msgid ""
+"JavaScript must be enabled in order for you to use the regular Evergreen "
+"Catalog. However, it seems JavaScript is either disabled or not supported by "
+"your browser. To use the regular Evergreen Catalog, enable JavaScript by "
+"changing your browser options, then <a style='color: blue; text-decoration: "
+"underline;' href='/'>try again</a>. <br/><br/>Alternatively, you can use the "
+"basic HTML-only catalog <a style='color: blue; text-decoration: underline;' "
+"href='/opac/extras/slimpac/start.html'>here</a>."
+msgstr ""
+"JavaScript-ը պետք է թույլատրված լինի որպեսզի կարողանաք օգտագործել Evergreen-"
+"ի քարտարանը։ Համենայնդեպս թվում է, որ JavaScript-ը կամ արգելափակված է, կամ "
+"քո դիտակի կողմից չի աջակցվում։ Որպեսզի օգտագործեք Evergreen-ի սովորական "
+"քարտարանը, թույլատրիր JavaScript-ը փոխելով քո դիտակի ընտրանքները, ապա <a "
+"style='color: blue; text-decoration: underline;' href='/'>try again</a>։ <br/"
+"><br/>Այլընտրանքորեն կարող ես օգտագործել հիմնական միայն-HTML քարտարանը՝ <a "
+"style='color: blue; text-decoration: underline;' href='/opac/extras/slimpac/"
+"start.html'>here</a>։"
+
+# =================================================================
+# MyOPAC bookbag page
+# =================================================================
+#: myopac.delete.bookbag
+msgid ""
+"This will remove the selected bookbag and all items contained within the "
+"bookbag. Are you sure you wish to continue?"
+msgstr ""
+"Սա կհեռացնի ընտրված գրքի զամբյուղը և այնտեղ առկա բոլոր նյութերը։ Վստա՞հ ես "
+"որ ուզում ես շարունակել։"
+
+#: myopac.no.bookbags
+msgid "You have not created any bookbags"
+msgstr "Ոչ մի պատվեր չես ստեղծել"
+
+#: myopac.bookbags.title myopac.bookbags
+msgid "My Bookbags"
+msgstr "Իմ գրքերի պայուսակը"
+
+#: myopac.bookbag.items
+msgid "# Items"
+msgstr "# Նյութեր"
+
+#: myopac.bookbag.shared
+msgid "Shared"
+msgstr "Համատեղ"
+
+#: myopac.bookbag.toggle
+msgid "Share / Hide"
+msgstr "Համատեղ / Թաքցնել"
+
+#: myopac.bookbag.delete
+msgid "Delete this bookbag?"
+msgstr "Ջնջե՞լ այս պատվերը"
+
+#: myopac.items
+msgid "Items"
+msgstr "Նյութեր"
+
+#: myopac.view
+msgid "(View)"
+msgstr "(Դիտել)"
+
+#: myopac.atom.feed
+msgid "ATOM Feed"
+msgstr "ATOM Feed"
+
+#: myopac.bookbag.hide
+msgid "Hide"
+msgstr "Թաքցնել"
+
+#: myopac.bookbag.share
+msgid "Share"
+msgstr "Համատեղ"
+
+#: myopac.delete
+msgid "Delete"
+msgstr "Ջնջել"
+
+#: myopac.bookbag.create
+msgid "Create a new Bookbag"
+msgstr "Ստեղծիր նոր պատվեր"
+
+#: myopac.bookbag.naming
+msgid "Enter the name of the new Bookbag: "
+msgstr "Մուտք արա նոր գրքի զամբյուղի անունը։"
+
+#: myopac.bookbag.share
+msgid "Share this Bookbag"
+msgstr "Համատեղիր այս պատվերը"
+
+#: myopac.bookbag.no.items
+msgid "The selected bookbag contains no items..."
+msgstr "Ընտրված պատվերը չի պարունակում ոչ մի նյութ..."
+
+#: myopac.bookbag.remove
+msgid "Remove this item?"
+msgstr "Հեռացնե՞լ այս նյութը"
+
+#: myopac.remove.link
+msgid "remove"
+msgstr "հեռացնել"
+
+#: myopac.publish.text
+msgid ""
+"Sharing a Bookbag means that the contents of the Bookbag will be visible to "
+"others. To see the public view of a shared Bookbag, click the \"View\" link "
+"in the \"Shared\" column of the Bookbag list at the top of this page."
+msgstr ""
+"Պատվերի համատեղում նշանակում է որ պատվերի բովանդակությունը տեսանելի է "
+"ուրիշներին։ Պատվերի հանրային տեսքը դիտելու համար սեղմիր \"Դիտել\" հղումը էջի "
+"վերին մասում գտնվող պատվերի ցուցակի  \"Համատեղ\" սյունակում։"
+
+#: myopac.item.confirm
+msgid "Are you sure you wish to remove this bookbag item?"
+msgstr "Վստա՞հ ես որ ուզում ես հեռացնել պատվերի նյութը։"
+
+#: myopac.publish.confirm
+msgid ""
+"Sharing this bookbag will allow the contents of the bookback to be seen by "
+"others.  Are you sure you wish to share this bookbag?"
+msgstr ""
+"Պատվերի համատեղումը թույլ կտա բոլորին տեսնելու բովանդակությունը։ Վստա՞հ ես "
+"որ ուզում ես համատեղել այս գրքի զամբյուղը։"
+
+#: myopac.unpublish.confirm
+msgid "Are you sure you wish to hide this bookbag?"
+msgstr "Վստա՞հ ես որ ուզում ես թաքցնել գրքի այս զամբյուղը։ "
+
+#: myopac.update.success
+msgid "The Bookbag was successfully updated."
+msgstr "Գրքի զամբյուղը հաջողությամբ թարմացված է։"
+
+#: myopac.updated.success
+msgid "Bookbag successfully updated"
+msgstr "Գրքի զամբյուղը հաջողությամբ թարմացվել է։"
+
+#: myopac.create.warning
+msgid ""
+"Warning: Adding items to a bookbag creates a link between you and the items "
+"in the database.  The contents of the bookbag are NOT publicly viewable "
+"unless the bookbag is shared. However, if you prefer not to have any link "
+"between your patron record and a particular item or items, we suggest that "
+"you do not place said items in a bookbag or that you avoid using bookbags "
+"all together.  Thank you."
+msgstr ""
+"Զգուշացում։ Գրքի զամբյուղում նյութի ավելացումը ստեղծում է կապ քո և շտեմարանի "
+"նյութերի միջև։ Գրքի զամբյուղի բովանդակությունը հանրորեն հասանելի չէ քանի դեռ "
+"այն չի դրվել համատեղ օգտագործման։ Համենայնդեպս, եթե նախընտրում ես չունենալ "
+"ոչ մի հղում ընթերցողի գրառման և որոշակի նյութի կամ նյութերի միջև, առաջարկում "
+"ենք չտեղադրել այդ նյութերը գրքի զամբյուղում կամ խուսափել բոլոր գրքի  "
+"զամբյուղների միաժամանակյա օգտագործումը։ Շնորհակալություն։"
+
+#: myopac.describe.bookbags
+msgid "Bookbags are..."
+msgstr "Գրքի զամբյուղները ..."
+
+# =================================================================
+# MyOPAC Checked Page
+# =================================================================
+#: myopac.checked.out
+msgid "Total items out:"
+msgstr "Դուրս տրավծ նյութերի քանակ"
+
+#: myopac.checked.overdue
+msgid "Total items overdue:"
+msgstr "Ժամկետանց նյութերի քանակ"
+
+#: myopac.checked.renew
+msgid "Renew Selected Items"
+msgstr "Թարմացրու ընտրված նյութերը"
+
+#: myopac.checked.renewing
+msgid "Renewing..."
+msgstr "Թարմացվում է..."
+
+#: myopac.checked.renew.remaining
+msgid "Renewals Remaining"
+msgstr "Մնացող թարմացումներ"
+
+#: myopac.checked.noitems
+msgid "You have no items checked out at this time"
+msgstr "Այս պահին դու չունես դուրս տրված նյութեր "
+
+#: myopac.checked.other.circ
+msgid "Other Circulations"
+msgstr "Այլ տրումներ"
+
+#: myopac.checked.circ.lib
+msgid "Circulating Library"
+msgstr "Սպասարկող գրադարան"
+
+#: myopac.checked.item.type
+msgid "Circulation Type"
+msgstr "Սպասարկման տեսակ"
+
+#: myopac.checked.circ.time
+msgid "Please return by ..."
+msgstr "Խնդրվում է վերադառնալ..."
+
+#: myopac.checked.renew.success
+msgid "item(s) successfully renewed"
+msgstr "հաջողությամբ թարմացված նյութ(եր) "
+
+#: myopac.checked.renew.confirm
+msgid "Are you sure you wish to renew the selected item(s)?"
+msgstr "Արդյո՞ք վսատհ ես որ ցանկանում ես թարմացնել ընտրված նյութ(եր)ը։"
+
+#: myopac.checked.renew.fail
+msgid ""
+"The system is unable to renew the selected item at this time.  This usually "
+"means the item is needed to fulfill a hold.  Please see a librarian for "
+"further help."
+msgstr ""
+"Համակարգը ի վիճակի չէ այս պահին թարմացնելու ընտրված նյութը։ Սա սովորաբար "
+"նշանակում է որ նյութը հարկավոր է պահումը ավարտին հասցնելու համար։ Դիմեք "
+"գրադարանավարին հետագա օգնության համար։  "
+
+#: myopac.checked.renew.fail2
+msgid ""
+"PINES policy prevents the renewal of this item at this time.  Please see a "
+"librarian for further details."
+msgstr ""
+"PINES-ի քաղաքականությունը կանխարգելում է այս պահին այս նյութի թարմացումը։ "
+"Դիմեք գրադարանավարին հետագա օգնության համար։  "
+
+# =================================================================
+# MyOPAC Fines Page
+# =================================================================
+#: myopac.fines.title
+msgid "Summary"
+msgstr "Ընդհանրացում"
+
+#: myopac.fines.owed
+msgid "Total Owed"
+msgstr "Վերցրած ընդհանուր պարտքը"
+
+#: myopac.fines.paid
+msgid "Total Paid"
+msgstr "Վճարված է ընդամենը"
+
+#: myopac.fines.balance
+msgid "Balance Owed"
+msgstr "Ընդհանուր պարտքի բալանսը"
+
+#: myopac.fines.overdue
+msgid "Overdue Materials"
+msgstr "Ժամկետանց նյութեր"
+
+#: myopac.fines.checkout
+msgid "Checkout Date"
+msgstr "Դուրս տրման ամսաթիվ"
+
+#: myopac.fines.due rdetail.cn.due
+msgid "Due Date"
+msgstr "Վերադարձի ամսաթիվ"
+
+#: myopac.fines.returned
+msgid "Date Returned"
+msgstr "Իրական վերադարձի ամսաթիվ"
+
+#: myopac.fines.accruing
+msgid "(fines accruing)"
+msgstr "(կուտակային տուգանքներ)"
+
+#: myopac.fines.other
+msgid "Other Fees"
+msgstr "Այլ գումարներ"
+
+#: myopac.fines.time.start
+msgid "Transaction Start Time"
+msgstr "Տրանզակցիայի սկզբանվորման ժամ"
+
+#: myopac.fines.time.paid
+msgid "Last Payment Time"
+msgstr "Վերջին վճարման ժամ"
+
+#: myopac.fines.owed.initial
+msgid "Initial Amount Owed"
+msgstr "Սկզբնական պարտքի գումարը"
+
+#: myopac.fines.paid.amount
+msgid "Total Amount Paid"
+msgstr "Ընդհանուր վճարված գումար"
+
+#: myopac.fines.type
+msgid "Billing Type"
+msgstr "Հայցի տեսակ"
+
+# =================================================================
+# MyOPAC Holds Page
+# =================================================================
+#: myopac.holds.formats
+msgid "Formats"
+msgstr "Ձևաչափեր"
+
+#: myopac.holds.location
+msgid "Pickup Location"
+msgstr "Վերցնելու վայր"
+
+#: myopac.holds.edit
+msgid "Edit"
+msgstr "Խմբագրել"
+
+#: myopac.holds.status.none
+msgid "You have no items on hold at this time"
+msgstr "Այս պահին դու չունես պահված նյութեր "
+
+#: myopac.holds.status.waiting
+msgid "Waiting for copy"
+msgstr "Սպասում է պատճեին"
+
+#: myopac.holds.status.intransit
+msgid "In Transit"
+msgstr "Փոխանցման մեջ"
+
+#: myopac.holds.status.available
+msgid "Ready for Pickup"
+msgstr "Վերցնելու համար պատրաստ է"
+
+#: myopac.holds.verify
+msgid ""
+"If you wish to cancel the selected hold, click OK, otherwise click Cancel."
+msgstr ""
+"Եթե ցանկանում ես չեղյալ անել ընտրված պահումը, սեղմիր OK, հակառակ դեպքում "
+"սեղմիր Cancel:"
+
+#: myopac.holds.freeze_selected
+msgid "Freeze"
+msgstr "Սառեցրու"
+
+#: myopac.holds.thaw_selected
+msgid "Un-freeze"
+msgstr "Ապասառեցրու"
+
+#: myopac.holds.thaw_date_selected
+msgid "Set Un-freeze date"
+msgstr "Դիր ապասառեցման ամսաթիվը"
+
+#: myopac.holds.processing
+msgid "Processing holds... This may take a moment."
+msgstr "Պահումների իրականացում...Կտևի ինչ որ ժամանակ։"
+
+#: myopac.holds.actions
+msgid "Actions for selected holds"
+msgstr "Գործողություններ ընտրված պահումների համար"
+
+#: myopac.holds.cancel.confirm
+msgid "Are you sure you wish to cancel the selected holds?"
+msgstr "Վստա՞հ ես որ ուզում ես չեղյալ անել ընտրված պահումները։"
+
+#: myopac.holds.freeze.confirm
+msgid ""
+"Are you sure you wish to freeze the selected holds? Note that if an item has "
+"already been selected to fulfill the hold, it will not be frozen"
+msgstr ""
+"Վստա՞հ ես որ ուզում ես սառեցնել ընտրված պահումները։ Նկատի ունեցիր, որ եթե "
+"նյութը արդեն իսկ ընտրված է պահման նպատակով, այն չի սառեցվի։"
+
+#: myopac.holds.thaw.confirm
+msgid "Are you sure you wish to un-freeze the selected holds?"
+msgstr "Վստա՞հ ես որ ուզում ես ապասառեցնել ընտրված պահումները։"
+
+#: myopac.holds.thaw_date.confirm
+msgid ""
+"Are you sure you wish to change the un-freeze date for the selected holds?"
+msgstr ""
+"Վստա՞հ ես որ ուզում ես ընտրված պահումների համար փոխել ապասառեցման ամսաթիվը։"
+
+#: myopac.holds.freeze.select_thaw
+msgid ""
+"Select an 'Un-Freeze' date.  This is the date at which the holds will become "
+"active again. If no date is chosen, the holds will remain frozen until they "
+"are manually un-frozen."
+msgstr ""
+"Ընտրիր Ապասառեցման ամսաթիվը։ Սա այն ամսաթիվն է, որից հետո պահումները նորից "
+"ակտիվ կդառնան։ Եթե ամսաթիվ ընտրված չէ, պահումները կմնան սառեցված քանի դեռ "
+"ձեռքով չեն ապասառեցվել։"
+
+#: opac.holds.freeze
+msgid "Freeze this hold"
+msgstr "Սառեցրու այս պահումը"
+
+#: opac.holds.freeze.help
+msgid ""
+"A 'frozen' will retain its place in the queue, but will not be fulfilled "
+"until it has been unfrozen."
+msgstr ""
+"'Սառեցվածը' կպահպանի իր տեղը հերթում, բայց չի կատարվի քանի դեռ չի "
+"ապասառեցվել։"
+
+#: opac.holds.freeze.thaw_date
+msgid "Automatically un-freeze hold on:"
+msgstr "Ավտոմատ ապասառեցրու պահումը"
+
+#: opac.holds.freeze.thaw_date.format
+msgid "YYYY-MM-DD"
+msgstr "ՏՏՏՏ-ԱԱ-ՕՕ"
+
+# =================================================================
+# MyOPAC Preferences Page
+# =================================================================
+#: myopac.prefs.title
+msgid "Preferences"
+msgstr "Նախապատվություններ"
+
+#: myopac.prefs.hits
+msgid "Search hits per page"
+msgstr "Հաշվիր հարվածները ըստ էջի"
+
+#: myopac.prefs.font
+msgid "Default Font Size"
+msgstr "Լռակյաց տառատեսակի չափ"
+
+#: myopac.prefs.font.regular
+msgid "Regular Font"
+msgstr "Սովորական տառատեսակ"
+
+#: myopac.prefs.font.large
+msgid "Large Font"
+msgstr "Լայն տառատեսակ"
+
+#: myopac.prefs.holds.notify
+msgid "Default Hold Notification Method"
+msgstr "Լռակյաց պահման հիշեցման մեթոդ"
+
+#: myopac.prefs.holds.both
+msgid "Use Phone and Email"
+msgstr "Օգտագործիր հեռախոս կամ էլ փոստ"
+
+#: myopac.prefs.holds.phone
+msgid "Use Phone Only"
+msgstr "Օգտագործիր միայն հեռախոս"
+
+#: myopac.prefs.holds.email
+msgid "Use Email Only"
+msgstr "Օգտագործիր միայն էլ փոստ"
+
+#: myopac.prefs.search.location
+msgid "Default Search Location"
+msgstr "Որոնման լռակյաց տեղաբաշխում"
+
+#: myopac.prefs.search.home
+msgid "Always search my home library by default."
+msgstr "Որպես լռակյաց միշտ որոնիր իմ տնային գրադարանում"
+
+#: myopac.prefs.search.range
+msgid "Default Search Range"
+msgstr "Որոնման լռակյաց տիրույթ"
+
+#: myopac.prefs.save
+msgid "Save Preference Changes"
+msgstr "Հիշիր նախապատվության փոփոխությունները"
+
+#: myopac.prefs.save.success
+msgid "Preferences successfully updated"
+msgstr "Նախապատվությունները հաջողությամբ թարմացվել են։"
+
+#: myopac.prefs.save.failed
+msgid "Preferences update failed!"
+msgstr "Նախապատվությունների թարմացումը տապալվեց։"
+
+#: myopac.prefs.help
+msgid ""
+"This setting defines how you will be notified of holds that are ready to be "
+"picked up from the library. By default, holds will use the notification "
+"style you choose here. However, you will still have the option to change "
+"individual holds regardless of this setting."
+msgstr ""
+"Այս կարգաբերումները սահմանում են թե ինչպես կզգուշացվես պահումների մասին "
+"որոնք պատրաստ են վերցվելու գրադարանից։ Որպես լռակյաց, պահումները կօգտագործեն "
+"հիշեցումների այն ձևը, որը կընտրես այստեղ։ Համենայնդեպս, դու դեռ ունես "
+"ընտրության հնարավորություն` փոփոխելու անհատական պահումները։ "
+
+#: myopac.holds.unfrozen
+msgid "Un-Frozen"
+msgstr "Ապասառեցված է։"
+
+#: myopac.holds.frozen.until
+msgid "Frozen Until"
+msgstr "Սառեցված է մինչ"
+
+# =================================================================
+# MyOPAC Summary page
+# =================================================================
+#: myopac.summary.expired
+msgid ""
+"Your account expired on <span id='myopac.expired.date'/>! Please see a "
+"librarian to renew your account."
+msgstr ""
+"Քո հաշիվը ժամկետանց է դառնում <span id='myopac.expired.date'/>։ Դիմիր "
+"գրադարանավարին թարմացնելու քո հաշիվը։"
+
+#: myopac.summary.notes
+msgid "* Staff Notes *"
+msgstr "* Աշխատակազմի նշումներ *"
+
+#: myopac.summary.phone.day
+msgid "Day Phone"
+msgstr "Ցերեկային հեռախոս"
+
+#: myopac.summary.phone.evening
+msgid "Evening Phone"
+msgstr "Գիշերային հեռախոս"
+
+#: myopac.summary.phone.other
+msgid "Other Phone"
+msgstr "Այլ հեռախոս"
+
+#: myopac.summary.change
+msgid "Change"
+msgstr "Փոփոխություն"
+
+#: myopac.summary.username.enter
+msgid "Enter new username:"
+msgstr "Մուտք արա նոր օգտվողի անուն։"
+
+#: myopac.summary.password.text
+msgid "(not shown)"
+msgstr "(չի ցուցադրվում)"
+
+#: myopac.summary.password.current
+msgid "Enter current password:"
+msgstr "Մուտք արա ընթացիկ գաղտնաբառը։"
+
+#: myopac.summary.password.new
+msgid "Enter new password:"
+msgstr "Մուտք արա նոր գաղտնաբառը։"
+
+#: myopac.summary.password.reenter
+msgid "Re-enter new password:"
+msgstr "Նորից մուտք արա նոր գաղտնաբառը։"
+
+#: myopac.summary.email
+msgid "Email Address"
+msgstr "էլ փոստի հասցե"
+
+#: myopac.summary.email.new
+msgid "Enter new email address:"
+msgstr "Մուտք արա նոր էլ փոստի հասցե։"
+
+#: myopac.summary.id.primary
+msgid "Primary Identification"
+msgstr "Սկզբնական ճանաչում"
+
+#: myopac.summary.barcode
+msgid "Active Barcode"
+msgstr "Ակտիվ շտրիխ կոդ"
+
+#: myopac.summary.home
+msgid "Home Library"
+msgstr "Տնային գրադարան"
+
+#: myopac.summary.genesis
+msgid "Account Creation Date"
+msgstr "Հաշվի ստեղծման ամսաթիվ"
+
+#: myopac.summary.addresses
+msgid "Addresses"
+msgstr "Հասցեներ"
+
+#: myopac.summary.address.type
+msgid "Address Type"
+msgstr "Հասցեի տեսակ"
+
+#: myopac.summary.address.street
+msgid "Street"
+msgstr "Փողոց"
+
+#: myopac.summary.address.city
+msgid "City"
+msgstr "Քաղաք"
+
+#: myopac.summary.address.county
+msgid "County"
+msgstr "Համայնք"
+
+#: myopac.summary.address.state
+msgid "State"
+msgstr "Նահանգ"
+
+#: myopac.summary.address.zip
+msgid "Zip"
+msgstr "Զիպ"
+
+#: myopac.summary.username.error
+msgid "Please enter a username"
+msgstr "Մուտք արա օգտվողի անուն"
+
+#: myopac.summary.username.dup
+msgid ""
+"The requested username is not available.  Please choose a different username."
+msgstr "Պահանջվող օգտվողi անունը մատչելի չէ։ Ընտրիր օգտվողի այլ անուն։"
+
+#: myopac.summary.username.success
+msgid "Username successfully updated"
+msgstr "Օգտվողի անունը հաջողությամբ թարմացվել է։"
+
+#: myopac.summary.username.failure
+msgid "Username update failed"
+msgstr "Օգտվողի անվան թարմացումը ձախողվեց։"
+
+#: myopac.summary.username.invalid
+#, fuzzy
+msgid "Username cannot contain spaces or have the same format as a barcode"
+msgstr "Օգտվողի անունը չի կարող պարունակել բացատներ։"
+
+#: myopac.summary.email.error
+msgid "Please enter a valid email address"
+msgstr "Մուտք արա իրական էլ փոստի հասցե"
+
+#: myopac.summary.email.success
+msgid "Email address successfully updated"
+msgstr "էլ փոստի հասցեն հաջողությամբ թարմացվել է։"
+
+#: myopac.summary.email.failed
+msgid "Email address update failed"
+msgstr "Էլ փոստի հասցեի թարմացումը չստացվեց։"
+
+#: myopac.summary.password.error
+msgid "Passwords are empty or do not match"
+msgstr "Գաղտնաբառերը դատարկ են կամ չեն համընկնում։ "
+
+#: myopac.summary.password.success login.password.success
+msgid "Password successfully updated"
+msgstr "Գաղտնաբառը հաջողությամբ թարմացվել է։"
+
+#: myopac.summary.password.failure
+msgid "Password update failed"
+msgstr "Գաղտնաբառի թարմացումը տապալվեց։"
+
+# =================================================================
+# Advanced Search Page
+# =================================================================
+#: opac.advanced.wizard.contains
+msgid "Selected field contains the following words"
+msgstr "Ընտրված դաշտը պարունակում է հետևյալ բառերը։"
+
+#: opac.advanced.wizard.nocontains
+msgid "Selected field does <u>not</u> contain the following words"
+msgstr "Ընտրված դաշտը <u>չի</u> պարունակում հետևյալ բառերը"
+
+#: opac.advanced.wizard.exact
+msgid "Selected field contains the <u>exact</u> phrase"
+msgstr "Ընտրված դաշտը <u>ճշգրտորեն</u> պարունակում է արտահայտություն"
+
+#: opac.advanced.refined.title
+msgid "Refined Advanced Search"
+msgstr "Մաքրված խորացված փնտրում"
+
+#: opac.advanced.refined.title_contains
+msgid "Title contains the following words"
+msgstr "Վերնագիրը պարունակում է հետևյալ բառերը"
+
+#: opac.advanced.refined.author_contains
+msgid "Author contains the following words"
+msgstr "Հեղինակը պարունակում է հետևյալ բառերը"
+
+#: opac.advanced.refined.subject_contains
+msgid "Subject contains the following words"
+msgstr "Խորագիրը պարունակում է հետևյալ բառերը"
+
+#: opac.advanced.refined.series_contains
+msgid "Series contains the following words"
+msgstr "Մատենաշարը պարունակում է հետևյալ բառերը"
+
+#: opac.advanced.refined.contains
+msgid "Contains"
+msgstr "Պարունակում է"
+
+#: opac.advanced.refined.nocontains
+msgid "Does not contain"
+msgstr "Չի պարունակում"
+
+#: opac.advanced.refined.exact
+msgid "Matches Exactly"
+msgstr "Ճշգրիտ համընկնում"
+
+#: opac.advanced.marc.warning
+msgid "For Librarians"
+msgstr "Գրադարանավարների համար"
+
+# ==========================================================
+# MARC expert search
+#: opac.advanced.marc.title search.marc
+msgid "MARC Expert Search"
+msgstr "MARC արհեստավարժ որոնում"
+
+#: opac.advanced.marc.tag
+msgid "MARC Tag"
+msgstr "MARC ցուցիչ"
+
+#: opac.advanced.marc.ind1
+msgid "Indicator 1"
+msgstr "Ցուցիչ 1"
+
+#: opac.advanced.marc.ind2
+msgid "Indicator 2"
+msgstr "Ցուցիչ 2"
+
+#: opac.advanced.marc.subfield
+msgid "Subfield"
+msgstr "Ենթադաշտ"
+
+#: opac.advanced.marc.value
+msgid "Value"
+msgstr "Արժեք"
+
+#: opac.advanced.marc.addrow
+msgid "Add a new row"
+msgstr "Ավելացրու նոր տող"
+
+#: opac.advanced.quick.title sidebar.quick.search
+msgid "Quick Search"
+msgstr "Արագ փնտրում"
+
+#: opac.advanced.quick.issn
+msgid "ISSN"
+msgstr "ISSN"
+
+#: opac.advanced.quick.lccn
+msgid "LCCN"
+msgstr "LCCN"
+
+# title control number
+#: opac.advanced.quick.tcn
+msgid "TCN"
+msgstr "TCN"
+
+#: opac.advanced.quick.barcode
+msgid "Item Barcode"
+msgstr "Նյութի շտրիխ կոդ"
+
+#: search.marc.tag
+msgid "Tag:"
+msgstr "Ցուցիչ։"
+
+#: search.marc.subfield
+msgid "Subfield:"
+msgstr "Ենթադաշտ։"
+
+#: search.marc.value
+msgid "Value:"
+msgstr "Արժեք։"
+
+#: search.marc.add.row
+msgid "Add Row"
+msgstr "Ավելացրու տող"
+
+# ==========================================================
+# Status bar
+# ==========================================================
+#: status.results
+msgid "Including results for"
+msgstr "Ներառելով արդյունքները համար"
+
+# =================================================================
+# More generic stuff
+# =================================================================
+#: opac.session_expiring
+msgid "Your login session will timeout in 1 minute unless there is activity."
+msgstr "Քո գրանցված սեսիան կլրանա մեկ րոպեից, եթե ակտիվություն չլինի։"
+
+#: opac.session_expired
+msgid "Your login session has expired"
+msgstr "Քո գրանցված սեսիան ավարտվեց"
+
+#: navigate.home
+msgid "Home"
+msgstr "Տուն"
+
+#: navigate.home.title
+msgid "Go to the Home page"
+msgstr "Գնա տնային էջ"
+
+#: opac.navigate.advanced.title
+msgid "Go to the Advanced Search Page"
+msgstr "Գնա խորացված որոնման էջ"
+
+#: navigate.myopac opac.navigate.myopac
+msgid "My Account"
+msgstr "Իմ հաշիվը"
+
+#: navigate.myopac.title
+msgid "Go to My OPAC"
+msgstr "Գնա իմ ՀՕԱՔ"
+
+#: navigate.login
+msgid "Log in"
+msgstr "Գրանցվիր"
+
+#: navigate.login.title
+msgid "Log in for personalized features"
+msgstr "Գրանցվիր անհատականացված հնարավորությունների համար"
+
+#: navigate.logout navigate.logout.title
+msgid "Log out"
+msgstr "Դուրս արի"
+
+#: opac.navigate.selectNewOrg
+msgid "Choose a different library"
+msgstr "Ընտրիր այլ գրադարան"
+
+#: opac.navigate.selectOrg library.select.help
+msgid "Choose a library to search"
+msgstr "Ընտրիր փնտրման համար գրադարանը"
+
+#: navigate.loggedinas
+msgid "You are logged in as "
+msgstr "Դու գրանցված ես որպես"
+
+#: navigate.loggedinas.title
+msgid "Logged in as..."
+msgstr "Գրանցված որպես..."
+
+#: navigate.titleGroupResults
+msgid "My Search Results"
+msgstr "Իմ փնտրման արդյունքները"
+
+#: navigate.titleResults
+msgid "My Title Results"
+msgstr "Իմ վերնագրի արդյունքները"
+
+#: navigate.title.details
+msgid "My Title Details"
+msgstr "Իմ վերնագրի մանրամասները"
+
+#: navigate.record.details
+msgid "Record Details"
+msgstr "Գրառման մանրամասներ"
+
+#: footer.find.library
+msgid "Find a Library Near Me"
+msgstr "Գտիր ինձ մոտիկ գրադարան"
+
+#: footer.find.url
+msgid "http://www.georgialibraries.org/lib/directories/pineslibdir.html"
+msgstr "http://www.georgialibraries.org/lib/directories/pineslibdir.html"
+
+#: footer.help.url
+msgid "http://open-ils.org/dokuwiki/doku.php?id=evergreen-user:opac_help"
+msgstr "http://open-ils.org/dokuwiki/doku.php?id=evergreen-user:opac_help"
+
+#: footer.help
+msgid "Help"
+msgstr "Օգնություն"
+
+#: footer.library.url
+msgid "http://www.georgialibraries.org/public/pines.html"
+msgstr "http://www.georgialibraries.org/public/pines.html"
+
+#: footer.library.about
+msgid "About PINES"
+msgstr " PINES-ի մասին"
+
+#: footer.union.url
+msgid "http://www.galileo.usg.edu/"
+msgstr "http://www.galileo.usg.edu/"
+
+#: footer.union
+msgid "GALILEO"
+msgstr "GALILEO"
+
+#: footer.copyright
+msgid "Copyright &#xA9; 2006 Georgia Public Library Service"
+msgstr ""
+"Հեղինակային իրավունք &#xA9; 2006 Գեորգիա նահանգի հանրային գրադարանի "
+"ծառայություն"
+
+# Introduces the logo for the project
+#: footer.logo
+msgid "Powered by"
+msgstr "Ուժեղացված"
+
+# =================================================================
+# My OPAC
+# =================================================================
+#: myopac.account
+msgid "Account Summary"
+msgstr "Հաշվի համառոտագրություն"
+
+#: myopac.checkouts
+msgid "Items Checked Out"
+msgstr "Դուրս տրված նյութեր"
+
+#: myopac.holds
+msgid "Items on Hold"
+msgstr "Պահված նյութեր"
+
+#: myopac.fines
+msgid "Fines"
+msgstr "Տուգանքներ"
+
+#: myopac.preferences
+msgid "Account Preferences"
+msgstr "Հաշվի նախապատվություններ"
+
+# =================================================================
+# Sidebar
+# =================================================================
+#: sidebar.relevantSubjects.headerLabel
+msgid "Relevant Subjects"
+msgstr "Համապատասխան խորագրեր"
+
+#: sidebar.relevantAuthors.headerLabel
+msgid "Relevant Authors"
+msgstr "Համապատասխան հեղինակներ"
+
+#: sidebar.relevantSeries.headerLabel
+msgid "Relevant Series"
+msgstr "Համապատասխան մատենաշարեր"
+
+#: sidebar.relevantReviews.headerLabel rdetail.extras.reviews
+msgid "Reviews"
+msgstr "Գրախոսություններ"
+
+#: sidebar.copy.not.found
+msgid "No copy with the requested barcode was found"
+msgstr "Պահանջվող շտրիխ կոդով պատճեներ չեն գտնվել"
+
+# =================================================================
+# Search formats
+# =================================================================
+#: opac.search.books
+msgid "Books"
+msgstr "Գրքեր"
+
+#: opac.search.allFormats
+msgid "All Formats"
+msgstr "Բոլոր ձևաչափերը"
+
+#: opac.search.largePrint
+msgid "Large Print Books"
+msgstr "Մեծ տպագիր գրքեր"
+
+#: opac.search.audioBooks
+msgid "Audiobooks"
+msgstr "Ձայնագրքեր"
+
+#: opac.search.videoRecordings
+msgid "Video Recordings"
+msgstr "Տեսագրառումներ"
+
+#: opac.search.music
+msgid "Music"
+msgstr "Երաժշտություն"
+
+#: opac.search.electronic
+msgid "Electronic Resources"
+msgstr "Էլեկտրոնային պաշարներ"
+
+#: opac.search.nowSearching
+msgid "Now Searching"
+msgstr "Հիմա փնտրում է"
+
+# =================================================================
+# Page Titles
+# =================================================================
+#: opac.title.home
+msgid "Evergreen Home"
+msgstr "Evergreen տուն"
+
+#: opac.title.mresult
+msgid "Evergreen Title Groups"
+msgstr "Evergreen վերնագրերի խումբ"
+
+#: opac.title.rresult
+msgid "Evergreen Titles"
+msgstr "Evergreen վերնագրեր"
+
+#: opac.title.myopac
+msgid "Evergreen My Account"
+msgstr "Evergreen իմ հաշիվ"
+
+#: opac.title.rdetail
+msgid "Evergreen Title Details"
+msgstr "Evergreen վերնագրի մանրամասներ"
+
+#: opac.title.advanced
+msgid "Evergreen Advanced Search"
+msgstr "Evergreen խորացված որոնում"
+
+#: opac.title.reqitems
+msgid "Evergreen Request Items"
+msgstr "Evergreen պատվիրված նյութեր"
+
+#: opac.title.cnbrowse
+msgid "Evergreen Call Number Browse"
+msgstr "Evergreen դասիչի դիտում"
+
+#: opac.holds.forMe
+msgid "Place this hold for myself"
+msgstr "Տեղադրիր այս պահումը իմ փոխարեն"
+
+#: opac.holds.xulRecipient
+msgid "Enter recipient barcode"
+msgstr "Մուտք արա ստացողի շտրիխ կոդը"
+
+#: opac.holds.recipient
+msgid "Recipient"
+msgstr "Ստացող"
+
+#: opac.holds.placeHold
+msgid "Place Hold"
+msgstr "Տեղադրիր պահումը"
+
+#: opac.holds.contactPhone
+msgid "Contact telephone number"
+msgstr "Կապի հեռախոսի համար"
+
+#: opac.holds.contactEmail
+msgid "Contact email address"
+msgstr "Կապի էլ փոստի հասցե"
+
+#: opac.holds.pickupLocation
+msgid "Pickup location"
+msgstr "Վերցնելու վայր"
+
+#: opac.holds.success
+msgid "Hold was successfully placed"
+msgstr "Պահումը հաջողությամբ տեղաբաշխված է"
+
+#: opac.holds.failure
+msgid "Hold was not successfully placed"
+msgstr "Պահումը անհաջող է տեղաբաշխվել"
+
+# =================================================================
+# Advanced
+# =================================================================
+#: advanced.search.title
+msgid "Search Input"
+msgstr "Փնտրման մուտք"
+
+#: advanced.add.row
+msgid "Add Search Row"
+msgstr "Ավելացրու որոնման տող"
+
+#: advanced.search.submit
+msgid "Submit Search"
+msgstr "Սկսիր փնտրումը"
+
+#: advanced.search.filters
+msgid "Search Filters"
+msgstr "Փնտրման զտիչներ"
+
+#: advanced.item.form
+msgid "Item Form"
+msgstr "Նյութի կաղապար"
+
+#: advanced.item.type
+msgid "Item Type"
+msgstr "Նյութի տեսակ"
+
+#: advanced.link
+msgid "Advanced"
+msgstr "Խորացված"
+
+#: advanced.basic.link
+msgid "Basic"
+msgstr "Հիմնական"
+
+#: advanced.literary.form
+msgid "Literary&nbsp;Form"
+msgstr "Գրական&nbsp;Կաղապար"
+
+#: advanced.non.fiction
+msgid "Non Fiction"
+msgstr "Ոչ գեղարվեստական"
+
+#: advanced.fiction
+msgid "Fiction"
+msgstr "Գեղարվեստական"
+
+#: advanced.language
+msgid "Language"
+msgstr "Լեզու"
+
+#: advanced.audience
+msgid "Audience"
+msgstr "Լսարան"
+
+#: advanced.adult
+msgid "Adult"
+msgstr "Մեծահասակ"
+
+#: advanced.juvenile
+msgid "Juvenile"
+msgstr "Պատանեկան"
+
+#: advanced.general
+msgid "General"
+msgstr "Ընդհանուր"
+
+#: advanced.sort.criteria
+msgid "Sort Criteria"
+msgstr "Տեսակավորման չափանիշ"
+
+#: advanced.search.library
+msgid "Search Library"
+msgstr "Որոնիր գրադարանը"
+
+#: advanced.relevance
+msgid "Relevance"
+msgstr "Համարժեք"
+
+#: advanced.pubdate
+msgid "Publication date"
+msgstr "Հրատարակման տարեթիվ"
+
+#: advanced.sort.asc
+msgid "Ascending / A to Z"
+msgstr "Աճող / Ա դեպի Ֆ"
+
+#: advanced.sort.desc
+msgid "Descending / Z to A"
+msgstr "Նվազող / Ֆ դեպի Ա"
+
+#: advanced.frbrize
+msgid "Group Formats and Editions"
+msgstr "Խմբային ձևաչափեր և հրատարակություններ"
+
+#: advanced.go
+msgid "Go"
+msgstr "Գնա"
+
+# =================================================================
+# Rdetail
+# =================================================================
+#: rdetail.print
+msgid "print these details"
+msgstr "տպիր այս մանրամասները"
+
+#: rdetail.cn.barcode
+msgid "Barcode"
+msgstr "Շտրիխ կոդ"
+
+#: rdetail.cn.location
+msgid "Location"
+msgstr "Տեղաբաշխում"
+
+#: rdetail.cn.hold.age
+msgid "Age Hold Protection"
+msgstr "տարիքի պահման պաշտպանություն"
+
+#: rdetail.cn.genesis
+msgid "Create Date"
+msgstr "Ստեղծիր ամսաթիվ"
+
+#: rdetail.cn.holdable
+msgid "Holdable"
+msgstr "Պահվող"
+
+#: rdetail.cn.more
+msgid "more info..."
+msgstr "ավելի տեղեկատվություն..."
+
+#: rdetail.cn.less
+msgid "less info"
+msgstr "պակաս տեղեկատվություն"
+
+#: rdetail.cn.hold rdetail.copyInfo.hold
+msgid "place hold"
+msgstr "տեղադրիր պահումը"
+
+#: rdetail.cn.disabled
+msgid "- Disabled -"
+msgstr "- Արգելափակված -"
+
+#: rdetail.cn.note
+msgid "Copy Note"
+msgstr "Նմուշի նշում"
+
+#: rdetail.cn.category
+msgid "Copy Category"
+msgstr "Նմուշի դաս"
+
+#: rdetail.cn.print
+msgid "Print Page"
+msgstr "Տպած էջ"
+
+#: rdetail.page.results
+msgid "First results page"
+msgstr "Առաջին արդյունքների էջ"
+
+# Result # &common.of; #
+#: rdetail.result
+msgid "Result"
+msgstr "Արդյունք"
+
+#: rdetail.start
+msgid "Start"
+msgstr "Սկսիր"
+
+#: rdetail.page.previous
+msgid "Previous page"
+msgstr "Նախորդ էջ"
+
+#: rdetail.page.next
+msgid "Next page"
+msgstr "Հաջորդ էջ"
+
+#: rdetail.page.last
+msgid "Last results page"
+msgstr "Վերջին արդյունքների էջ"
+
+#: rdetail.end
+msgid "End"
+msgstr "Վերջ"
+
+#: rdetail.more
+msgid "More Actions..."
+msgstr "Ավելի գործողություններ..."
+
+#: rdetail.bookbag.add
+msgid "Add to bookbag"
+msgstr "Ավելացրու գրքի զամբյուղին"
+
+#: rdetail.bookbag.create
+msgid "Create a new bookbag"
+msgstr "Ստեղծիր գրքի նոր զամբյուղ"
+
+#: rdetail.record.deleted
+msgid ""
+"This record has been deleted from the database. We recommend that you remove "
+"this title from any bookbags it may have been added to."
+msgstr ""
+"Այս գրառումը ջնջվել է շտեմարանից։ Խորհուրդ ենք տալիս հեռացնել այս վերնագիրը "
+"բոլոր գրքի զամբյուղներից, որոնցում այն կարող է ավելացված լինել։"
+
+#: rdetail.none
+msgid "(none)"
+msgstr "(ոչինչ)"
+
+#: rdetail.bookbag.add.success
+msgid "Item successfully added to bookbag"
+msgstr "Նյութը հաջողությամբ ավելացվել է գրքի զամբյուղին"
+
+#: rdetail.bookbag.name
+msgid "Enter the name of the new bookbag"
+msgstr "Մուտք արա նոր գրքի զամբյուղի անվանումը"
+
+#: rdetail.bookbag.create.success
+msgid "Bookbag successfully created"
+msgstr "Գրքի զամբյուղը հաջողությամբ ստեղծվել է"
+
+#: rdetail.detailMain.headerLabel
+msgid "Record Summary"
+msgstr "Գրառման համառոտագրություն"
+
+#: rdetail.detailMain.subjects
+msgid "Subjects"
+msgstr "Խորագրեր"
+
+#: rdetail.detailMain.abstract
+msgid "Abstract"
+msgstr "Համառոտագրություն"
+
+#: rdetail.detailMain.viewMarc
+msgid "View MARC"
+msgstr "Դիտիր MARC"
+
+#: rdetail.detailMain.hideMarc
+msgid "Return to title details"
+msgstr "Վերադարձիր վերնագրի մանրամասներին"
+
+#: rdetail.author.search
+msgid "Perform an author search"
+msgstr "Իրականցրու հեղինակի փնտրում"
+
+#: rdetail.copyInfo.headerLabel
+msgid "Copy Information"
+msgstr "Պատճենիր տեղեկատվությունը"
+
+#: rdetail.copyInfo.callnumber
+msgid "Callnumber"
+msgstr "Դասիչ"
+
+#: rdetail.copyInfo.local
+msgid "View Copy Information for this location only"
+msgstr "Դիտիր Պատճենիր տեղեկատվությունը այս տեղաբաշխման համար"
+
+#: rdetail.copyInfo.all
+msgid "View copy information for all libraries"
+msgstr "Դիտիր Պատճենիր տեղեկատվությունը բոլոր գրադարանների համար"
+
+#: rdetail.copyInfo.actions
+msgid "Actions"
+msgstr "Գործողություններ"
+
+#: rdetail.copyInfo.print
+msgid "Print Call Numbers for this library"
+msgstr "Տպիր դասիչները այս գրադարանի համար"
+
+#: rdetail.copyInfo.details
+msgid "details"
+msgstr "մանրամասներ"
+
+#: rdetail.copyInfo.browse
+msgid "browse"
+msgstr "դիտիր"
+
+#: rdetail.extras.summary
+msgid "Copy Summary"
+msgstr "Պատճենի համառոտագրություն"
+
+#: rdetail.extras.toc
+msgid "Table of Contents"
+msgstr "Բովանդակություն"
+
+#: rdetail.extras.excerpt
+msgid "Excerpt"
+msgstr "Մեջբերում"
+
+#: rdetail.extras.author.notes
+msgid "Author Notes"
+msgstr "Հեղինակի նշումներ"
+
+#: rdetail.extras.annotation
+msgid "Annotation"
+msgstr "Աննոտացիա"
+
+#: rdetail.extras.marc
+msgid "MARC Record"
+msgstr "MARC գրառում"
+
+#: rdetail.extras.call.null
+msgid "There are no call numbers for this item at this location."
+msgstr "Այս վայրում այս նյութի համար դասիչավորման համարներ չկան"
+
+#: rdetail.extras.call.local
+msgid "Local Call Numbers:"
+msgstr "Տեղային դասիչներ"
+
+#: rdetail.loading
+msgid "Loading copy infomation..."
+msgstr "Պատճենի տեղեկատվության բեռնավորում..."
+
+#: rdetail.noneAvailable
+msgid " * There are no copies in this location"
+msgstr " * Այս վայրում պատճեներ չկան"
+
+#: rdetail.summary.online
+msgid "Online Resources"
+msgstr "Առցանց պաշարներ"
+
+#: result.sort_by
+msgid "Sort Results by Relevance"
+msgstr "Տեսակավորիր արդյունքները ըստ կարևորության"
+
+#: result.sort_by.title
+msgid "Sort Results by Title"
+msgstr "Տեսակավորիր արդյունքները ըստ վերնագրի"
+
+#: result.sort_by.author
+msgid "Sort Results by Author"
+msgstr "Տեսակավորիր արդյունքները ըստ հեղինակի"
+
+#: result.sort_by.pubdate
+#, fuzzy
+msgid "Sort Results by Publication Date"
+msgstr "Տեսակավորիր արդյունքները ըստ հրատարակման տարեթվի"
+
+#: result.limit2avail
+msgid "Limit to Available"
+msgstr "Սահմանափակիր մատչելիներով"
+
+#: result.info.copies
+msgid "Available copies / Total copies"
+msgstr "Հասանելի պատճեներ / Ընդհանուր պատճեներ"
+
+#: result.info.no.items
+msgid "No items with the selected format were found in this location."
+msgstr "Այս վայրում ընտրված ձևաչափով նյութեր չեն գտնվել"
+
+#: result.info.format.items
+msgid "Listed below are all items in the catalog with the chosen format."
+msgstr "Ստորև թվարկվածները քարտարանի նյութերն են ըստ ընտրված ձևաչափի "
+
+#: result.info.show
+msgid "Show records for"
+msgstr "Ցույց տուր գրառումները "
+
+#: result.lowhits.few
+msgid "Few hits were returned for your search."
+msgstr "Քո որոնման համար շատ քիչ հարվածներ են վերադարձվել "
+
+#: result.lowhits.zero
+msgid "Zero hits were returned for your search."
+msgstr "Քո որոնման համար զերո արդյունք է վերադարձվել "
+
+#: result.lowhits.did.you.mean
+msgid "Maybe you meant:"
+msgstr "Միգուցե՞ դու նկատի ունես"
+
+#: result.lowhits.formats
+msgid "You will find more hits when searching all item formats:"
+msgstr ""
+"Դու կունենաս ավելի շատ հարվածներ երբ որոնես ըստ նյութի բոլոր ձևաչափերի։"
+
+#: result.lowhits.formats.search
+msgid "Search again with all formats?"
+msgstr "Որոնե՞լ նորից ըստ բոլոր ձևաչափերի"
+
+#: result.lowhits.related
+msgid "You may also like to try these related searches:"
+msgstr "Դու կարող ես նախընտրել նաև այս կապակցված փնտրումները։"
+
+#: result.lowhits.expand
+msgid "You may also wish to expand your search range to:"
+msgstr "Դու կարող ես ցանկանալ նաև ընդլայնել քո փնտրման տիրույթը։"
+
+#: result.lowhits.class
+msgid "You can try searching the same terms by:"
+msgstr "Դու կարող ես փորձել փնտրել նույն տերմինը։"
+
+#: result.lowhits.title
+msgid "title"
+msgstr "վերնագիր"
+
+#: result.lowhits.author
+msgid "author"
+msgstr "հեղինակ"
+
+#: result.lowhits.subject
+msgid "subject"
+msgstr "խորագիր"
+
+#: result.lowhits.series
+msgid "series"
+msgstr "մատենաշար"
+
+#: result.lowhits.keyword
+msgid "keyword"
+msgstr "վճռորոշ բառ"
+
+#: result.table.keyword
+msgid "View titles for this record"
+msgstr "Այս գրառման համար դիտիր վերնագրերը"
+
+#: result.table.author
+msgid "Perform an Author Search"
+msgstr "Իրականացրու որոնում ըստ Հեղինակի"
+
+#: common.call.number.label
+msgid "Call Number:"
+msgstr "Դասիչ։"
+
+#: common.isbn.label
+msgid "ISBN:"
+msgstr "ISBN:"
+
+#: common.issn.label
+msgid "ISSN:"
+msgstr "ISSN:"
+
+#: common.copy.barcode.label
+msgid "Copy Barcode:"
+msgstr "Պատճենահանիր շտրիխ կոդը։"
+
+#: common.hold.place
+msgid "Place hold for me"
+msgstr "Իմ համար իրականացրու պահում"
+
+#: common.hold.check
+msgid "Checking for possibility of hold fulfillment..."
+msgstr "Պահման իրականացման համար ստուգվում է հնարավորությունը... "
+
+#: common.hold.create
+msgid "Create / Edit a Hold"
+msgstr "Ստեղծիր / Խմբագրիր պահումը"
+
+#: common.hold.update
+msgid "Update Hold"
+msgstr "Թարմացրու պահումը"
+
+#: common.hold.type.label
+msgid "Hold Type:"
+msgstr "Պահման տեսակ"
+
+#: common.hold.volume
+msgid "Volume Hold"
+msgstr "Հատորի պահում"
+
+#: common.hold.copy
+msgid "Copy Hold"
+msgstr "Պատճենի պահում"
+
+#: common.hold.advanced
+msgid "Advanced Hold Options"
+msgstr "Պահման խորացված ընտրանքներ"
+
+#: common.hold.delivery
+msgid "Please select a physical location where your hold can be delivered."
+msgstr "Ընտրեք այն ֆիզիկական տեղաբաշխումը, ուր կարելի է առաքել ձեր պահումը։"
+
+#: common.hold.exists
+msgid "A hold already exists on the requested item."
+msgstr "Պատվիրված նյութի վրա արդեն գոյություն ունի պահում։"
+
+#: common.hold.exists.override
+msgid ""
+"A hold already exists on the requested item. Would you like to create the "
+"hold anyway?"
+msgstr ""
+"Պատվիրված նյութի վրա արդեն գոյություն ունի պահում։ Կուզենա՞ք ամեն դեպքում "
+"ստեղծել պահում։"
+
+#: common.hold.barred
+msgid ""
+"PATRON BARRED. Please see any notes in the \"Staff Notes\" section of your "
+"\"My Account\" page or contact your local library."
+msgstr ""
+"ԸՆԹԵՐՑՈՂԸ ԱՐԳԵԼԱՓԱԿՎԱԾ Է։ Տես նշումները  քո  \"Իմ հաշվեհամար\" էջի "
+"\"Աշխատակազմի նշումներ\" բաժնում, կամ կապվիր քո տեղային գրադարանի հետ։։ "
+
+#: common.hold.item.invalid
+msgid ""
+"This hold is no longer valid. It's likely that the target for the hold was "
+"deleted from the system.  Please cancel this hold and place a new one."
+msgstr ""
+"Այ պահումը այլևս հավաստի չէ։ Հավանաբար պահման թիրախը համակարգից ջնջված է։ "
+"Չեղյալ արեք այս պահումը և իրականացրու նոր պահում։"
+
+#: common.hold.patron.invalid
+msgid "The patron barcode entered as the hold recipient is invalid."
+msgstr "Ընթերցողի շտրիխ կոդը մուտքագրված որպես ստացող հավաստի չէ։"
+
+# Was (??), perhaps change to a button or icon?
+#: common.help
+msgid "(Help)"
+msgstr "(Օգնություն)"
+
+#: common.phone.format.help
+msgid ""
+"The phone number does not have the correct format. The expected format is "
+"XXX-YYY-ZZZZ"
+msgstr "Հեռախոսի համարը չունի ճիշտ ձևաչափ։ Սպասվող ձևաչափն է` XXX-YYY-ZZZZ"
+
+#: common.hold.failed
+msgid ""
+"No items were found that could fulfill the requested holds. It's possible "
+"that choosing a different format will result in a successful hold. It is "
+"also possible that you have exceeded the number of allowable holds. For "
+"further information, please consult your local librarian."
+msgstr ""
+"Պահանջվող պահումներին բավարարող գրառումներ չկան։ Հնարավոր է, որ ուրիշ "
+"ձևաչափի ընտրությունը  կհանգեցնի հաջող պահման։ Հնարավոր է նաև որ դու "
+"գերազանցել ես թույլատրելի պահումների քանակը։ Հետագա տեղեկատվության համար "
+"դիմիր քո տեղային գրադարանավարին։   "
+
+#: common.control.click
+msgid "(control-click to select multiple formats)"
+msgstr "(Բազմաձևաչափեր ընտրելու համար` ստուգիր-սեղմիր)"
+
+#: common.format.alternatives
+msgid "Acceptable Alternative Formats:"
+msgstr "Ընդունելի այլընտրանքային ձևաչափեր։"
+
+#: common.phone.format
+msgid "(XXX-YYY-ZZZZ)"
+msgstr "(XXX-YYY-ZZZZ)"
+
+#: common.phone.enable
+msgid "Enable phone notifications for this hold?"
+msgstr "Թույլատրե՞լ այս պահման համար հեռախոսային տեղեկացումներ։"
+
+#: common.email.enable
+msgid "Enable email notifications for this hold?"
+msgstr "Թույլատրե՞լ այս պահման համար էլ փոստով տեղեկացումներ։"
+
+#: common.email.none
+msgid "(Patron has no configured email address)"
+msgstr "(Ընթերցողը չի կարգաբերել էլ փոստի հասցեն)"
+
+#: common.email.set
+msgid ""
+"(See <a class='classic_link' id='holds.no_email.my_account'>My Account</a> "
+"for setting your email address)"
+msgstr ""
+"(Տես <a class='classic_link' id='holds.no_email.my_account'>Իմ հաշիվը</a> քո "
+"էլ փոստի հասցեն ստեղծելու համար)"
+
+#: common.keywords.label
+msgid "Keywords:"
+msgstr "Վճռորոշ բառեր։"
+
+#: common.physical.label
+msgid "Physical Description:"
+msgstr "Ֆիզիկական նկարագրություն։"
+
+#: common.series.label
+msgid "Series:"
+msgstr "Մատենաշար։"
+
+#: common.subject.label
+msgid "Subject:"
+msgstr "Խորագիր։"
+
+#: common.title.label
+msgid "Title:"
+msgstr "Վերնագիր։"
+
+#: common.author.label
+msgid "Author:"
+msgstr "Հեղինակ։"
+
+#: common.format.label
+msgid "Format:"
+msgstr "Ձևաչափ։"
+
+#: library.select
+msgid "Find results in"
+msgstr "Գտիր արդյունքները"
+
+#: library.select.label
+msgid "Choose a different library..."
+msgstr "Ընտրիր մեկ այլ գրադարան..."
+
+#: login.username
+msgid "Enter your username or library barcode"
+msgstr "Մուտք արա օգտվողի անունը կամ շտրիխ կոդը"
+
+#: login.password.change
+msgid "Change Password"
+msgstr "Փոխիր գաղտնաբառը"
+
+#: login.first.time
+msgid ""
+"This appears to be the first time you have logged in. You will need to "
+"change your password."
+msgstr ""
+"Կարծես թե դու առաջին անգամ ես մուտք գործում։ Անհրաժեշտ է փոխել գաղտնաբառը։"
+
+#: login.password.current.enter
+msgid "Enter your current password"
+msgstr "Մուտք արա ընթացիկ գաղտնաբառը։"
+
+#: login.password.new.enter
+msgid "Enter the new password"
+msgstr "Մուտք արա նոր գաղտնաբառը։"
+
+#: login.password.new.reenter
+msgid "Re-type the new password for verification"
+msgstr "Ստուգման համար կրկին մուտք արա նոր գաղտնաբառը։"
+
+#: login.password.update
+msgid "Update Password"
+msgstr "Թարմացրու գաղտնաբառը։"
+
+#: login.password.nomatch
+msgid "Passwords do not match"
+msgstr "Գաղտնաբառերը չեն համընկնում"
+
+#: login.password.strength
+msgid "The password provided is not strong enough."
+msgstr "Ներկայացված գաղտնաբառը այնքան էլ ուժեղ չէ։"
+
+#: login.barcode.inactive
+msgid ""
+"The barcode used to login is marked as inactive.  Please contact your local "
+"library."
+msgstr ""
+"Մուտք գործելու համար տրված շտրիխ կոդը նշված է որպես ոչ ակտիվ։ Կապվիր քո "
+"տեղային գրադարանի հետ։ "
+
+#: login.account.inactive
+msgid "This account has been deactivated.  Please contact your local library."
+msgstr "Այս հաշիվը ապաակտիվացված է։ Կապվիր քո տեղային գրադարանի հետ։"
+
+#: login.failed
+msgid ""
+"Login failed. The username or password provided was not valid. Ensure Caps-"
+"Lock is off and try again or contact your local library."
+msgstr ""
+"Գրանցումը տապալված է։ Օգտվողի անունը կամ գաղտնաբառը հավաստի չեն։ Ստուգիր որ "
+"Caps-Lock-ը անջատված է, և փորձիր նորից, կամ կապվիր տեղային գրադարանի հետ։"
+
+#: button.go
+msgid "Go!"
+msgstr "Գնա"
+
+# =================================================================
+# Slimpac Simple Search
+# =================================================================
+#: slimpac.start.title
+msgid "Simple Search"
+msgstr "Հասարակ փնտրում"
+
+#: slimpac.start.nowSearching
+msgid "Now searching: "
+msgstr "Հիմա որոնում է։"
+
+#: slimpac.start.dynamic
+msgid "Dynamic Catalog"
+msgstr "Դինամիկ քարտարան"
+
+# =================================================================
+# Slimpac Advanced Search
+# =================================================================
+#: slimpac.advanced.language
+msgid "Item Language"
+msgstr "Նյութի լեզու"
+
+#: slimpac.advanced.create_date
+msgid "Record Creation Date"
+msgstr "Գրառման ստեղծման ամսաթիվ"
+
+#: slimpac.advanced.edit_date
+msgid "Record Edit Date"
+msgstr "Գրառման խմբագրման ամսաթիվ"
+
+#: opac.image_provided
+msgid "Image provided by"
+msgstr "Նկարը ապահովել է"
+
+#: vendor.name
+msgid "Amazon"
+msgstr "Ամազոն"
+
+#: vendor.base_link
+msgid "http://amazon.com/dp/"
+msgstr "http://amazon.com/dp/"
+
+#~ msgid "Edit/Cancel"
+#~ msgstr "Խմբագրիր/Անտեսիր"
diff --git a/build/i18n/po/lang.dtd.pot b/build/i18n/po/lang.dtd.pot
deleted file mode 100644 (file)
index be8ecd8..0000000
+++ /dev/null
@@ -1,3645 +0,0 @@
-# extracted from ../../Open-ILS/web/opac/locale/en-US/lang.dtd
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Evergreen 1.4\n"
-"Report-Msgid-Bugs-To: open-ils-dev@list.georgialibraries.org\n"
-"POT-Creation-Date: 2007-11-19 13:21-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-#: lang.version
-msgid "remote v1"
-msgstr ""
-
-#: lang.description
-msgid "English"
-msgstr ""
-
-#: lang.author
-msgid "PINES"
-msgstr ""
-
-#: common.check_date.description
-msgid "Check today's date above."
-msgstr ""
-
-#: common.check_barcode.description
-msgid "Check barcode?"
-msgstr ""
-
-#: common.date_helper
-msgid "or choose one of these"
-msgstr ""
-
-#: common.date_helper.3_days
-msgid "Today + 3 days"
-msgstr ""
-
-#: common.date_helper.7_days
-msgid "Today + 7 days"
-msgstr ""
-
-#: common.date_helper.14_days
-msgid "Today + 14 days"
-msgstr ""
-
-#: common.date_helper.30_days
-msgid "Today + 30 days"
-msgstr ""
-
-#: common.due_date.description
-msgid "Enter the item due date:"
-msgstr ""
-
-#: common.enter.label
-#: common.enter.accesskey
-#: staff.circ.offline_checkin.step2a.label
-#: staff.circ.offline_checkin.step2a.accesskey
-msgid "&Enter"
-msgstr ""
-
-#: common.enter_barcode.description
-msgid "Enter the item barcode:"
-msgstr ""
-
-#: common.title
-#: staff.cat.search_title
-#: staff.mvr_label_title
-#: staff.record_list.title
-#: staff.z39_50.search_class.title
-msgid "Title"
-msgstr ""
-
-#: common.author
-#: staff.cat.search_author
-#: staff.mvr_label_author
-#: staff.record_list.author
-#: staff.z39_50.search_class.author
-msgid "Author"
-msgstr ""
-
-#: common.subject
-#: staff.cat.search_subject
-msgid "Subject"
-msgstr ""
-
-#: common.series
-msgid "Series"
-msgstr ""
-
-#: common.keyword
-#: staff.cat.search_all
-msgid "Keyword"
-msgstr ""
-
-#: common.type
-#: staff.ahr_hold_type_label
-#: staff.cat.search_type
-#: staff.marc.LDR.type.short
-msgid "Type"
-msgstr ""
-
-#: common.isbn
-#: staff.record_list.isbn
-#: staff.z39_50.search_class.isbn
-msgid "ISBN"
-msgstr ""
-
-#: common.format
-#: staff.cat.search_format
-msgid "Format"
-msgstr ""
-
-#: common.login
-#: staff.auth.login_header
-msgid "Login"
-msgstr ""
-
-#: common.logout
-msgid "Log Out"
-msgstr ""
-
-#: common.at
-msgid "at"
-msgstr ""
-
-#: common.of
-#: staff.displaying.of
-msgid "of"
-msgstr ""
-
-#: common.cancel
-msgid "Cancel"
-msgstr ""
-
-#: common.library
-msgid "Library"
-msgstr ""
-
-#: common.step1.label
-msgid "Step 1)"
-msgstr ""
-
-#: common.step2.label
-#: common.step2.accesskey
-msgid "Step &2)"
-msgstr ""
-
-#: common.step3.label
-#: common.step3.accesskey
-msgid "Step &3)"
-msgstr ""
-
-#: common.step4.label
-#: common.step4.accesskey
-msgid "Step &4)"
-msgstr ""
-
-#: common.step5.label
-msgid "Step 5)"
-msgstr ""
-
-#: common.step6.label
-msgid "Step 6)"
-msgstr ""
-
-#: common.username
-msgid "Username"
-msgstr ""
-
-#: common.username.label
-#: common.username.accesskey
-msgid "&Username:"
-msgstr ""
-
-#: common.password
-#: staff.au_password_label
-msgid "Password"
-msgstr ""
-
-#: common.submit
-#: staff.auth.submit_prompt
-#: staff.circ.checkin.submit_label
-#: staff.circ.hold_capture.submit_label
-#: staff.patron_display.checkout.submit_label
-msgid "Submit"
-msgstr ""
-
-#: common.user_not_found
-msgid "User not found"
-msgstr ""
-
-#: common.unimplemented
-msgid "Not Yet Implemented"
-msgstr ""
-
-#: common.delete_transactions.label
-msgid "Delete selected transaction"
-msgstr ""
-
-#: common.save_transactions.label
-#: common.save_transactions.accesskey
-msgid "&Save these transactions"
-msgstr ""
-
-#: ilsevent.1000
-msgid "Login failed.  The username or password entered was incorrect."
-msgstr ""
-
-#: ilsevent.1001
-msgid "Login session has timed out or does not exist"
-msgstr ""
-
-#: ilsevent.1002
-msgid "User was not found in the database"
-msgstr ""
-
-#: ilsevent.5000
-msgid "Permission Denied"
-msgstr ""
-
-#: ilsperm.CREATE_HOLD
-msgid "User is not allowed to create holds for other users at this location"
-msgstr ""
-
-#: common.cancel.accesskey
-#: staff.cat.fixed.SCO.key
-#: staff.copy.close.key
-#: staff.main.auth.debug.clear.accesskey
-#: staff.main.menu.circ.checkin.key
-#: staff.main.menu.circ.claimed_returned.key
-#: staff.main.menu.circ.key
-#: staff.main.menu.edit.copy.key
-#: staff.main.menu.file.close.key
-#: staff.marc.display.fixed.SCO.key
-#: staff.marc.file.close.key
-#: staff.patron_navbar.checkout.accesskey
-msgid "C"
-msgstr ""
-
-#: common.login.accesskey
-#: staff.auth.logoff_prompt.key
-#: staff.cat.search_count_copy.key
-#: staff.cat.search_location.key
-#: staff.checkin.reprint_receipt_label.accesskey
-#: staff.hold_capture.reprint_receipt_label.accesskey
-#: staff.main.menu.circ.lost.key
-#: staff.marc.display.legend.key
-#: staff.patron_display.checkout.reprint_receipt_label.accesskey
-msgid "L"
-msgstr ""
-
-#: common.password.accesskey
-#: staff.auth.password_prompt.accesskey
-#: staff.auth.password_prompt.key
-#: staff.cat.fixed.MAP.key
-#: staff.main.menu.circ.barcode.retrieve_patron.accesskey
-#: staff.main.menu.circ.patron_status.key
-#: staff.main.menu.edit.paste.key
-#: staff.marc.display.fixed.MAP.key
-#: staff.patron_display.items.print_receipt_label.accesskey
-#: staff.previous.range.key
-msgid "P"
-msgstr ""
-
-#: staff.about.title
-msgid "About"
-msgstr ""
-
-#: staff.acp_label_barcode
-#: staff.browse_list.barcode
-#: staff.copy.attr.barcode
-msgid "Barcode"
-msgstr ""
-
-#: staff.acp_label_call_number
-#: staff.browse_list.callnumber
-#: staff.cat.search_callnumber
-#: staff.volume.attr.callnumber
-msgid "Call Number"
-msgstr ""
-
-#: staff.acp_label_circ_as_type
-msgid "Circ As Type"
-msgstr ""
-
-#: staff.acp_label_circ_lib
-msgid "Circ Lib"
-msgstr ""
-
-#: staff.acp_label_circ_modifier
-#: staff.browse_list.circ_modifier
-msgid "Circ Modifier"
-msgstr ""
-
-#: staff.acp_label_copy_number
-#: staff.browse_list.copy_number
-msgid "Copy Number"
-msgstr ""
-
-#: staff.acp_label_deposit
-#: staff.browse_list.deposit
-msgid "Deposit"
-msgstr ""
-
-#: staff.acp_label_deposit_amount
-#: staff.browse_list.deposit_amount
-msgid "Deposit Amount"
-msgstr ""
-
-#: staff.acp_label_fine_level
-#: staff.browse_list.fine_level
-#: staff.copy.attr.fine_level
-msgid "Fine Level"
-msgstr ""
-
-#: staff.acp_label_id
-msgid "Copy ID"
-msgstr ""
-
-#: staff.acp_label_loan_duration
-#: staff.browse_list.loan_duration
-#: staff.copy.attr.loan_duration
-msgid "Loan Duration"
-msgstr ""
-
-#: staff.acp_label_location
-#: staff.browse_list.location2
-#: staff.cat.search_count_copy
-#: staff.cat.search_location
-msgid "Location"
-msgstr ""
-
-#: staff.acp_label_price
-#: staff.browse_list.price
-#: staff.copy.attr.price
-msgid "Price"
-msgstr ""
-
-#: staff.acp_label_status
-#: staff.ahr_status_label
-#: staff.browse_list.status
-#: staff.checkin_label_status
-#: staff.main.auth.status
-#: staff.patron_display.status.caption
-msgid "Status"
-msgstr ""
-
-#: staff.ahr_capture_time_label
-msgid "Capture Time"
-msgstr ""
-
-#: staff.ahr_current_copy_label
-msgid "Current Copy"
-msgstr ""
-
-#: staff.ahr_email_notify_label
-msgid "Email Notify"
-msgstr ""
-
-#: staff.ahr_expire_time_label
-msgid "Expire Time"
-msgstr ""
-
-#: staff.ahr_fulfillment_time_label
-msgid "Fulfillment Time"
-msgstr ""
-
-#: staff.ahr_holdable_formats_label
-msgid "Holdable Formats"
-msgstr ""
-
-#: staff.ahr_id_label
-msgid "Hold Id"
-msgstr ""
-
-#: staff.ahr_ischanged_label
-#: staff.au_ischanged_label
-msgid "Ischanged"
-msgstr ""
-
-#: staff.ahr_isdeleted_label
-#: staff.au_isdeleted_label
-msgid "Isdeleted"
-msgstr ""
-
-#: staff.ahr_isnew_label
-#: staff.au_isnew_label
-msgid "Isnew"
-msgstr ""
-
-#: staff.ahr_phone_notify_label
-msgid "Phone Notify"
-msgstr ""
-
-#: staff.ahr_pickup_lib_label
-msgid "Pickup Lib"
-msgstr ""
-
-#: staff.ahr_prev_check_time_label
-msgid "Prev Check Time"
-msgstr ""
-
-#: staff.ahr_request_time_label
-msgid "Request Time"
-msgstr ""
-
-#: staff.ahr_requestor_label
-msgid "Requestor"
-msgstr ""
-
-#: staff.ahr_selection_depth_label
-msgid "Selection Depth"
-msgstr ""
-
-#: staff.ahr_target_label
-msgid "Target"
-msgstr ""
-
-#: staff.ahr_usr_label
-msgid "Usr"
-msgstr ""
-
-#: staff.au_active_label
-#: staff.au_label_active
-msgid "Active"
-msgstr ""
-
-#: staff.au_addresses_label
-msgid "Addresses"
-msgstr ""
-
-#: staff.au_alert_message_label
-msgid "Alert Message"
-msgstr ""
-
-#: staff.au_billing_address_label
-#: staff.circ.offline_register.billing_address.label
-msgid "Billing Address"
-msgstr ""
-
-#: staff.au_card_label
-msgid "Card"
-msgstr ""
-
-#: staff.au_cards_label
-msgid "Cards"
-msgstr ""
-
-#: staff.au_checkouts_label
-msgid "Checkouts"
-msgstr ""
-
-#: staff.au_claims_returned_count_label
-msgid "Claims Returned Count"
-msgstr ""
-
-#: staff.au_create_date_label
-msgid "Create Date"
-msgstr ""
-
-#: staff.au_credit_forward_balance_label
-msgid "Credit Forward Balance"
-msgstr ""
-
-#: staff.au_day_phone_label
-msgid "Day Phone"
-msgstr ""
-
-#: staff.au_dob_label
-msgid "Dob"
-msgstr ""
-
-#: staff.au_email_label
-msgid "Email"
-msgstr ""
-
-#: staff.au_evening_phone_label
-msgid "Evening Phone"
-msgstr ""
-
-#: staff.au_expire_date_label
-msgid "Expire Date"
-msgstr ""
-
-#: staff.au_family_name_label
-#: staff.au_label_family_name
-msgid "Family Name"
-msgstr ""
-
-#: staff.au_first_given_name_label
-msgid "First Given Name"
-msgstr ""
-
-#: staff.au_hold_requests_label
-msgid "Hold Requests"
-msgstr ""
-
-#: staff.au_home_ou_label
-msgid "Home Ou"
-msgstr ""
-
-#: staff.au_id_label
-msgid "User Id"
-msgstr ""
-
-#: staff.au_ident_type2_label
-msgid "Ident Type2"
-msgstr ""
-
-#: staff.au_ident_type_label
-msgid "Ident Type"
-msgstr ""
-
-#: staff.au_ident_value2_label
-msgid "Ident Value2"
-msgstr ""
-
-#: staff.au_ident_value_label
-msgid "Ident Value"
-msgstr ""
-
-#: staff.au_label_first_given_name
-msgid "First Name"
-msgstr ""
-
-#: staff.au_label_id
-msgid "Record ID"
-msgstr ""
-
-#: staff.au_label_prefix
-#: staff.au_prefix_label
-msgid "Prefix"
-msgstr ""
-
-#: staff.au_label_second_given_name
-msgid "Middle Name"
-msgstr ""
-
-#: staff.au_label_suffix
-#: staff.au_suffix_label
-msgid "Suffix"
-msgstr ""
-
-#: staff.au_last_xact_id_label
-msgid "Last Xact Id"
-msgstr ""
-
-#: staff.au_mailing_address_label
-#: staff.patron_display.mailing_address
-msgid "Mailing Address"
-msgstr ""
-
-#: staff.au_master_account_label
-msgid "Master Account"
-msgstr ""
-
-#: staff.au_net_access_level_label
-msgid "Net Access Level"
-msgstr ""
-
-#: staff.au_other_phone_label
-msgid "Other Phone"
-msgstr ""
-
-#: staff.au_passwd_label
-msgid "Passwd"
-msgstr ""
-
-#: staff.au_photo_url_label
-msgid "Photo Url"
-msgstr ""
-
-#: staff.au_profile_label
-msgid "Profile"
-msgstr ""
-
-#: staff.au_second_given_name_label
-msgid "Second Given Name"
-msgstr ""
-
-#: staff.au_settings_label
-msgid "Settings"
-msgstr ""
-
-#: staff.au_standing_label
-msgid "Standing"
-msgstr ""
-
-#: staff.au_stat_cat_entries_label
-msgid "Stat Cat Entries"
-msgstr ""
-
-#: staff.au_super_user_label
-msgid "Super User"
-msgstr ""
-
-#: staff.au_survey_responses_label
-msgid "Survey Responses"
-msgstr ""
-
-#: staff.au_usrgroup_label
-msgid "Usrgroup"
-msgstr ""
-
-#: staff.au_usrname_label
-msgid "Usrname"
-msgstr ""
-
-#: staff.admin.survey.available.label
-msgid "Available to:"
-msgstr ""
-
-#: staff.admin.survey.description.label
-msgid "Description:"
-msgstr ""
-
-#: staff.admin.survey.end.label
-msgid "End:"
-msgstr ""
-
-#: staff.admin.survey.format.label
-msgid "Poll Format:"
-msgstr ""
-
-#: staff.admin.survey.name.label
-#: staff.auth.name_prompt
-msgid "Name:"
-msgstr ""
-
-#: staff.admin.survey.opac_visible.label
-msgid "OPAC Visible:"
-msgstr ""
-
-#: staff.admin.survey.required.label
-msgid "Required:"
-msgstr ""
-
-#: staff.admin.survey.save_question.label
-#: staff.admin.survey.save_question.accesskey
-msgid "Save this &Question"
-msgstr ""
-
-#: staff.admin.survey.staff_client.label
-msgid "Staff Client:"
-msgstr ""
-
-#: staff.admin.survey.start.label
-msgid "Start:"
-msgstr ""
-
-#: staff.auth.logoff_prompt
-msgid "Log Off"
-msgstr ""
-
-#: staff.auth.logoff_prompt.accesskey
-msgid "f"
-msgstr ""
-
-#: staff.auth.name_prompt.key
-#: staff.main.menu.file.new.key
-#: staff.next.range.key
-msgid "N"
-msgstr ""
-
-#: staff.auth.password_prompt
-msgid "Password:"
-msgstr ""
-
-#: staff.auth.quit_prompt
-msgid "Exit Evergreen"
-msgstr ""
-
-#: staff.auth.quit_prompt.key
-msgid "x"
-msgstr ""
-
-#: staff.auth.submit_prompt.key
-#: staff.cat.fixed.SER.key
-#: staff.cat.search_submit.key
-#: staff.circ.checkin.submit_label.accesskey
-#: staff.circ.hold_capture.submit_label.accesskey
-#: staff.copy.save.key
-#: staff.main.auth.offline.interface.accesskey
-#: staff.main.menu.cat.bib_search.key
-#: staff.main.menu.circ.special.key
-#: staff.main.menu.file.save.key
-#: staff.marc.display.fixed.SER.key
-#: staff.marc.file.publish.key
-#: staff.patron_display.checkout.submit_label.accesskey
-msgid "S"
-msgstr ""
-
-#: staff.auth.title
-msgid "Evergreen Staff Client 3"
-msgstr ""
-
-#: staff.auth.version
-msgid "Evergreen 0.1.0 20051202"
-msgstr ""
-
-#: staff.bills_current_payment_label
-msgid "Current Payment"
-msgstr ""
-
-#: staff.bills_information
-msgid "Information"
-msgstr ""
-
-#: staff.bills_interface_label
-msgid "BILLS"
-msgstr ""
-
-#: staff.bills_money_label
-msgid "Money"
-msgstr ""
-
-#: staff.bills_total_owed_label
-msgid "Total Owed"
-msgstr ""
-
-#: staff.bills_wizard_label
-msgid "Bill Patron"
-msgstr ""
-
-#: staff.bills_xact_dates_label
-msgid "Record / Dates"
-msgstr ""
-
-#: staff.browse_list.circ_as_type
-msgid "Circulate As"
-msgstr ""
-
-#: staff.browse_list.circ_lib
-msgid "Circulating Lib"
-msgstr ""
-
-#: staff.browse_list.circulate
-msgid "Circulate"
-msgstr ""
-
-#: staff.browse_list.create_date
-msgid "Creation Date"
-msgstr ""
-
-#: staff.browse_list.creator
-msgid "Creator"
-msgstr ""
-
-#: staff.browse_list.edit_date
-msgid "Edit Date"
-msgstr ""
-
-#: staff.browse_list.editor
-msgid "Editor"
-msgstr ""
-
-#: staff.browse_list.library
-msgid "Owning Lib"
-msgstr ""
-
-#: staff.browse_list.location
-msgid "Location/Barcode"
-msgstr ""
-
-#: staff.browse_list.opac_visible
-#: staff.copy.notes.opac
-msgid "OPAC"
-msgstr ""
-
-#: staff.browse_list.ref
-#: staff.copy.attr.shelving_location.example5
-msgid "Reference"
-msgstr ""
-
-#: staff.browse_list.shelving_loc
-#: staff.copy.attr.shelving_location
-msgid "Shelving Location"
-msgstr ""
-
-#: staff.browse_list.win_title
-#: staff.record_list.win_title
-msgid "Cataloging"
-msgstr ""
-
-#: staff.cat.fixed.BKS
-msgid "BKS"
-msgstr ""
-
-#: staff.cat.fixed.BKS.key
-#: staff.copy.bucket.key
-#: staff.main.menu.cat.add_bib.key
-#: staff.main.menu.cat.bib_status.key
-#: staff.main.menu.cat.copy_status.accesskey
-#: staff.main.menu.circ.barcode.show_item.accesskey
-#: staff.main.menu.edit.buckets.copies.accesskey
-#: staff.main.menu.edit.buckets.key
-#: staff.marc.display.fixed.BKS.key
-#: staff.patron_navbar.bills.accesskey
-msgid "B"
-msgstr ""
-
-#: staff.cat.fixed.COM
-msgid "COM"
-msgstr ""
-
-#: staff.cat.fixed.COM.key
-#: staff.cat.search_order.key
-#: staff.main.menu.circ.checkout.key
-#: staff.main.menu.file.open.key
-#: staff.marc.display.fixed.COM.key
-msgid "O"
-msgstr ""
-
-#: staff.cat.fixed.MAP
-msgid "MAP"
-msgstr ""
-
-#: staff.cat.fixed.MIX
-msgid "MIX"
-msgstr ""
-
-#: staff.cat.fixed.MIX.key
-#: staff.main.menu.cat.dedup.key
-#: staff.main.menu.circ.missing.key
-#: staff.marc.display.fixed.MIX.key
-#: staff.marc.file.key
-msgid "M"
-msgstr ""
-
-#: staff.cat.fixed.REC
-msgid "REC"
-msgstr ""
-
-#: staff.cat.fixed.REC.key
-#: staff.checkin_patron.retrieve.accesskey
-#: staff.copy.reload.key
-#: staff.hold_capture_patron.retrieve.accesskey
-#: staff.main.auth.retest.accesskey
-#: staff.main.menu.circ.patron_registration.key
-#: staff.main.menu.edit.buckets.records.accesskey
-#: staff.main.menu.edit.redo.key
-#: staff.main.menu.entity.patron.register.key
-#: staff.marc.display.fixed.REC.key
-#: staff.marc.file.reload.key
-#: staff.patron_navbar.refresh.accesskey
-#: staff.patron_navbar.retrieve.accesskey
-msgid "R"
-msgstr ""
-
-#: staff.cat.fixed.SCO
-msgid "SCO"
-msgstr ""
-
-#: staff.cat.fixed.SER
-msgid "SER"
-msgstr ""
-
-#: staff.cat.fixed.VIS
-msgid "VIS"
-msgstr ""
-
-#: staff.cat.fixed.VIS.key
-#: staff.cat.search_advanced.key
-#: staff.main.menu.cat.add_volume.key
-#: staff.main.menu.cat.volume_status.key
-#: staff.main.menu.edit.buckets.volumes.accesskey
-#: staff.marc.display.fixed.VIS.key
-#: staff.marc.file.validate.key
-msgid "V"
-msgstr ""
-
-#: staff.cat.opac.add_bucket.label
-#: staff.cat.opac.add_bucket.accesskey
-msgid "Add to &Bucket"
-msgstr ""
-
-#: staff.cat.opac.bib_in_new_tab.label
-msgid "Duplicate in New Tab"
-msgstr ""
-
-#: staff.cat.opac.copy_browse.label
-#: staff.cat.opac.copy_browse.accesskey
-msgid "&Holdings Maintenance"
-msgstr ""
-
-#: staff.cat.opac.default.label
-msgid "Set bottom interface as Default"
-msgstr ""
-
-#: staff.cat.opac.marc_edit.label
-#: staff.cat.opac.marc_edit.accesskey
-msgid "MARC &Edit"
-msgstr ""
-
-#: staff.cat.opac.marc_view.label
-#: staff.cat.opac.marc_view.accesskey
-msgid "MARC &View"
-msgstr ""
-
-#: staff.cat.opac.mark_for_overlay.label
-#: staff.cat.opac.mark_for_overlay.accesskey
-msgid "&Mark for Overlay"
-msgstr ""
-
-#: staff.cat.opac.delete_record.label
-#: staff.cat.opac.delete_record.accesskey
-msgid "&Delete Record"
-msgstr ""
-
-#: staff.cat.opac.menu.label
-#: staff.cat.opac.menu.accesskey
-msgid "&Actions for this Record"
-msgstr ""
-
-#: staff.cat.opac.opac_view.label
-#: staff.cat.opac.opac_view.accesskey
-msgid "&OPAC View"
-msgstr ""
-
-#: staff.cat.opac.record_end.label
-#: staff.cat.opac.record_end.accesskey
-msgid "&End"
-msgstr ""
-
-#: staff.cat.opac.record_next.label
-#: staff.cat.opac.record_next.accesskey
-msgid "&Next"
-msgstr ""
-
-#: staff.cat.opac.record_prev.label
-#: staff.cat.opac.record_prev.accesskey
-msgid "&Previous"
-msgstr ""
-
-#: staff.cat.opac.record_start.label
-#: staff.cat.opac.record_start.accesskey
-msgid "&Start"
-msgstr ""
-
-#: staff.cat.opac.refresh_me.label
-msgid "Reset Display"
-msgstr ""
-
-#: staff.cat.opac.remove_me.label
-msgid "Remove this Frame"
-msgstr ""
-
-#: staff.cat.opac.view_holds.label
-#: staff.cat.opac.view_holds.accesskey
-msgid "View Hold&s"
-msgstr ""
-
-#: staff.cat.popup.add_to_bucket
-#: staff.copy.bucket
-msgid "Add to Bucket"
-msgstr ""
-
-#: staff.cat.popup.add_to_bucket.key
-msgid ""
-"_: staff.cat.popup.add_to_bucket.key\n"
-msgstr ""
-
-#: staff.cat.popup.browse.record.tab.key
-msgid ""
-"_: staff.cat.popup.browse.record.tab.key\n"
-msgstr ""
-
-#: staff.cat.popup.browse.record.window.key
-msgid ""
-"_: staff.cat.popup.browse.record.window.key\n"
-msgstr ""
-
-#: staff.cat.popup.browse_record.tab
-msgid "View Copies (Tab)"
-msgstr ""
-
-#: staff.cat.popup.browse_record.window
-msgid "View Copies (Window)"
-msgstr ""
-
-#: staff.cat.popup.edit.record.tab.key
-msgid ""
-"_: staff.cat.popup.edit.record.tab.key\n"
-msgstr ""
-
-#: staff.cat.popup.edit.record.window.key
-msgid ""
-"_: staff.cat.popup.edit.record.window.key\n"
-msgstr ""
-
-#: staff.cat.popup.edit_record.tab
-msgid "Edit Record (Tab)"
-msgstr ""
-
-#: staff.cat.popup.edit_record.window
-msgid "Edit Record (Window)"
-msgstr ""
-
-#: staff.cat.search_advanced
-msgid "Advanced"
-msgstr ""
-
-#: staff.cat.search_barcode
-msgid "Item Barcode"
-msgstr ""
-
-#: staff.cat.search_count_copy_show
-msgid "Show Only These Records"
-msgstr ""
-
-#: staff.cat.search_criteria
-msgid "Search Criteria"
-msgstr ""
-
-#: staff.cat.search_format.key
-#: staff.main.menu.circ.found.key
-#: staff.main.menu.edit.find.key
-#: staff.main.menu.file.key
-#: staff.marc.display.control_fields.key
-msgid "F"
-msgstr ""
-
-#: staff.cat.search_id
-msgid "System ID"
-msgstr ""
-
-#: staff.cat.search_isbn
-msgid "ISBN/ISSN"
-msgstr ""
-
-#: staff.cat.search_order
-msgid "Order"
-msgstr ""
-
-#: staff.cat.search_pubyear
-#: staff.record_list.pubyear
-msgid "Pub Year"
-msgstr ""
-
-#: staff.cat.search_submit
-#: staff.main.menu.search.label
-msgid "Search"
-msgstr ""
-
-#: staff.cat.search_tcn
-#: staff.record_list.tcn
-msgid "TCN"
-msgstr ""
-
-#: staff.cat.search_term
-msgid "Terms"
-msgstr ""
-
-#: staff.cat.search_term.key
-msgid "e"
-msgstr ""
-
-#: staff.cat.search_type.key
-#: staff.main.menu.file.new_tab.key
-msgid "T"
-msgstr ""
-
-#: staff.cat.test
-msgid "Test"
-msgstr ""
-
-#: staff.cat.test.key
-#: staff.main.menu.edit.key
-#: staff.marc.display.meta_data.key
-#: staff.marc.file.export.key
-#: staff.patron_navbar.edit.accesskey
-msgid "E"
-msgstr ""
-
-#: staff.cat.title
-msgid "TCN goes here"
-msgstr ""
-
-#: staff.cat.type_of_material
-msgid "All"
-msgstr ""
-
-#: staff.cat.type_of_material.a
-msgid "Language Material"
-msgstr ""
-
-#: staff.cat.type_of_material.c
-msgid "Notated Music"
-msgstr ""
-
-#: staff.cat.type_of_material.d
-msgid "Manuscript Notated Music"
-msgstr ""
-
-#: staff.cat.type_of_material.e
-msgid "Cartographic Material"
-msgstr ""
-
-#: staff.cat.type_of_material.f
-msgid "Manuscript Cartographic Material"
-msgstr ""
-
-#: staff.cat.type_of_material.g
-msgid "Projected Medium"
-msgstr ""
-
-#: staff.cat.type_of_material.i
-msgid "Nonmusical Sound Recording"
-msgstr ""
-
-#: staff.cat.type_of_material.j
-msgid "Musical Sound Recording"
-msgstr ""
-
-#: staff.cat.type_of_material.k
-msgid "Two-dimensional Nonprojectable Graphic"
-msgstr ""
-
-#: staff.cat.type_of_material.m
-msgid "Computer File"
-msgstr ""
-
-#: staff.cat.type_of_material.o
-msgid "Kit"
-msgstr ""
-
-#: staff.cat.type_of_material.p
-msgid "Mixed Material"
-msgstr ""
-
-#: staff.cat.type_of_material.r
-msgid "Three-dimensional Artifact or Naturally Occuring Object"
-msgstr ""
-
-#: staff.cat.type_of_material.t
-msgid "Manuscript Language Material"
-msgstr ""
-
-#: staff.checkin.auto_print_label
-#: staff.hold_capture.auto_print_label
-#: staff.patron_display.checkout.auto_print_label
-msgid "Auto-Print"
-msgstr ""
-
-#: staff.checkin.auto_print_label.accesskey
-#: staff.copy.notes.add.key
-#: staff.hold_capture.auto_print_label.accesskey
-#: staff.main.menu.edit.select_all.key
-#: staff.main.menu.tabs.close.accesskey
-#: staff.marc.display.cover_art.key
-#: staff.patron_display.checkout.auto_print_label.accesskey
-msgid "A"
-msgstr ""
-
-#: staff.checkin.done_label
-#: staff.hold_capture.done_label
-#: staff.patron_display.checkout.done_label
-msgid "Done"
-msgstr ""
-
-#: staff.checkin.done_label.accesskey
-#: staff.copy.notes.delete.key
-#: staff.hold_capture.done_label.accesskey
-#: staff.main.menu.edit.delete.key
-#: staff.marc.display.key
-#: staff.patron_display.checkout.done_label.accesskey
-msgid "D"
-msgstr ""
-
-#: staff.checkin.print_receipt_label
-#: staff.hold_capture.print_receipt_label
-msgid "Print List"
-msgstr ""
-
-#: staff.checkin.print_receipt_label.accesskey
-msgid ""
-"_: staff.checkin.print_receipt_label.accesskey\n"
-msgstr ""
-
-#: staff.checkin.reprint_receipt_label
-#: staff.hold_capture.reprint_receipt_label
-msgid "Re-Print Last List"
-msgstr ""
-
-#: staff.checkin_interface_label
-msgid "CHECK IN"
-msgstr ""
-
-#: staff.checkin_label_route_to
-msgid "Route To"
-msgstr ""
-
-#: staff.checkin_label_text
-msgid "Message"
-msgstr ""
-
-#: staff.checkin_patron.name.label
-#: staff.hold_capture_patron.name.label
-#: staff.patron_display.name.label
-msgid "Patron Name"
-msgstr ""
-
-#: staff.checkin_patron.retrieve
-#: staff.hold_capture_patron.retrieve
-#: staff.patron.context_display
-#: staff.patron_navbar.retrieve
-msgid "Retrieve Patron"
-msgstr ""
-
-#: staff.checkout_interface_label
-msgid "CHECK OUT"
-msgstr ""
-
-#: staff.circ.offline.main.label
-msgid "Evergreen Offline"
-msgstr ""
-
-#: staff.circ.offline.server_time.tooltiptext
-msgid "Estimated Server Time - Click to adjust"
-msgstr ""
-
-#: staff.circ.offline.cmd_checkout.label
-#: staff.circ.offline.cmd_checkout.accesskey
-msgid "&Check Out"
-msgstr ""
-
-#: staff.circ.offline.cmd_renew.label
-#: staff.circ.offline.cmd_renew.accesskey
-msgid "&Renew"
-msgstr ""
-
-#: staff.circ.offline.cmd_in_house_use.label
-#: staff.circ.offline.cmd_in_house_use.accesskey
-msgid "In &House Use"
-msgstr ""
-
-#: staff.circ.offline.cmd_checkin.label
-#: staff.circ.offline.cmd_checkin.accesskey
-msgid "Check &In"
-msgstr ""
-
-#: staff.circ.offline.cmd_register_patron.label
-#: staff.circ.offline.cmd_register_patron.accesskey
-msgid "Register &Patron"
-msgstr ""
-
-#: staff.circ.offline.cmd_print_last_receipt.label
-#: staff.circ.offline.cmd_print_last_receipt.accesskey
-msgid "&Last Receipt"
-msgstr ""
-
-#: staff.circ.offline.cmd_exit.label
-#: staff.circ.offline.cmd_exit.accesskey
-msgid "E&xit"
-msgstr ""
-
-#: staff.circ.offline_checkin.main.label
-msgid "Standalone Check In"
-msgstr ""
-
-#: staff.circ.offline_checkin.step3.description
-msgid "Repeat Steps 2 until done."
-msgstr ""
-
-#: staff.circ.offline.finish.description
-#: staff.mbts_xact_finish_label
-msgid "Finish"
-msgstr ""
-
-#: staff.circ.offline.print.description
-msgid "Print receipt?"
-msgstr ""
-
-#: staff.circ.offline_checkout.main.label
-msgid "Standalone Check Out"
-msgstr ""
-
-#: staff.circ.offline_checkout.step2.description
-msgid "Enter the patron's barcode:"
-msgstr ""
-
-#: staff.circ.offline_checkout.step5.description
-#: staff.circ.offline_renew.step5.label
-msgid "Repeat Steps 3 and 4 until done."
-msgstr ""
-
-#: staff.circ.offline_in_house_use.main.label
-msgid "Standalone In House Use"
-msgstr ""
-
-#: staff.circ.offline_in_house_use.uses.label
-msgid "Enter the number of uses for the item:"
-msgstr ""
-
-#: staff.circ.offline_in_house_use.step4.description
-msgid "Repeat Steps 2 and 3 until done."
-msgstr ""
-
-#: staff.circ.offline_register.main.label
-msgid "Standalone Patron Registration"
-msgstr ""
-
-#: staff.circ.offline_register.x_home_ou.label
-#: staff.patron_display.home_ou.label
-msgid "Home Library:"
-msgstr ""
-
-#: staff.circ.offline_register.x_profile.label
-#: staff.patron_display.profile.label
-msgid "Profile:"
-msgstr ""
-
-#: staff.circ.offline_register.barcode.label
-msgid "New Barcode:"
-msgstr ""
-
-#: staff.circ.offline_register.passwd.label
-msgid "New Password:"
-msgstr ""
-
-#: staff.circ.offline_register.family_name.label
-#: staff.patron_display.family_name.label
-msgid "Last Name:"
-msgstr ""
-
-#: staff.circ.offline_register.first_given_name.label
-#: staff.patron_display.first_given_name.label
-#: staff.patron_search_form.first_given_name.label
-msgid "First Name:"
-msgstr ""
-
-#: staff.circ.offline_register.dob.label
-msgid "Date of Birth:"
-msgstr ""
-
-#: staff.circ.offline_register.x_ident_type.label
-msgid "Ident Type:"
-msgstr ""
-
-#: staff.circ.offline_register.ident_value.label
-msgid "Ident Value:"
-msgstr ""
-
-#: staff.circ.offline_register.street1.label
-msgid "Line 1"
-msgstr ""
-
-#: staff.circ.offline_register.street2.label
-msgid "Line 2"
-msgstr ""
-
-#: staff.circ.offline_register.city.label
-msgid "City"
-msgstr ""
-
-#: staff.circ.offline_register.state.label
-msgid "State"
-msgstr ""
-
-#: staff.circ.offline_register.state.default_value
-msgid "GA"
-msgstr ""
-
-#: staff.circ.offline_register.post_code.label
-msgid "Postal Code"
-msgstr ""
-
-#: staff.circ.offline_register.country.label
-msgid "Country"
-msgstr ""
-
-#: staff.circ.offline_register.country.default_value
-msgid "USA"
-msgstr ""
-
-#: staff.circ.offline_register.submit.label
-#: staff.circ.offline_register.submit.accesskey
-msgid "&Save patron registration"
-msgstr ""
-
-#: staff.circ.offline_renew.main.label
-msgid "Standalone Renew"
-msgstr ""
-
-#: staff.circ.offline_renew.p_barcode.description
-msgid "(Optional) Enter the patron's barcode:"
-msgstr ""
-
-#: staff.circ.checkin.caption
-#: staff.circ.context_checkin
-msgid "Check In"
-msgstr ""
-
-#: staff.circ.checkin.scan_label
-#: staff.circ.hold_capture.scan_label
-#: staff.patron_display.checkout.scan_label
-msgid "Enter Barcode:"
-msgstr ""
-
-#: staff.circ.checkin.scan_label.accesskey
-#: staff.circ.hold_capture.scan_label.accesskey
-#: staff.main.menu.cat.key
-#: staff.patron_display.checkout.scan_label.accesskey
-msgid "a"
-msgstr ""
-
-#: staff.circ.context_cancel_hold
-msgid "Cancel Hold"
-msgstr ""
-
-#: staff.circ.context_edit
-msgid "Edit Copy"
-msgstr ""
-
-#: staff.circ.context_lost
-msgid "Mark as Lost"
-msgstr ""
-
-#: staff.circ.context_missing
-msgid "Mark as Missing"
-msgstr ""
-
-#: staff.circ.context_opac
-msgid "Show Title in OPAC"
-msgstr ""
-
-#: staff.circ.context_renew
-#: staff.main.menu.circ.renew.label
-msgid "Renew"
-msgstr ""
-
-#: staff.circ.hold_capture.caption
-msgid "Capture Hold"
-msgstr ""
-
-#: staff.circ_label_due_date
-msgid "Due Date"
-msgstr ""
-
-#: staff.circ_label_id
-msgid "Circ Id"
-msgstr ""
-
-#: staff.circ_label_renewal_remaining
-msgid "Remaining Renewals"
-msgstr ""
-
-#: staff.circ_label_xact_finish
-msgid "Checkin Date"
-msgstr ""
-
-#: staff.circ_label_xact_start
-msgid "Checkout Date"
-msgstr ""
-
-#: staff.copies_editor_interface_label
-msgid "COPIES EDIT"
-msgstr ""
-
-#: staff.copy.attr.circulate
-msgid "Circulate?"
-msgstr ""
-
-#: staff.copy.attr.circulate.no
-#: staff.copy.attr.deposit.no
-#: staff.copy.attr.notes_viewable.example2
-#: staff.copy.attr.opac_visible.no
-#: staff.copy.attr.reference_material.no
-msgid "No"
-msgstr ""
-
-#: staff.copy.attr.circulate.yes
-#: staff.copy.attr.deposit.yes
-#: staff.copy.attr.notes_viewable.example1
-#: staff.copy.attr.opac_visible.yes
-#: staff.copy.attr.reference_material.yes
-msgid "Yes"
-msgstr ""
-
-#: staff.copy.attr.circulating_lib
-msgid "Circulating Library"
-msgstr ""
-
-#: staff.copy.attr.copy_available
-msgid "Copy Status: Available?"
-msgstr ""
-
-#: staff.copy.attr.copy_status
-msgid "Copy Status"
-msgstr ""
-
-#: staff.copy.attr.deposit
-msgid "Deposit?"
-msgstr ""
-
-#: staff.copy.attr.deposit_amount
-msgid "Amount"
-msgstr ""
-
-#: staff.copy.attr.deposit_notes
-msgid "Deposit Notes"
-msgstr ""
-
-#: staff.copy.attr.fine_level.high
-msgid "High"
-msgstr ""
-
-#: staff.copy.attr.fine_level.low
-msgid "Low"
-msgstr ""
-
-#: staff.copy.attr.fine_level.normal
-#: staff.copy.attr.loan_duration.normal
-msgid "Normal"
-msgstr ""
-
-#: staff.copy.attr.holds_protection
-msgid "Holds Protection"
-msgstr ""
-
-#: staff.copy.attr.holds_protection.example1
-msgid "3 months (facility)"
-msgstr ""
-
-#: staff.copy.attr.holds_protection.example2
-msgid "6 months (region)"
-msgstr ""
-
-#: staff.copy.attr.holds_protection.example3
-msgid "No hold protection"
-msgstr ""
-
-#: staff.copy.attr.holds_protection.example4
-msgid "Not holdable"
-msgstr ""
-
-#: staff.copy.attr.home_lib
-msgid "Home Library"
-msgstr ""
-
-#: staff.copy.attr.loan_duration.long
-msgid "Long"
-msgstr ""
-
-#: staff.copy.attr.loan_duration.short
-msgid "Short"
-msgstr ""
-
-#: staff.copy.attr.notes
-msgid "Copy Notes"
-msgstr ""
-
-#: staff.copy.attr.notes_viewable
-msgid "Copy Notes Patron Viewable?"
-msgstr ""
-
-#: staff.copy.attr.opac_visible
-msgid "OPAC Visible?"
-msgstr ""
-
-#: staff.copy.attr.reference_material
-msgid "Reference Material?"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example1
-msgid "Stacks"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example10
-msgid "Paperback"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example2
-msgid "Audio-Visual"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example3
-msgid "Children's Room"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example4
-msgid "Garden Room"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example6
-msgid "Ready Reference"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example7
-msgid "Behind Circulation Desk"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example8
-#: staff.marc.display
-msgid "Display"
-msgstr ""
-
-#: staff.copy.attr.shelving_location.example9
-msgid "Health"
-msgstr ""
-
-#: staff.copy.attr.stat.audience
-msgid "Audience"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example1
-msgid "Adult"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example2
-msgid "Juvenile"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example3
-msgid "Preschool"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example4
-msgid "Primary"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example5
-msgid "Pre-adolescent"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example6
-msgid "Young adult"
-msgstr ""
-
-#: staff.copy.attr.stat.audience.example7
-msgid "General"
-msgstr ""
-
-#: staff.copy.attr.stat.genre
-msgid "Genre"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example1
-msgid "Adventure"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example10
-msgid "Spy"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example11
-msgid "Thriller"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example12
-msgid "War"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example13
-msgid "Western"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example14
-msgid "Religious fiction"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example15
-msgid "Shortstory"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example16
-#: staff.marc.008.BKS.biog.desc
-msgid "Biography"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example17
-#: staff.copy.attr.stat.genre.example4
-msgid "Holiday"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example18
-msgid "Nonfiction"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example2
-msgid "Fantasy"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example3
-msgid "Historical"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example5
-msgid "Horror"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example6
-msgid "Humor"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example7
-msgid "Mystery"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example8
-msgid "Romance"
-msgstr ""
-
-#: staff.copy.attr.stat.genre.example9
-msgid "Sci-fi"
-msgstr ""
-
-#: staff.copy.clone
-msgid "Clone Copy"
-msgstr ""
-
-#: staff.copy.clone.key
-msgid ""
-"_: staff.copy.clone.key\n"
-msgstr ""
-
-#: staff.copy.close
-msgid "Close Window"
-msgstr ""
-
-#: staff.copy.default.attr
-msgid "Default Attributes"
-msgstr ""
-
-#: staff.copy.default.attr.value
-#: staff.copy.local.attr.value
-#: staff.copy.pines.attr.value
-msgid "Value"
-msgstr ""
-
-#: staff.copy.delete
-msgid "Delete Copy"
-msgstr ""
-
-#: staff.copy.delete.key
-msgid ""
-"_: staff.copy.delete.key\n"
-msgstr ""
-
-#: staff.copy.edit_categories
-msgid "Edit Categories"
-msgstr ""
-
-#: staff.copy.edit_entries
-msgid "Edit Entries"
-msgstr ""
-
-#: staff.copy.local.attr
-msgid "Local Attributes"
-msgstr ""
-
-#: staff.copy.notes
-msgid "Note"
-msgstr ""
-
-#: staff.copy.notes.add
-msgid "Add Note"
-msgstr ""
-
-#: staff.copy.notes.date
-msgid "Date"
-msgstr ""
-
-#: staff.copy.notes.delete
-msgid "Delete Note"
-msgstr ""
-
-#: staff.copy.notes.from
-msgid "From"
-msgstr ""
-
-#: staff.copy.pines.attr
-msgid "PINES Attributes"
-msgstr ""
-
-#: staff.copy.reload
-msgid "Reload Copy"
-msgstr ""
-
-#: staff.copy.save
-msgid "Save Copy"
-msgstr ""
-
-#: staff.copy.title
-msgid "Barcode goes here"
-msgstr ""
-
-#: staff.copy.transfer
-msgid "Transfer Copy"
-msgstr ""
-
-#: staff.copy.transfer.key
-msgid ""
-"_: staff.copy.transfer.key\n"
-msgstr ""
-
-#: staff.copy.wizard.title
-msgid "Batch Add Copies Wizard"
-msgstr ""
-
-#: staff.copy_browser_interface_label
-msgid "COPIES"
-msgstr ""
-
-#: staff.copy_stat_cat_editor_interface_label
-msgid "COPY STAT-CATS"
-msgstr ""
-
-#: staff.display_patron_interface_label
-msgid "DISPLAY PATRON"
-msgstr ""
-
-#: staff.displaying.hits_per_page
-msgid "Results per page"
-msgstr ""
-
-#: staff.displaying.results
-msgid "Displaying results"
-msgstr ""
-
-#: staff.fieldmapper_label
-msgid "FIELDMAPPER"
-msgstr ""
-
-#: staff.filter_console_label
-msgid "FCONSOLE"
-msgstr ""
-
-#: staff.hold_capture.print_receipt_label.accesskey
-msgid ""
-"_: staff.hold_capture.print_receipt_label.accesskey\n"
-msgstr ""
-
-#: staff.hold_capture_interface_label
-msgid "HOLD CAPTURE"
-msgstr ""
-
-#: staff.holds_status_available
-msgid "Available"
-msgstr ""
-
-#: staff.holds_status_in_transit
-msgid "In Transit"
-msgstr ""
-
-#: staff.holds_status_waiting_for_capture
-msgid "Copy found, waiting for capture"
-msgstr ""
-
-#: staff.holds_status_waiting_for_copy
-msgid "Waiting for available copy"
-msgstr ""
-
-#: staff.items_out_interface_label
-msgid "ITEMS OUT"
-msgstr ""
-
-#: staff.javascript_console_label
-msgid "CONSOLE"
-msgstr ""
-
-#: staff.javascript_shell_label
-msgid "JS SHELL"
-msgstr ""
-
-#: staff.main.auth.caption
-msgid "Authentication"
-msgstr ""
-
-#: staff.main.auth.caption
-msgid "Startup / Shutdown"
-msgstr ""
-
-#: staff.main.auth.debug.caption
-msgid "Debug Options"
-msgstr ""
-
-#: staff.main.auth.debug.clear
-#: staff.main.menu.admin.clear_cache.label
-msgid "Clear Cache"
-msgstr ""
-
-#: staff.main.auth.debug.javascript
-msgid "Javascript Console"
-msgstr ""
-
-#: staff.main.auth.debug.javascript.accesskey
-msgid "J"
-msgstr ""
-
-#: staff.main.auth.hostname
-msgid "Hostname"
-msgstr ""
-
-#: staff.main.auth.hostname.accesskey
-#: staff.main.menu.circ.hold_capture.key
-#: staff.main.menu.circ.place_hold.key
-#: staff.main.menu.help.key
-#: staff.patron_navbar.holds.accesskey
-msgid "H"
-msgstr ""
-
-#: staff.main.auth.offline.caption
-msgid "Offline Use"
-msgstr ""
-
-#: staff.main.auth.offline.export
-msgid "Export Transactions"
-msgstr ""
-
-#: staff.main.auth.offline.import
-msgid "Import Transactions"
-msgstr ""
-
-#: staff.main.auth.offline.interface
-msgid "Standalone Interface"
-msgstr ""
-
-#: staff.main.auth.retest
-msgid "Re-Test Server"
-msgstr ""
-
-#: staff.main.auth.server
-msgid "Server"
-msgstr ""
-
-#: staff.main.auth.version
-msgid "Version"
-msgstr ""
-
-#: staff.main.auth.workstation
-msgid "Workstation"
-msgstr ""
-
-#: staff.main.menu.acquisitions.key
-msgid "q"
-msgstr ""
-
-#: staff.main.menu.acquisitions.label
-msgid "Acquisitions"
-msgstr ""
-
-#: staff.main.menu.admin.accesskey
-#: staff.main.menu.admin.developer.accesskey
-msgid "-"
-msgstr ""
-
-#: staff.main.menu.admin.browse_holds.label
-#: staff.main.menu.admin.browse_holds.accesskey
-msgid "&Browse Unfulfilled Holds for this Pickup Lib"
-msgstr ""
-
-#: staff.main.menu.admin.change_session.label
-msgid "Operator Change: New"
-msgstr ""
-
-#: staff.main.menu.admin.clear_cache.accesskey
-#: staff.marc.008.SER.cont.field_size
-#: staff.marc.008.ctry.field_size
-#: staff.marc.008.lang.field_size
-msgid "3"
-msgstr ""
-
-#: staff.main.menu.admin.cmd_console.label
-#: staff.main.menu.admin.cmd_console.accesskey
-msgid "&Javascript Console"
-msgstr ""
-
-#: staff.main.menu.admin.cmd_shell.label
-#: staff.main.menu.admin.cmd_shell.accesskey
-msgid "Javascript S&hell"
-msgstr ""
-
-#: staff.main.menu.admin.cmd_test.label
-msgid "Test Module"
-msgstr ""
-
-#: staff.main.menu.admin.copy_location_edit.label
-#: staff.main.menu.admin.copy_location_edit.accesskey
-msgid "Copy &Location Editor"
-msgstr ""
-
-#: staff.main.menu.admin.developer.label
-msgid "For developers..."
-msgstr ""
-
-#: staff.main.menu.admin.download_patrons.label
-#: staff.main.menu.admin.download_patrons.accesskey
-msgid "&Download Offline Patron List"
-msgstr ""
-
-#: staff.main.menu.admin.fieldmapper.label
-#: staff.main.menu.admin.fieldmapper.accesskey
-msgid "Field&mapper"
-msgstr ""
-
-#: staff.main.menu.admin.key
-msgid "i"
-msgstr ""
-
-#: staff.main.menu.admin.label
-msgid "Admin"
-msgstr ""
-
-#: staff.main.menu.admin.local_admin.label
-#: staff.main.menu.admin.local_admin.accesskey
-msgid "&Local System Administration"
-msgstr ""
-
-#: staff.main.menu.admin.non_cat_type_edit.label
-#: staff.main.menu.admin.non_cat_type_edit.accesskey
-msgid "&Non-Cataloged Type Editor"
-msgstr ""
-
-#: staff.main.menu.admin.offline_xacts.label
-#: staff.main.menu.admin.offline_xacts.accesskey
-msgid "Offline &Transaction Management"
-msgstr ""
-
-#: staff.main.menu.admin.public_opac.label
-#: staff.main.menu.admin.public_opac.accesskey
-msgid "&Public OPAC"
-msgstr ""
-
-#: staff.main.menu.admin.restore_all_tabs.label
-msgid "Unhide Tabs"
-msgstr ""
-
-#: staff.main.menu.admin.extension_manager.label
-msgid "Extension Manager"
-msgstr ""
-
-#: staff.main.menu.admin.theme_manager.label
-msgid "Theme Manager"
-msgstr ""
-
-#: staff.main.menu.admin.about_config.label
-msgid "about:config"
-msgstr ""
-
-#: staff.main.menu.admin.stat_cat_edit.label
-#: staff.main.menu.admin.stat_cat_edit.accesskey
-msgid "Statistical &Category Editor"
-msgstr ""
-
-#: staff.main.menu.admin.survey_wizard.label
-#: staff.main.menu.admin.survey_wizard.accesskey
-msgid "&Survey Wizard"
-msgstr ""
-
-#: staff.main.menu.admin.template_edit.label
-#: staff.main.menu.admin.template_edit.accesskey
-msgid "&Receipt Template Editor"
-msgstr ""
-
-#: staff.main.menu.admin.user_edit.label
-#: staff.main.menu.admin.user_edit.accesskey
-msgid "&User Permission Editor"
-msgstr ""
-
-#: staff.main.menu.admin.xuleditor.label
-#: staff.main.menu.admin.xuleditor.accesskey
-msgid "&XUL Test"
-msgstr ""
-
-#: staff.main.menu.admin.venkman.label
-msgid "Venkman"
-msgstr ""
-
-#: staff.main.menu.cat.label
-#: staff.main.menu.cat.accesskey
-msgid "Catalo&ging"
-msgstr ""
-
-#: staff.main.menu.cat.add_bib.label
-msgid "Add Bib Record"
-msgstr ""
-
-#: staff.main.menu.cat.add_copy.key
-#: staff.main.menu.cat.copy_status.key
-#: staff.main.menu.circ.copy_status.key
-#: staff.patron_navbar.items.accesskey
-msgid "I"
-msgstr ""
-
-#: staff.main.menu.cat.add_copy.label
-msgid "Add Item"
-msgstr ""
-
-#: staff.main.menu.cat.add_volume.label
-msgid "Add Volume"
-msgstr ""
-
-#: staff.main.menu.cat.bib_search.label
-msgid "Search the Catalog"
-msgstr ""
-
-#: staff.main.menu.cat.bib_status.label
-msgid "Display Bib Record"
-msgstr ""
-
-#: staff.main.menu.cat.copy_status.label
-#: staff.main.menu.circ.copy_status.label
-msgid "Display Item"
-msgstr ""
-
-#: staff.main.menu.cat.create_marc.label
-#: staff.main.menu.cat.create_marc.accesskey
-msgid "Create &New Marc Record"
-msgstr ""
-
-#: staff.main.menu.cat.dedup.label
-msgid "Merge/Transfer Interface"
-msgstr ""
-
-#: staff.main.menu.cat.edit_copy_buckets.label
-#: staff.main.menu.cat.edit_copy_buckets.accesskey
-msgid "Manage Copy &Buckets"
-msgstr ""
-
-#: staff.main.menu.cat.edit_record_buckets.label
-#: staff.main.menu.cat.edit_record_buckets.accesskey
-msgid "Manage &Record Buckets"
-msgstr ""
-
-#: staff.main.menu.cat.edit_volume_buckets.label
-#: staff.main.menu.cat.edit_volume_buckets.accesskey
-msgid "Manage &Volume Buckets"
-msgstr ""
-
-#: staff.main.menu.cat.edit_user_buckets.label
-#: staff.main.menu.cat.edit_user_buckets.accesskey
-msgid "Manage &User Buckets"
-msgstr ""
-
-#: staff.main.menu.cat.retrieve_last_record.label
-#: staff.main.menu.cat.retrieve_last_record.accesskey
-msgid "Retrieve &Last Record"
-msgstr ""
-
-#: staff.main.menu.cat.search_tcn.label
-#: staff.main.menu.cat.search_tcn.accesskey
-msgid "Retrieve record by &TCN"
-msgstr ""
-
-#: staff.main.menu.cat.volume_status.label
-msgid "Display Volume"
-msgstr ""
-
-#: staff.main.menu.cat.z39_50_import.label
-#: staff.main.menu.cat.z39_50_import.accesskey
-msgid "Import Record from &Z39.50"
-msgstr ""
-
-#: staff.main.menu.circ.barcode.retrieve_patron
-msgid "Retrieve Patron by Barcode"
-msgstr ""
-
-#: staff.main.menu.circ.barcode.show_item
-msgid "Show Item Status by Barcode"
-msgstr ""
-
-#: staff.main.menu.circ.checkin.label
-msgid "Check In Items"
-msgstr ""
-
-#: staff.main.menu.circ.checkout.label
-msgid "Check Out Items"
-msgstr ""
-
-#: staff.main.menu.circ.claimed_returned.label
-msgid "Mark as \"Claimed Returned\""
-msgstr ""
-
-#: staff.main.menu.circ.found.label
-msgid "Mark Found"
-msgstr ""
-
-#: staff.main.menu.circ.hold_browse.label
-#: staff.main.menu.circ.hold_browse.accesskey
-msgid "&Browse Holds Shelf"
-msgstr ""
-
-#: staff.main.menu.circ.hold_capture.label
-msgid "Capture Holds"
-msgstr ""
-
-#: staff.main.menu.circ.hold_pull.label
-#: staff.main.menu.circ.hold_pull.accesskey
-msgid "Pull Li&st for Hold Requests"
-msgstr ""
-
-#: staff.main.menu.circ.in_house.label
-#: staff.main.menu.circ.in_house.accesskey
-msgid "Record &In-House Use"
-msgstr ""
-
-#: staff.main.menu.circ.label
-msgid "Circulation"
-msgstr ""
-
-#: staff.main.menu.circ.lost.label
-msgid "Mark Lost"
-msgstr ""
-
-#: staff.main.menu.circ.mark_used.key
-#: staff.main.menu.edit.buckets.users.accesskey
-#: staff.main.menu.edit.undo.key
-msgid "U"
-msgstr ""
-
-#: staff.main.menu.circ.mark_used.label
-msgid "Mark Used"
-msgstr ""
-
-#: staff.main.menu.circ.missing.label
-msgid "Mark Missing"
-msgstr ""
-
-#: staff.main.menu.circ.offline.label
-#: staff.main.menu.circ.offline.accesskey
-msgid "Enter O&ffline Interface"
-msgstr ""
-
-#: staff.main.menu.circ.patron_registration.label
-msgid "Register Patron"
-msgstr ""
-
-#: staff.main.menu.circ.patron_retrieve.label
-#: staff.main.menu.circ.patron_retrieve.accesskey
-msgid "Retrieve &Last Patron"
-msgstr ""
-
-#: staff.main.menu.circ.patron_status.label
-msgid "Display Patron"
-msgstr ""
-
-#: staff.main.menu.circ.place_hold.label
-#: staff.main.menu.circ.place_hold.accesskey
-msgid "Place &Hold"
-msgstr ""
-
-#: staff.main.menu.circ.quick_add.key
-#: staff.main.menu.quit.accesskey
-msgid "Q"
-msgstr ""
-
-#: staff.main.menu.circ.quick_add.label
-msgid "Quick Add"
-msgstr ""
-
-#: staff.main.menu.circ.renew.key
-msgid "n"
-msgstr ""
-
-#: staff.main.menu.circ.reprint.label
-#: staff.main.menu.circ.reprint.accesskey
-msgid "Re-Print &Last"
-msgstr ""
-
-#: staff.main.menu.circ.special.label
-msgid "Special Circulation"
-msgstr ""
-
-#: staff.main.menu.edit.buckets.copies
-msgid "Copy Buckets"
-msgstr ""
-
-#: staff.main.menu.edit.buckets.label
-msgid "Manage Buckets"
-msgstr ""
-
-#: staff.main.menu.edit.buckets.records
-msgid "Record Buckets"
-msgstr ""
-
-#: staff.main.menu.edit.buckets.volumes
-msgid "Volume Buckets"
-msgstr ""
-
-#: staff.main.menu.edit.buckets.users
-msgid "User Buckets"
-msgstr ""
-
-#: staff.main.menu.edit.copy.label
-msgid "Copy"
-msgstr ""
-
-#: staff.main.menu.edit.cut.key
-msgid "t"
-msgstr ""
-
-#: staff.main.menu.edit.cut.label
-msgid "Cut"
-msgstr ""
-
-#: staff.main.menu.edit.delete.label
-msgid "Delete"
-msgstr ""
-
-#: staff.main.menu.edit.find.label
-msgid "Find"
-msgstr ""
-
-#: staff.main.menu.edit.find_again.key
-msgid "g"
-msgstr ""
-
-#: staff.main.menu.edit.find_again.label
-msgid "Find Again"
-msgstr ""
-
-#: staff.main.menu.edit.label
-#: staff.patron_navbar.edit
-msgid "Edit"
-msgstr ""
-
-#: staff.main.menu.edit.paste.label
-msgid "Paste"
-msgstr ""
-
-#: staff.main.menu.edit.redo.label
-msgid "Redo"
-msgstr ""
-
-#: staff.main.menu.edit.select_all.label
-msgid "Select All"
-msgstr ""
-
-#: staff.main.menu.edit.undo.label
-msgid "Undo"
-msgstr ""
-
-#: staff.main.menu.entity.bib.key
-msgid ""
-"_: staff.main.menu.entity.bib.key\n"
-msgstr ""
-
-#: staff.main.menu.entity.bib.label
-msgid "Bib Records"
-msgstr ""
-
-#: staff.main.menu.entity.copy.key
-msgid ""
-"_: staff.main.menu.entity.copy.key\n"
-msgstr ""
-
-#: staff.main.menu.entity.copy.label
-msgid "Items"
-msgstr ""
-
-#: staff.main.menu.entity.patron.key
-msgid ""
-"_: staff.main.menu.entity.patron.key\n"
-msgstr ""
-
-#: staff.main.menu.entity.patron.label
-msgid "Patrons"
-msgstr ""
-
-#: staff.main.menu.entity.volume.key
-msgid ""
-"_: staff.main.menu.entity.volume.key\n"
-msgstr ""
-
-#: staff.main.menu.entity.volume.label
-msgid "Volumes"
-msgstr ""
-
-#: staff.main.menu.file.close.label
-#: staff.main.menu.file.close.accesskey
-msgid "Close &Window"
-msgstr ""
-
-#: staff.main.menu.file.close_tab.label
-#: staff.main.menu.file.close_tab.accesskey
-msgid "&Close Tab"
-msgstr ""
-
-#: staff.main.menu.file.close_tab.key
-msgid ""
-"_: staff.main.menu.file.close_tab.key\n"
-msgstr ""
-
-#: staff.main.menu.file.label
-msgid "File"
-msgstr ""
-
-#: staff.main.menu.file.new.label
-msgid "New Window"
-msgstr ""
-
-#: staff.main.menu.file.new_tab.label
-msgid "New Tab"
-msgstr ""
-
-#: staff.main.menu.file.open.label
-msgid "Open Session"
-msgstr ""
-
-#: staff.main.menu.file.save.label
-msgid "Save Session"
-msgstr ""
-
-#: staff.main.menu.help.label
-msgid "Help"
-msgstr ""
-
-#: staff.main.menu.quit
-msgid "Quit Program"
-msgstr ""
-
-#: staff.main.menu.replace_barcode.label
-msgid "Replace Barcode"
-msgstr ""
-
-#: staff.main.menu.reports.key
-msgid ""
-"_: staff.main.menu.reports.key\n"
-msgstr ""
-
-#: staff.main.menu.reports.label
-msgid "Reports"
-msgstr ""
-
-#: staff.main.menu.search.catalog.label
-#: staff.main.menu.search.catalog.accesskey
-msgid "the &Catalog"
-msgstr ""
-
-#: staff.main.menu.search.copies.label
-#: staff.main.menu.search.copies.accesskey
-msgid "for copies by &Barcode"
-msgstr ""
-
-#: staff.main.menu.search.key
-msgid "r"
-msgstr ""
-
-#: staff.main.menu.search.patrons.label
-#: staff.main.menu.search.patrons.accesskey
-msgid "for &Patrons"
-msgstr ""
-
-#: staff.main.menu.search.patrons_barcode.label
-#: staff.main.menu.search.patrons_barcode.accesskey
-msgid "for patro&n by Barcode"
-msgstr ""
-
-#: staff.main.menu.search.record.label
-#: staff.main.menu.search.record.accesskey
-msgid "for record by &TCN"
-msgstr ""
-
-#: staff.main.menu.serials.key
-msgid "l"
-msgstr ""
-
-#: staff.main.menu.serials.label
-#: staff.z39_50.search_class.item_type.ser
-msgid "Serials"
-msgstr ""
-
-#: staff.main.menu.tabs.close
-msgid "Close All Tabs"
-msgstr ""
-
-#: staff.main.menu.title
-msgid "Evergreen Staff Client"
-msgstr ""
-
-#: staff.main.simple_auth.authorization.label
-msgid "Authorization"
-msgstr ""
-
-#: staff.main.simple_auth.authorize.label
-#: staff.main.simple_auth.authorize.accesskey
-msgid "&Authorization"
-msgstr ""
-
-#: staff.main.simple_auth.exception.label
-msgid "Exception"
-msgstr ""
-
-#: staff.main.test.example_template.label
-msgid "Hello world!"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.desc
-msgid "Index"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.field
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field
-#: staff.marc.008.BKS.SER.conf.field
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field
-#: staff.marc.008.BKS.biog.field
-#: staff.marc.008.BKS.cont.field
-#: staff.marc.008.BKS.fest.field
-#: staff.marc.008.BKS.ills.field
-#: staff.marc.008.BKS.litf.field
-#: staff.marc.008.MAP.VIS.form.field
-#: staff.marc.008.SER.alph.field
-#: staff.marc.008.SER.cont.field
-#: staff.marc.008.SER.entw.field
-#: staff.marc.008.SER.freq.field
-#: staff.marc.008.SER.issn.field
-#: staff.marc.008.SER.orig.field
-#: staff.marc.008.SER.regl.field
-#: staff.marc.008.SER.srtp.field
-#: staff.marc.008.SER.succ.field
-#: staff.marc.008.ctry.field
-#: staff.marc.008.date1.field
-#: staff.marc.008.date2.field
-#: staff.marc.008.dtst.field
-#: staff.marc.008.entered.field
-#: staff.marc.008.lang.field
-#: staff.marc.008.mrec.field
-#: staff.marc.008.srce.field
-msgid "008"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.field_end_pos
-#: staff.marc.008.BKS.MAP.indx.field_start_pos
-msgid "31"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.field_size
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_size
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_size
-#: staff.marc.008.BKS.SER.conf.field_size
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_size
-#: staff.marc.008.BKS.biog.field_size
-#: staff.marc.008.BKS.fest.field_size
-#: staff.marc.008.BKS.litf.field_size
-#: staff.marc.008.MAP.VIS.form.field_size
-#: staff.marc.008.SER.alph.field_size
-#: staff.marc.008.SER.entw.field_size
-#: staff.marc.008.SER.freq.field_size
-#: staff.marc.008.SER.issn.field_size
-#: staff.marc.008.SER.orig.field_size
-#: staff.marc.008.SER.regl.field_size
-#: staff.marc.008.SER.srtp.field_size
-#: staff.marc.008.SER.succ.field_size
-#: staff.marc.008.dtst.field_size
-#: staff.marc.008.mrec.field_size
-#: staff.marc.008.srce.field_size
-#: staff.marc.LDR.blvl.field_size
-#: staff.marc.LDR.ctrl.field_size
-#: staff.marc.LDR.desc.field_size
-#: staff.marc.LDR.elvl.field_size
-#: staff.marc.LDR.rec_stat.field_size
-#: staff.marc.LDR.type.field_size
-msgid "1"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/indx.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.MAP.indx.short
-msgid "Indx"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.desc
-#: staff.marc.008.MAP.VIS.form.desc
-msgid "Form of Item"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_end_pos
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.field_start_pos
-msgid "23"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.help
-#: staff.marc.008.MAP.VIS.form.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/form.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.MIX.SCO.REC.form.short
-#: staff.marc.008.MAP.VIS.form.short
-msgid "Form"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.desc
-msgid "Government Publication"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_end_pos
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.field_start_pos
-msgid "28"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/gpub.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.VIS.MAP.COM.gpub.short
-msgid "GPub"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.conf.desc
-msgid "Conference Publication"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.conf.field_end_pos
-#: staff.marc.008.BKS.SER.conf.field_start_pos
-#: staff.marc.008.MAP.VIS.form.field_end_pos
-#: staff.marc.008.MAP.VIS.form.field_start_pos
-msgid "29"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.conf.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/conf.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.SER.conf.short
-msgid "Conf"
-msgstr ""
-
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.desc
-msgid "Target Audience"
-msgstr ""
-
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_end_pos
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.field_start_pos
-#: staff.marc.008.SER.orig.field_end_pos
-#: staff.marc.008.SER.orig.field_start_pos
-msgid "22"
-msgstr ""
-
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/audn.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.VIS.SCO.REC.COM.audn.short
-msgid "Audn"
-msgstr ""
-
-#: staff.marc.008.BKS.biog.field_end_pos
-#: staff.marc.008.BKS.biog.field_start_pos
-#: staff.marc.008.SER.succ.field_end_pos
-#: staff.marc.008.SER.succ.field_start_pos
-msgid "34"
-msgstr ""
-
-#: staff.marc.008.BKS.biog.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/biog.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.biog.short
-msgid "Biog"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.desc
-#: staff.marc.008.SER.cont.desc
-msgid "Nature of Contents"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.field_end_pos
-#: staff.marc.008.SER.cont.field_end_pos
-msgid "27"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.field_size
-#: staff.marc.008.BKS.ills.field_size
-#: staff.marc.008.date1.field_size
-#: staff.marc.008.date2.field_size
-msgid "4"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.field_start_pos
-#: staff.marc.008.SER.entw.field_end_pos
-#: staff.marc.008.SER.entw.field_start_pos
-msgid "24"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.help
-#: staff.marc.008.SER.cont.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/cont.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.cont.short
-#: staff.marc.008.SER.cont.short
-msgid "Cont"
-msgstr ""
-
-#: staff.marc.008.BKS.fest.desc
-msgid "Festschrift"
-msgstr ""
-
-#: staff.marc.008.BKS.fest.field_end_pos
-#: staff.marc.008.BKS.fest.field_start_pos
-msgid "30"
-msgstr ""
-
-#: staff.marc.008.BKS.fest.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/fest.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.fest.short
-msgid "Fest"
-msgstr ""
-
-#: staff.marc.008.BKS.ills.desc
-msgid "Illustrations"
-msgstr ""
-
-#: staff.marc.008.BKS.ills.field_end_pos
-#: staff.marc.008.SER.srtp.field_end_pos
-#: staff.marc.008.SER.srtp.field_start_pos
-msgid "21"
-msgstr ""
-
-#: staff.marc.008.BKS.ills.field_start_pos
-#: staff.marc.008.SER.freq.field_end_pos
-#: staff.marc.008.SER.freq.field_start_pos
-#: staff.marc.LDR.desc.field_end_pos
-#: staff.marc.LDR.desc.field_start_pos
-msgid "18"
-msgstr ""
-
-#: staff.marc.008.BKS.ills.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/ills.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.ills.short
-msgid "Ills"
-msgstr ""
-
-#: staff.marc.008.BKS.litf.desc
-msgid "Literary Form"
-msgstr ""
-
-#: staff.marc.008.BKS.litf.field_end_pos
-#: staff.marc.008.BKS.litf.field_start_pos
-#: staff.marc.008.SER.alph.field_end_pos
-#: staff.marc.008.SER.alph.field_start_pos
-msgid "33"
-msgstr ""
-
-#: staff.marc.008.BKS.litf.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/litf.shtm"
-msgstr ""
-
-#: staff.marc.008.BKS.litf.short
-msgid "LitF"
-msgstr ""
-
-#: staff.marc.008.SER.alph.desc
-msgid "Original Alphabet or Script of Title"
-msgstr ""
-
-#: staff.marc.008.SER.alph.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/alph.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.alph.short
-msgid "Alph"
-msgstr ""
-
-#: staff.marc.008.SER.cont.field_start_pos
-msgid "25"
-msgstr ""
-
-#: staff.marc.008.SER.entw.desc
-msgid "Nature of Entire Work"
-msgstr ""
-
-#: staff.marc.008.SER.entw.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/entw.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.entw.short
-msgid "EntW"
-msgstr ""
-
-#: staff.marc.008.SER.freq.desc
-msgid "Frequency"
-msgstr ""
-
-#: staff.marc.008.SER.freq.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/freq.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.freq.short
-msgid "Freq"
-msgstr ""
-
-#: staff.marc.008.SER.issn.desc
-msgid "ISSN Center"
-msgstr ""
-
-#: staff.marc.008.SER.issn.field_end_pos
-#: staff.marc.008.SER.issn.field_start_pos
-msgid "20"
-msgstr ""
-
-#: staff.marc.008.SER.issn.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/issn.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.issn.short
-#: staff.record_list.issn
-#: staff.z39_50.search_class.issn
-msgid "ISSN"
-msgstr ""
-
-#: staff.marc.008.SER.orig.desc
-msgid "Form of Original Item"
-msgstr ""
-
-#: staff.marc.008.SER.orig.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/orig.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.orig.short
-msgid "Orig"
-msgstr ""
-
-#: staff.marc.008.SER.regl.desc
-msgid "Regularity"
-msgstr ""
-
-#: staff.marc.008.SER.regl.field_end_pos
-#: staff.marc.008.SER.regl.field_start_pos
-msgid "19"
-msgstr ""
-
-#: staff.marc.008.SER.regl.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/regl.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.regl.short
-msgid "Regl"
-msgstr ""
-
-#: staff.marc.008.SER.srtp.desc
-msgid "Type of Continuing Resource"
-msgstr ""
-
-#: staff.marc.008.SER.srtp.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/srtp.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.srtp.short
-msgid "SrTp"
-msgstr ""
-
-#: staff.marc.008.SER.succ.desc
-msgid "Entry Convention"
-msgstr ""
-
-#: staff.marc.008.SER.succ.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/succ.shtm"
-msgstr ""
-
-#: staff.marc.008.SER.succ.short
-msgid "S/L"
-msgstr ""
-
-#: staff.marc.008.ctry.desc
-msgid "Country of Publication, etc."
-msgstr ""
-
-#: staff.marc.008.ctry.field_end_pos
-#: staff.marc.LDR.elvl.field_end_pos
-#: staff.marc.LDR.elvl.field_start_pos
-msgid "17"
-msgstr ""
-
-#: staff.marc.008.ctry.field_start_pos
-msgid "15"
-msgstr ""
-
-#: staff.marc.008.ctry.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/ctry.shtm"
-msgstr ""
-
-#: staff.marc.008.ctry.short
-msgid "Ctry"
-msgstr ""
-
-#: staff.marc.008.date1.desc
-#: staff.marc.008.date1.short
-msgid "Date 1"
-msgstr ""
-
-#: staff.marc.008.date1.field_end_pos
-msgid "10"
-msgstr ""
-
-#: staff.marc.008.date1.field_start_pos
-#: staff.marc.LDR.blvl.field_end_pos
-#: staff.marc.LDR.blvl.field_start_pos
-msgid "7"
-msgstr ""
-
-#: staff.marc.008.date2.desc
-#: staff.marc.008.date2.short
-msgid "Date 2"
-msgstr ""
-
-#: staff.marc.008.date2.field_end_pos
-msgid "14"
-msgstr ""
-
-#: staff.marc.008.date2.field_start_pos
-msgid "11"
-msgstr ""
-
-#: staff.marc.008.dates
-msgid "Dates"
-msgstr ""
-
-#: staff.marc.008.dates.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/dates.shtm"
-msgstr ""
-
-#: staff.marc.008.dtst.desc
-msgid "Type of Date/Publication Status"
-msgstr ""
-
-#: staff.marc.008.dtst.field_end_pos
-#: staff.marc.008.dtst.field_start_pos
-#: staff.marc.008.entered.field_size
-#: staff.marc.LDR.type.field_end_pos
-#: staff.marc.LDR.type.field_start_pos
-msgid "6"
-msgstr ""
-
-#: staff.marc.008.dtst.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/dtst.shtm"
-msgstr ""
-
-#: staff.marc.008.dtst.short
-msgid "DtSt"
-msgstr ""
-
-#: staff.marc.008.entered.desc
-msgid "Date Entered"
-msgstr ""
-
-#: staff.marc.008.entered.field_end_pos
-#: staff.marc.LDR.rec_stat.field_end_pos
-#: staff.marc.LDR.rec_stat.field_start_pos
-msgid "5"
-msgstr ""
-
-#: staff.marc.008.entered.field_start_pos
-msgid "0"
-msgstr ""
-
-#: staff.marc.008.entered.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/entered.shtm"
-msgstr ""
-
-#: staff.marc.008.entered.short
-msgid "Entered"
-msgstr ""
-
-#: staff.marc.008.lang.desc
-msgid "Language Code"
-msgstr ""
-
-#: staff.marc.008.lang.field_end_pos
-msgid "37"
-msgstr ""
-
-#: staff.marc.008.lang.field_start_pos
-msgid "35"
-msgstr ""
-
-#: staff.marc.008.lang.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/lang.shtm"
-msgstr ""
-
-#: staff.marc.008.lang.short
-msgid "Lang"
-msgstr ""
-
-#: staff.marc.008.mrec.desc
-msgid "Modified Record"
-msgstr ""
-
-#: staff.marc.008.mrec.field_end_pos
-#: staff.marc.008.mrec.field_start_pos
-msgid "38"
-msgstr ""
-
-#: staff.marc.008.mrec.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/mrec.shtm"
-msgstr ""
-
-#: staff.marc.008.mrec.short
-msgid "MRec"
-msgstr ""
-
-#: staff.marc.008.srce.desc
-msgid "Cataloging Source"
-msgstr ""
-
-#: staff.marc.008.srce.field_end_pos
-#: staff.marc.008.srce.field_start_pos
-msgid "39"
-msgstr ""
-
-#: staff.marc.008.srce.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/srce.shtm"
-msgstr ""
-
-#: staff.marc.008.srce.short
-msgid "Srce"
-msgstr ""
-
-#: staff.marc.LDR.blvl.desc
-msgid "Bibliographic Level"
-msgstr ""
-
-#: staff.marc.LDR.blvl.field
-#: staff.marc.LDR.ctrl.field
-#: staff.marc.LDR.desc.field
-#: staff.marc.LDR.elvl.field
-#: staff.marc.LDR.rec_stat.field
-#: staff.marc.LDR.type.field
-msgid "LDR"
-msgstr ""
-
-#: staff.marc.LDR.blvl.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/blvl.shtm"
-msgstr ""
-
-#: staff.marc.LDR.blvl.short
-msgid "BLvl"
-msgstr ""
-
-#: staff.marc.LDR.ctrl.desc
-msgid "Type of Control"
-msgstr ""
-
-#: staff.marc.LDR.ctrl.field_end_pos
-#: staff.marc.LDR.ctrl.field_start_pos
-msgid "8"
-msgstr ""
-
-#: staff.marc.LDR.ctrl.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/ctrl.shtm"
-msgstr ""
-
-#: staff.marc.LDR.ctrl.short
-msgid "Ctrl"
-msgstr ""
-
-#: staff.marc.LDR.desc.desc
-msgid "Descriptive Cataloging Form"
-msgstr ""
-
-#: staff.marc.LDR.desc.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/desc.shtm"
-msgstr ""
-
-#: staff.marc.LDR.desc.short
-msgid "Desc"
-msgstr ""
-
-#: staff.marc.LDR.elvl.desc
-msgid "Encoding Level"
-msgstr ""
-
-#: staff.marc.LDR.elvl.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/elvl.shtm"
-msgstr ""
-
-#: staff.marc.LDR.elvl.short
-msgid "ELvl"
-msgstr ""
-
-#: staff.marc.LDR.rec_stat.desc
-msgid "Record Status"
-msgstr ""
-
-#: staff.marc.LDR.rec_stat.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/rec.shtm"
-msgstr ""
-
-#: staff.marc.LDR.rec_stat.short
-msgid "Rec stat"
-msgstr ""
-
-#: staff.marc.LDR.type.desc
-msgid "Type of Record"
-msgstr ""
-
-#: staff.marc.LDR.type.help
-msgid "http://www.oclc.org/bibformats/en/fixedfield/type.shtm"
-msgstr ""
-
-#: staff.marc.close.editor.key
-msgid "W"
-msgstr ""
-
-#: staff.marc.display.control_fields
-msgid "Toggle Control/Data Fields"
-msgstr ""
-
-#: staff.marc.display.cover_art
-msgid "Toggle Cover Art"
-msgstr ""
-
-#: staff.marc.display.explain
-msgid "Explain Errors"
-msgstr ""
-
-#: staff.marc.display.explain.key
-msgid "X"
-msgstr ""
-
-#: staff.marc.display.fixed.BKS
-msgid "Fixed Fields as BKS"
-msgstr ""
-
-#: staff.marc.display.fixed.COM
-msgid "Fixed Fields as COM"
-msgstr ""
-
-#: staff.marc.display.fixed.MAP
-msgid "Fixed Fields as MAP"
-msgstr ""
-
-#: staff.marc.display.fixed.MIX
-msgid "Fixed Fields as MIX"
-msgstr ""
-
-#: staff.marc.display.fixed.REC
-msgid "Fixed Fields as REC"
-msgstr ""
-
-#: staff.marc.display.fixed.SCO
-msgid "Fixed Fields as SCO"
-msgstr ""
-
-#: staff.marc.display.fixed.SER
-msgid "Fixed Fields as SER"
-msgstr ""
-
-#: staff.marc.display.fixed.VIS
-msgid "Fixed Fields as VIS"
-msgstr ""
-
-#: staff.marc.display.legend
-msgid "Legend"
-msgstr ""
-
-#: staff.marc.display.meta_data
-msgid "Toggle Meta Data"
-msgstr ""
-
-#: staff.marc.editor.keys.help
-msgid "Control+D = Delimiter Symbol ; Control+Enter = Insert Row ; Control+Delete = Delete Row;"
-msgstr ""
-
-#: staff.marc.file
-#: staff.marc_editor_interface_label
-msgid "MARC"
-msgstr ""
-
-#: staff.marc.file.close
-msgid "Close Editor"
-msgstr ""
-
-#: staff.marc.file.export
-msgid "Export"
-msgstr ""
-
-#: staff.marc.file.publish
-msgid "Save (to DB)"
-msgstr ""
-
-#: staff.marc.file.reload
-msgid "Reload"
-msgstr ""
-
-#: staff.marc.file.validate
-msgid "Validate"
-msgstr ""
-
-#: staff.marc.groupbox.control
-msgid "Control Fields"
-msgstr ""
-
-#: staff.marc.groupbox.cover
-msgid "Cover Art"
-msgstr ""
-
-#: staff.marc.groupbox.data
-msgid "Data Fields"
-msgstr ""
-
-#: staff.marc.groupbox.fixed
-msgid "Fixed Fields"
-msgstr ""
-
-#: staff.marc.groupbox.meta
-msgid "Meta Data (NOT YET IMPLEMENTED)"
-msgstr ""
-
-#: staff.mbts_balance_owed_label
-msgid "Balance Owed"
-msgstr ""
-
-#: staff.mbts_id_label
-msgid "Bill # "
-msgstr ""
-
-#: staff.mbts_total_owed_label
-msgid "Total Billed"
-msgstr ""
-
-#: staff.mbts_total_paid_label
-msgid "Total Paid"
-msgstr ""
-
-#: staff.mbts_xact_start_label
-msgid "Start"
-msgstr ""
-
-#: staff.mvr_label_doc_id
-msgid "Doc Id"
-msgstr ""
-
-#: staff.next.range
-msgid "Next"
-msgstr ""
-
-#: staff.opac_navigator_interface_label
-msgid "CATALOG NAVIGATOR"
-msgstr ""
-
-#: staff.patron_barcode_entry_interface_label
-#: staff.patron_display_interface_label
-msgid "PATRON"
-msgstr ""
-
-#: staff.patron_display.bills.label
-msgid "Bills:"
-msgstr ""
-
-#: staff.patron_display.checkout.print_receipt_label
-#: staff.patron_display.items.print_receipt_label
-msgid "Print Receipt"
-msgstr ""
-
-#: staff.patron_display.checkout.print_receipt_label.accesskey
-msgid ""
-"_: staff.patron_display.checkout.print_receipt_label.accesskey\n"
-msgstr ""
-
-#: staff.patron_display.checkout.reprint_receipt_label
-msgid "Re-Print Last Receipt"
-msgstr ""
-
-#: staff.patron_display.checkouts.label
-msgid "Check Outs:"
-msgstr ""
-
-#: staff.patron_display.checkouts_overdue.label
-msgid "Overdue:"
-msgstr ""
-
-#: staff.patron_display.contact.caption
-msgid "Identity &amp; Contact Info"
-msgstr ""
-
-#: staff.patron_display.credit.label
-msgid "Credit:"
-msgstr ""
-
-#: staff.patron_display.date_of_birth.label
-msgid "DOB:"
-msgstr ""
-
-#: staff.patron_display.day_phone.label
-msgid "Day Phone:"
-msgstr ""
-
-#: staff.patron_display.email.label
-#: staff.patron_search_form.email.label
-msgid "Email:"
-msgstr ""
-
-#: staff.patron_display.evening_phone.label
-msgid "Evening Phone:"
-msgstr ""
-
-#: staff.patron_display.holds.label
-msgid "Holds:"
-msgstr ""
-
-#: staff.patron_display.holds_available.label
-msgid "Available:"
-msgstr ""
-
-#: staff.patron_display.ident1.label
-msgid "ID 1:"
-msgstr ""
-
-#: staff.patron_display.ident2.label
-msgid "ID 2:"
-msgstr ""
-
-#: staff.patron_display.items_claimed_returned.label
-msgid "Items Claimed Returned:"
-msgstr ""
-
-#: staff.patron_display.library_card.label
-msgid "Library Card:"
-msgstr ""
-
-#: staff.patron_display.mailing.city.label
-msgid "Mailing City:"
-msgstr ""
-
-#: staff.patron_display.mailing.post_code.label
-msgid "Mailing ZIP:"
-msgstr ""
-
-#: staff.patron_display.mailing.state.label
-msgid "Mailing State:"
-msgstr ""
-
-#: staff.patron_display.mailing.street1.label
-msgid "Mailing Address 1:"
-msgstr ""
-
-#: staff.patron_display.mailing.street2.label
-msgid "Mailing Address 2:"
-msgstr ""
-
-#: staff.patron_display.other_phone.label
-msgid "Other Phone:"
-msgstr ""
-
-#: staff.patron_display.physical.city.label
-msgid "Physical City:"
-msgstr ""
-
-#: staff.patron_display.physical.post_code.label
-msgid "Physical ZIP:"
-msgstr ""
-
-#: staff.patron_display.physical.state.label
-msgid "Physical State:"
-msgstr ""
-
-#: staff.patron_display.physical.street1.label
-msgid "Physical Address 1:"
-msgstr ""
-
-#: staff.patron_display.physical.street2.label
-msgid "Physical Address 2:"
-msgstr ""
-
-#: staff.patron_display.physical_address
-msgid "Physical Address"
-msgstr ""
-
-#: staff.patron_display.second_given_name.label
-#: staff.patron_search_form.second_given_name.label
-msgid "Middle Name:"
-msgstr ""
-
-#: staff.patron_display.standing.label
-msgid "Standing:"
-msgstr ""
-
-#: staff.patron_editor_interface_label
-msgid "PATRON EDIT"
-msgstr ""
-
-#: staff.patron_interface_label
-msgid "PATRON "
-msgstr ""
-
-#: staff.patron_navbar.bills
-msgid "Bills"
-msgstr ""
-
-#: staff.patron_navbar.checkout
-msgid "Check Out"
-msgstr ""
-
-#: staff.patron_navbar.holds
-msgid "Holds"
-msgstr ""
-
-#: staff.patron_navbar.info
-msgid "Info"
-msgstr ""
-
-#: staff.patron_navbar.info.accesskey
-msgid "o"
-msgstr ""
-
-#: staff.patron_navbar.items
-msgid "Items Out"
-msgstr ""
-
-#: staff.patron_navbar.refresh
-msgid "Refresh"
-msgstr ""
-
-#: staff.patron_register_interface_label
-msgid "NEW PATRON"
-msgstr ""
-
-#: staff.patron_search_form.caption
-msgid "Search for Patron"
-msgstr ""
-
-#: staff.patron_search_form.city.accesskey
-msgid ""
-"_: staff.patron_search_form.city.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.city.label
-msgid "City:"
-msgstr ""
-
-#: staff.patron_search_form.clear.label
-#: staff.patron_search_form.clear.accesskey
-msgid "&Clear Form"
-msgstr ""
-
-#: staff.patron_search_form.email.accesskey
-msgid ""
-"_: staff.patron_search_form.email.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.family_name.label
-#: staff.patron_search_form.family_name.accesskey
-msgid "&Last Name:"
-msgstr ""
-
-#: staff.patron_search_form.first_given_name.accesskey
-msgid ""
-"_: staff.patron_search_form.first_given_name.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.ident.accesskey
-msgid ""
-"_: staff.patron_search_form.ident.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.ident.label
-msgid "ID:"
-msgstr ""
-
-#: staff.patron_search_form.phone.label
-#: staff.patron_search_form.phone.accesskey
-msgid "&Phone:"
-msgstr ""
-
-#: staff.patron_search_form.post_code.accesskey
-msgid ""
-"_: staff.patron_search_form.post_code.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.post_code.label
-msgid "ZIP:"
-msgstr ""
-
-#: staff.patron_search_form.search.label
-#: staff.patron_search_form.search.accesskey
-msgid "&Search"
-msgstr ""
-
-#: staff.patron_search_form.second_given_name.accesskey
-msgid ""
-"_: staff.patron_search_form.second_given_name.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.state.accesskey
-msgid ""
-"_: staff.patron_search_form.state.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.state.label
-msgid "State:"
-msgstr ""
-
-#: staff.patron_search_form.street1.label
-#: staff.patron_search_form.street1.accesskey
-msgid "A&ddress 1:"
-msgstr ""
-
-#: staff.patron_search_form.street2.accesskey
-msgid ""
-"_: staff.patron_search_form.street2.accesskey\n"
-msgstr ""
-
-#: staff.patron_search_form.street2.label
-msgid "Address 2:"
-msgstr ""
-
-#: staff.patron_search_interface_label
-msgid "PATRON SEARCH"
-msgstr ""
-
-#: staff.patron_stat_cat_editor_interface_label
-msgid "PATRON STAT-CATS"
-msgstr ""
-
-#: staff.previous.range
-msgid "Previous"
-msgstr ""
-
-#: staff.receipt_template_editor_interface_label
-msgid "RECEIPTS"
-msgstr ""
-
-#: staff.record_list.copy_count
-msgid "Copies&#740;"
-msgstr ""
-
-#: staff.record_list.publisher
-#: staff.z39_50.search_class.publisher
-msgid "Publisher"
-msgstr ""
-
-#: staff.retrieving.record
-msgid "Retrieving..."
-msgstr ""
-
-#: staff.survey.wizard.page1
-msgid "Initial Settings"
-msgstr ""
-
-#: staff.survey.wizard.page2
-msgid "Add Questions for Survey:"
-msgstr ""
-
-#: staff.survey.wizard.title
-msgid "Add a Survey Wizard"
-msgstr ""
-
-#: staff.survey_admin_interface_label
-msgid "SURVEY ADMIN"
-msgstr ""
-
-#: staff.volume.attr.owning_lib
-msgid "Owning Library"
-msgstr ""
-
-#: staff.volume.wizard.page1
-msgid "Entering Volumes"
-msgstr ""
-
-#: staff.volume.wizard.page2
-msgid "Entering Copies"
-msgstr ""
-
-#: staff.volume.wizard.page3
-msgid "Entering Barcodes"
-msgstr ""
-
-#: staff.volume.wizard.page4
-msgid "Entering Copy-Level Attribute Defaults"
-msgstr ""
-
-#: staff.volume.wizard.title
-msgid "Batch Add Volumes/Copies Wizard"
-msgstr ""
-
-#: staff.xuleditor_label
-msgid "XUL TEST"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type
-msgid "Item Type"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.all
-msgid "All Formats"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.art
-msgid "Papers/Articles"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.bks
-msgid "Books"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.com
-msgid "Computer files"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.map
-msgid "Maps"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.mix
-msgid "Mixed material"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.rec
-msgid "Sound recordings"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.sco
-msgid "Musical scores"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.url
-msgid "Internet Resources"
-msgstr ""
-
-#: staff.z39_50.search_class.item_type.vis
-msgid "Visual materials"
-msgstr ""
-
-#: staff.z39_50.search_class.lccn
-msgid "LCCN"
-msgstr ""
-
-#: staff.z39_50.search_class.pubdate
-msgid "PubDate"
-msgstr ""
-
-#: staff.z39_50.search_class.tcn
-msgid "Accession #"
-msgstr ""
-
-#: staff.z39_50_import_interface_label
-msgid "Z39.50 IMPORT"
-msgstr ""
diff --git a/build/i18n/po/opac.dtd.pot b/build/i18n/po/opac.dtd.pot
deleted file mode 100644 (file)
index 58d3a06..0000000
+++ /dev/null
@@ -1,2000 +0,0 @@
-# extracted from ../../Open-ILS/web/opac/locale/en-US/opac.dtd
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-12-11 13:27-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-"X-Generator: Translate Toolkit 1.0.1\n"
-"X-Accelerator-Marker: &\n"
-
-# =================================================================
-# Some generic stuff
-# =================================================================
-#: lang.version
-msgid "remote v1"
-msgstr ""
-
-#: lang.description
-msgid "English"
-msgstr ""
-
-#: lang.author
-msgid "PINES"
-msgstr ""
-
-#: common.all
-msgid "All"
-msgstr ""
-
-#: common.currency
-msgid "$"
-msgstr ""
-
-#: common.name
-msgid "Name"
-msgstr ""
-
-#: common.none
-msgid "None"
-msgstr ""
-
-#: common.title
-msgid "Title"
-msgstr ""
-
-#: common.author
-msgid "Author"
-msgstr ""
-
-#: common.authors
-msgid "Authors"
-msgstr ""
-
-#: common.callnumber
-#: opac.advanced.quick.cn
-msgid "Call Number"
-msgstr ""
-
-#: common.edition
-msgid "Edition"
-msgstr ""
-
-#: common.subject
-msgid "Subject"
-msgstr ""
-
-#: common.series
-msgid "Series"
-msgstr ""
-
-#: common.keyword
-msgid "Keyword"
-msgstr ""
-
-#: common.type
-msgid "Search Type"
-msgstr ""
-
-#: common.isbn
-#: opac.advanced.quick.isbn
-msgid "ISBN"
-msgstr ""
-
-#: common.format
-msgid "Format"
-msgstr ""
-
-# Message displayed while search results are loading
-#: common.loading
-#: myopac.fines.status
-msgid "Loading..."
-msgstr ""
-
-#: common.login
-#: opac.login.login
-msgid "Login"
-msgstr ""
-
-#: common.logout
-msgid "Log Out"
-msgstr ""
-
-#: common.physical
-msgid "Physical Description"
-msgstr ""
-
-#: common.pubdate
-msgid "Publication Date"
-msgstr ""
-
-#: common.publisher
-msgid "Publisher"
-msgstr ""
-
-#: common.results
-msgid "Results"
-msgstr ""
-
-#: common.select
-msgid "Select"
-msgstr ""
-
-#: common.status
-msgid "Status"
-msgstr ""
-
-#: common.at
-msgid "at"
-msgstr ""
-
-#: common.of
-msgid "of"
-msgstr ""
-
-#: common.no
-msgid "No"
-msgstr ""
-
-#: common.yes
-msgid "Yes"
-msgstr ""
-
-#: common.cancel
-#: common.org.cancel
-#: myopac.holds.cancel
-#: myopac.holds.cancel_selected
-msgid "Cancel"
-msgstr ""
-
-#: common.library
-#: rdetail.copyInfo.library
-msgid "Library"
-msgstr ""
-
-#: common.username
-msgid "Username"
-msgstr ""
-
-#: common.password
-msgid "Password"
-msgstr ""
-
-#: common.submit
-msgid "Submit"
-msgstr ""
-
-#: common.close
-msgid "close"
-msgstr ""
-
-#: common.and
-msgid "and"
-msgstr ""
-
-#: common.user_not_found
-msgid "User not found"
-msgstr ""
-
-#: opac.advanced.wizard.title
-#: opac.navigate.advanced
-msgid "Advanced Search"
-msgstr ""
-
-#: common.nowSearching
-msgid "Now searching "
-msgstr ""
-
-#: common.ofAtLeast
-msgid " of at least "
-msgstr ""
-
-#: common.relevancy
-msgid "Match Score: "
-msgstr ""
-
-#: common.tips
-msgid "Tips:"
-msgstr ""
-
-#: common.tips.tip1
-msgid "Click on a folder icon in the sidebar to access related quick searches"
-msgstr ""
-
-#: common.tips.tip2
-msgid "If you don't find what you want try expanding your search using the range selector at the right of the search bar"
-msgstr ""
-
-#: common.org.openAll
-msgid "Expand All"
-msgstr ""
-
-#: common.org.closeAll
-msgid "Close All"
-msgstr ""
-
-#: common.org.loading
-msgid "Loading library selector..."
-msgstr ""
-
-# ==========================================================
-# Tips
-#: common.org.note
-#: tips.label
-msgid "Tip:"
-msgstr ""
-
-#: common.org.notetext
-msgid "Click on a location's name to select it.  Click on the folder icons to expand a section."
-msgstr ""
-
-# =================================================================
-# Footer
-#: opac.basic
-#: footer.basic
-msgid "Basic Catalog (HTML only)"
-msgstr ""
-
-#: common.password_criteria
-msgid "The password must be at least 7 characters in length, "
-"\tcontain at least one letter (a-z/A-Z), "
-"\tand contain at least one number."
-msgstr ""
-
-#: common.a2z.title
-msgid "Title: A to Z"
-msgstr ""
-
-#: common.z2a.title
-msgid "Title: Z to A"
-msgstr ""
-
-#: common.a2z.author
-msgid "Author: A to Z"
-msgstr ""
-
-#: common.z2a.author
-msgid "Author: Z to A"
-msgstr ""
-
-#: common.new2old.pubdate
-msgid "Date: Newest to Oldest"
-msgstr ""
-
-#: common.old2new.pubdate
-msgid "Date: Oldest to Newest"
-msgstr ""
-
-#: opac.style.reddish
-msgid "Reddish"
-msgstr ""
-
-#: holds.where_am_i
-msgid "PINES is a statewide system with both patrons and items "
-"\tassociated with over 250 libraries, holds lists are not as simple as "
-"\t'first come, first served' in PINES.  A complex matrix combining "
-"\tconsideration of item ownership, patron home library, and item purchase "
-"\tdate determines  priorities for holds; the list is dynamic, changing "
-"\twith every hold placed.  Therefore, any indication of a place in the "
-"\tholds list would be inaccurate.  The PINES holds system is designed to "
-"\tobtain a requested item in the fastest and most efficient way possible. "
-"\tYour PINES library will contact you when you hold items become "
-"\tavailable."
-msgstr ""
-
-#: holds.advanced_options
-msgid "If you wish to broaden the scope of your hold to include other "
-"\tversions of this title, select the formats that would be acceptable. "
-"\tThe first available copy will be sent to you."
-msgstr ""
-
-# =================================================================
-# Events and Permissions
-# =================================================================
-#: ilsevent.0
-msgid "Operation Succeeded"
-msgstr ""
-
-#: ilsevent.1000
-msgid "Login failed.  The username or password entered was incorrect."
-msgstr ""
-
-#: ilsevent.1001
-msgid "Login session has timed out or does not exist"
-msgstr ""
-
-#: ilsevent.1002
-msgid "User was not found in the database"
-msgstr ""
-
-#: ilsevent.1200
-msgid "The given username already exists in the database"
-msgstr ""
-
-#: ilsevent.5000
-msgid "Permission Denied"
-msgstr ""
-
-#: ilsperm.CREATE_HOLD
-msgid "User is not allowed to create holds for other users at this location"
-msgstr ""
-
-# =================================================================
-# common/pages
-# =================================================================
-#: common.cn.loading
-msgid "Loading Callnumber Page..."
-msgstr ""
-
-#: common.cn.browsing
-msgid "You are now browsing"
-msgstr ""
-
-#: common.cn.previous
-msgid "&lt;&lt; Previous Page"
-msgstr ""
-
-#: common.cn.shelf
-#: rdetail.extras.browser
-msgid "Shelf Browser"
-msgstr ""
-
-#: common.cn.next
-msgid "Next Page &gt;&gt;"
-msgstr ""
-
-#: common.textsize.title
-msgid "Text Size: "
-msgstr ""
-
-#: common.textsize.regular
-msgid "Regular"
-msgstr ""
-
-# Regular / Large
-#: common.textsize.separator
-msgid "/"
-msgstr ""
-
-#: common.textsize.large
-msgid "Large"
-msgstr ""
-
-#: home.js.disabled
-msgid "JavaScript must be enabled in order for you to use the regular Evergreen Catalog. "
-"However, it seems JavaScript is either disabled or not supported by your browser. "
-"To use the regular Evergreen Catalog, enable JavaScript by changing your browser options, then "
-"<a style='color: blue; text-decoration: underline;' href='/'>try again</a>. "
-"<br/><br/>Alternatively, you can use the basic HTML-only catalog "
-"<a style='color: blue; text-decoration: underline;' href='/opac/extras/slimpac/start.html'>here</a>."
-msgstr ""
-
-# =================================================================
-# MyOPAC bookbag page
-# =================================================================
-#: myopac.delete.bookbag
-msgid "This will remove the selected bookbag and all items contained within the bookbag. "
-"Are you sure you wish to continue?"
-msgstr ""
-
-#: myopac.no.bookbags
-msgid "You have not created any bookbags"
-msgstr ""
-
-#: myopac.bookbags.title
-#: myopac.bookbags
-msgid "My Bookbags"
-msgstr ""
-
-#: myopac.bookbag.items
-msgid "# Items"
-msgstr ""
-
-#: myopac.bookbag.shared
-msgid "Shared"
-msgstr ""
-
-#: myopac.bookbag.toggle
-msgid "Share / Hide"
-msgstr ""
-
-#: myopac.bookbag.delete
-msgid "Delete this bookbag?"
-msgstr ""
-
-#: myopac.items
-msgid "Items"
-msgstr ""
-
-#: myopac.view
-msgid "(View)"
-msgstr ""
-
-#: myopac.atom.feed
-msgid "ATOM Feed"
-msgstr ""
-
-#: myopac.bookbag.hide
-msgid "Hide"
-msgstr ""
-
-#: myopac.bookbag.share
-msgid "Share"
-msgstr ""
-
-#: myopac.delete
-msgid "Delete"
-msgstr ""
-
-#: myopac.bookbag.create
-msgid "Create a new Bookbag"
-msgstr ""
-
-#: myopac.bookbag.naming
-msgid "Enter the name of the new Bookbag: "
-msgstr ""
-
-#: myopac.bookbag.share
-msgid "Share this Bookbag"
-msgstr ""
-
-#: myopac.bookbag.no.items
-msgid "The selected bookbag contains no items..."
-msgstr ""
-
-#: myopac.bookbag.remove
-msgid "Remove this item?"
-msgstr ""
-
-#: myopac.remove.link
-msgid "remove"
-msgstr ""
-
-#: myopac.publish.text
-msgid "Sharing a Bookbag means that the contents of the Bookbag will be visible to others. "
-"To see the public view of a shared Bookbag, click the \"View\" link in the "
-"\"Shared\" column of the Bookbag list at the top of this page."
-msgstr ""
-
-#: myopac.item.confirm
-msgid "Are you sure you wish to remove this bookbag item?"
-msgstr ""
-
-#: myopac.publish.confirm
-msgid "Sharing this bookbag will allow the contents "
-"of the bookback to be seen by others.  Are you sure you wish to share this bookbag?"
-msgstr ""
-
-#: myopac.unpublish.confirm
-msgid "Are you sure you wish to hide this bookbag?"
-msgstr ""
-
-#: myopac.update.success
-msgid "The Bookbag was successfully updated."
-msgstr ""
-
-#: myopac.updated.success
-msgid "Bookbag successfully updated"
-msgstr ""
-
-#: myopac.create.warning
-msgid "Warning: Adding items to a bookbag creates a link between you and the "
-"items in the database.  The contents of the bookbag are NOT publicly "
-"viewable unless the bookbag is shared. However, if you prefer not to "
-"have any link between your patron record and a particular item or items, "
-"we suggest that you do not place said items in a bookbag or that you "
-"avoid using bookbags all together.  Thank you."
-msgstr ""
-
-#: myopac.describe.bookbags
-msgid "Bookbags are..."
-msgstr ""
-
-# =================================================================
-# MyOPAC Checked Page
-# =================================================================
-#: myopac.checked.out
-msgid "Total items out:"
-msgstr ""
-
-#: myopac.checked.overdue
-msgid "Total items overdue:"
-msgstr ""
-
-#: myopac.checked.renew
-msgid "Renew Selected Items"
-msgstr ""
-
-#: myopac.checked.renewing
-msgid "Renewing..."
-msgstr ""
-
-#: myopac.checked.renew.remaining
-msgid "Renewals Remaining"
-msgstr ""
-
-#: myopac.checked.noitems
-msgid "You have no items checked out at this time"
-msgstr ""
-
-#: myopac.checked.other.circ
-msgid "Other Circulations"
-msgstr ""
-
-#: myopac.checked.circ.lib
-msgid "Circulating Library"
-msgstr ""
-
-#: myopac.checked.item.type
-msgid "Circulation Type"
-msgstr ""
-
-#: myopac.checked.circ.time
-msgid "Please return by ..."
-msgstr ""
-
-#: myopac.checked.renew.success
-msgid "item(s) successfully renewed"
-msgstr ""
-
-#: myopac.checked.renew.confirm
-msgid "Are you sure you wish to renew the selected item(s)?"
-msgstr ""
-
-#: myopac.checked.renew.fail
-msgid "The system is unable to renew the selected item at this time.  This usually means the item is needed to fulfill a hold.  Please see a librarian for further help."
-msgstr ""
-
-#: myopac.checked.renew.fail2
-msgid "PINES policy prevents the renewal of this item at this time.  Please see a librarian for further details."
-msgstr ""
-
-# =================================================================
-# MyOPAC Fines Page
-# =================================================================
-#: myopac.fines.title
-msgid "Summary"
-msgstr ""
-
-#: myopac.fines.owed
-msgid "Total Owed"
-msgstr ""
-
-#: myopac.fines.paid
-msgid "Total Paid"
-msgstr ""
-
-#: myopac.fines.balance
-msgid "Balance Owed"
-msgstr ""
-
-#: myopac.fines.overdue
-msgid "Overdue Materials"
-msgstr ""
-
-#: myopac.fines.checkout
-msgid "Checkout Date"
-msgstr ""
-
-#: myopac.fines.due
-#: rdetail.cn.due
-msgid "Due Date"
-msgstr ""
-
-#: myopac.fines.returned
-msgid "Date Returned"
-msgstr ""
-
-#: myopac.fines.accruing
-msgid "(fines accruing)"
-msgstr ""
-
-#: myopac.fines.other
-msgid "Other Fees"
-msgstr ""
-
-#: myopac.fines.time.start
-msgid "Transaction Start Time"
-msgstr ""
-
-#: myopac.fines.time.paid
-msgid "Last Payment Time"
-msgstr ""
-
-#: myopac.fines.owed.initial
-msgid "Initial Amount Owed"
-msgstr ""
-
-#: myopac.fines.paid.amount
-msgid "Total Amount Paid"
-msgstr ""
-
-#: myopac.fines.type
-msgid "Billing Type"
-msgstr ""
-
-# =================================================================
-# MyOPAC Holds Page
-# =================================================================
-#: myopac.holds.formats
-msgid "Formats"
-msgstr ""
-
-#: myopac.holds.location
-msgid "Pickup Location"
-msgstr ""
-
-#: myopac.holds.edit
-msgid "Edit"
-msgstr ""
-
-#: myopac.holds.status.none
-msgid "You have no items on hold at this time"
-msgstr ""
-
-#: myopac.holds.status.waiting
-msgid "Waiting for copy"
-msgstr ""
-
-#: myopac.holds.status.intransit
-msgid "In Transit"
-msgstr ""
-
-#: myopac.holds.status.available
-msgid "Ready for Pickup"
-msgstr ""
-
-#: myopac.holds.verify
-msgid "If you wish to cancel the selected hold, click OK, otherwise click Cancel."
-msgstr ""
-
-#: myopac.holds.freeze_selected
-msgid "Freeze"
-msgstr ""
-
-#: myopac.holds.thaw_selected
-msgid "Un-freeze"
-msgstr ""
-
-#: myopac.holds.thaw_date_selected
-msgid "Set Un-freeze date"
-msgstr ""
-
-#: myopac.holds.processing
-msgid "Processing holds... This may take a moment."
-msgstr ""
-
-#: myopac.holds.actions
-msgid "Actions for selected holds"
-msgstr ""
-
-#: myopac.holds.cancel.confirm
-msgid "Are you sure you wish to cancel the selected holds?"
-msgstr ""
-
-#: myopac.holds.freeze.confirm
-msgid "Are you sure you wish to freeze the selected holds? "
-"Note that if an item has already been selected to fulfill the hold, it will not be frozen"
-msgstr ""
-
-#: myopac.holds.thaw.confirm
-msgid "Are you sure you wish to un-freeze the selected holds?"
-msgstr ""
-
-#: myopac.holds.thaw_date.confirm
-msgid "Are you sure you wish to change the un-freeze date for the selected holds?"
-msgstr ""
-
-#: myopac.holds.freeze.select_thaw
-msgid "Select an 'Un-Freeze' date.  This is the date at which the holds will become active again. "
-"If no date is chosen, the holds will remain frozen until they are manually un-frozen."
-msgstr ""
-
-#: opac.holds.freeze
-msgid "Freeze this hold"
-msgstr ""
-
-#: opac.holds.freeze.help
-msgid "A 'frozen' will retain its place in the queue, but will not be fulfilled until it has been unfrozen."
-msgstr ""
-
-#: opac.holds.freeze.thaw_date
-msgid "Automatically un-freeze hold on:"
-msgstr ""
-
-#: opac.holds.freeze.thaw_date.format
-msgid "YYYY-MM-DD"
-msgstr ""
-
-# =================================================================
-# MyOPAC Preferences Page
-# =================================================================
-#: myopac.prefs.title
-msgid "Preferences"
-msgstr ""
-
-#: myopac.prefs.hits
-msgid "Search hits per page"
-msgstr ""
-
-#: myopac.prefs.font
-msgid "Default Font Size"
-msgstr ""
-
-#: myopac.prefs.font.regular
-msgid "Regular Font"
-msgstr ""
-
-#: myopac.prefs.font.large
-msgid "Large Font"
-msgstr ""
-
-#: myopac.prefs.holds.notify
-msgid "Default Hold Notification Method"
-msgstr ""
-
-#: myopac.prefs.holds.both
-msgid "Use Phone and Email"
-msgstr ""
-
-#: myopac.prefs.holds.phone
-msgid "Use Phone Only"
-msgstr ""
-
-#: myopac.prefs.holds.email
-msgid "Use Email Only"
-msgstr ""
-
-#: myopac.prefs.search.location
-msgid "Default Search Location"
-msgstr ""
-
-#: myopac.prefs.search.home
-msgid "Always search my home library by default."
-msgstr ""
-
-#: myopac.prefs.search.range
-msgid "Default Search Range"
-msgstr ""
-
-#: myopac.prefs.save
-msgid "Save Preference Changes"
-msgstr ""
-
-#: myopac.prefs.save.success
-msgid "Preferences successfully updated"
-msgstr ""
-
-#: myopac.prefs.save.failed
-msgid "Preferences update failed!"
-msgstr ""
-
-#: myopac.prefs.help
-msgid "This setting defines how you will be notified of holds that are ready to be picked up from the library. "
-"By default, holds will use the notification style you choose here. "
-"However, you will still have the option to change individual holds regardless of this setting."
-msgstr ""
-
-#: myopac.holds.unfrozen
-msgid "Un-Frozen"
-msgstr ""
-
-#: myopac.holds.frozen.until
-msgid "Frozen Until"
-msgstr ""
-
-# =================================================================
-# MyOPAC Summary page
-# =================================================================
-#: myopac.summary.expired
-msgid "Your account expired on <span id='myopac.expired.date'/>! "
-"Please see a librarian to renew your account."
-msgstr ""
-
-#: myopac.summary.notes
-msgid "* Staff Notes *"
-msgstr ""
-
-#: myopac.summary.phone.day
-msgid "Day Phone"
-msgstr ""
-
-#: myopac.summary.phone.evening
-msgid "Evening Phone"
-msgstr ""
-
-#: myopac.summary.phone.other
-msgid "Other Phone"
-msgstr ""
-
-#: myopac.summary.change
-msgid "Change"
-msgstr ""
-
-#: myopac.summary.username.enter
-msgid "Enter new username:"
-msgstr ""
-
-#: myopac.summary.password.text
-msgid "(not shown)"
-msgstr ""
-
-#: myopac.summary.password.current
-msgid "Enter current password:"
-msgstr ""
-
-#: myopac.summary.password.new
-msgid "Enter new password:"
-msgstr ""
-
-#: myopac.summary.password.reenter
-msgid "Re-enter new password:"
-msgstr ""
-
-#: myopac.summary.email
-msgid "Email Address"
-msgstr ""
-
-#: myopac.summary.email.new
-msgid "Enter new email address:"
-msgstr ""
-
-#: myopac.summary.id.primary
-msgid "Primary Identification"
-msgstr ""
-
-#: myopac.summary.barcode
-msgid "Active Barcode"
-msgstr ""
-
-#: myopac.summary.home
-msgid "Home Library"
-msgstr ""
-
-#: myopac.summary.genesis
-msgid "Account Creation Date"
-msgstr ""
-
-#: myopac.summary.addresses
-msgid "Addresses"
-msgstr ""
-
-#: myopac.summary.address.type
-msgid "Address Type"
-msgstr ""
-
-#: myopac.summary.address.street
-msgid "Street"
-msgstr ""
-
-#: myopac.summary.address.city
-msgid "City"
-msgstr ""
-
-#: myopac.summary.address.county
-msgid "County"
-msgstr ""
-
-#: myopac.summary.address.state
-msgid "State"
-msgstr ""
-
-#: myopac.summary.address.zip
-msgid "Zip"
-msgstr ""
-
-#: myopac.summary.username.error
-msgid "Please enter a username"
-msgstr ""
-
-#: myopac.summary.username.dup
-msgid "The requested username is not available.  Please choose a different username."
-msgstr ""
-
-#: myopac.summary.username.success
-msgid "Username successfully updated"
-msgstr ""
-
-#: myopac.summary.username.failure
-msgid "Username update failed"
-msgstr ""
-
-#: myopac.summary.username.invalid
-msgid "Username cannot contain spaces or have the same format as a barcode"
-msgstr ""
-
-#: myopac.summary.email.error
-msgid "Please enter a valid email address"
-msgstr ""
-
-#: myopac.summary.email.success
-msgid "Email address successfully updated"
-msgstr ""
-
-#: myopac.summary.email.failed
-msgid "Email address update failed"
-msgstr ""
-
-#: myopac.summary.password.error
-msgid "Passwords are empty or do not match"
-msgstr ""
-
-#: myopac.summary.password.success
-#: login.password.success
-msgid "Password successfully updated"
-msgstr ""
-
-#: myopac.summary.password.failure
-msgid "Password update failed"
-msgstr ""
-
-# =================================================================
-# Advanced Search Page
-# =================================================================
-#: opac.advanced.wizard.contains
-msgid "Selected field contains the following words"
-msgstr ""
-
-#: opac.advanced.wizard.nocontains
-msgid "Selected field does <u>not</u> contain the following words"
-msgstr ""
-
-#: opac.advanced.wizard.exact
-msgid "Selected field contains the <u>exact</u> phrase"
-msgstr ""
-
-#: opac.advanced.refined.title
-msgid "Refined Advanced Search"
-msgstr ""
-
-#: opac.advanced.refined.title_contains
-msgid "Title contains the following words"
-msgstr ""
-
-#: opac.advanced.refined.author_contains
-msgid "Author contains the following words"
-msgstr ""
-
-#: opac.advanced.refined.subject_contains
-msgid "Subject contains the following words"
-msgstr ""
-
-#: opac.advanced.refined.series_contains
-msgid "Series contains the following words"
-msgstr ""
-
-#: opac.advanced.refined.contains
-msgid "Contains"
-msgstr ""
-
-#: opac.advanced.refined.nocontains
-msgid "Does not contain"
-msgstr ""
-
-#: opac.advanced.refined.exact
-msgid "Matches Exactly"
-msgstr ""
-
-#: opac.advanced.marc.warning
-msgid "For Librarians"
-msgstr ""
-
-# ==========================================================
-# MARC expert search
-#: opac.advanced.marc.title
-#: search.marc
-msgid "MARC Expert Search"
-msgstr ""
-
-#: opac.advanced.marc.tag
-msgid "MARC Tag"
-msgstr ""
-
-#: opac.advanced.marc.ind1
-msgid "Indicator 1"
-msgstr ""
-
-#: opac.advanced.marc.ind2
-msgid "Indicator 2"
-msgstr ""
-
-#: opac.advanced.marc.subfield
-msgid "Subfield"
-msgstr ""
-
-#: opac.advanced.marc.value
-msgid "Value"
-msgstr ""
-
-#: opac.advanced.marc.addrow
-msgid "Add a new row"
-msgstr ""
-
-#: opac.advanced.quick.title
-#: sidebar.quick.search
-msgid "Quick Search"
-msgstr ""
-
-#: opac.advanced.quick.issn
-msgid "ISSN"
-msgstr ""
-
-#: opac.advanced.quick.lccn
-msgid "LCCN"
-msgstr ""
-
-# title control number
-#: opac.advanced.quick.tcn
-msgid "TCN"
-msgstr ""
-
-#: opac.advanced.quick.barcode
-msgid "Item Barcode"
-msgstr ""
-
-#: search.marc.tag
-msgid "Tag:"
-msgstr ""
-
-#: search.marc.subfield
-msgid "Subfield:"
-msgstr ""
-
-#: search.marc.value
-msgid "Value:"
-msgstr ""
-
-#: search.marc.add.row
-msgid "Add Row"
-msgstr ""
-
-# ==========================================================
-# Status bar
-# ==========================================================
-#: status.results
-msgid "Including results for"
-msgstr ""
-
-# =================================================================
-# More generic stuff
-# =================================================================
-#: opac.session_expiring
-msgid "Your login session will timeout in 1 minute unless there is activity."
-msgstr ""
-
-#: opac.session_expired
-msgid "Your login session has expired"
-msgstr ""
-
-#: navigate.home
-msgid "Home"
-msgstr ""
-
-#: navigate.home.title
-msgid "Go to the Home page"
-msgstr ""
-
-#: opac.navigate.advanced.title
-msgid "Go to the Advanced Search Page"
-msgstr ""
-
-#: navigate.myopac
-#: opac.navigate.myopac
-msgid "My Account"
-msgstr ""
-
-#: navigate.myopac.title
-msgid "Go to My OPAC"
-msgstr ""
-
-#: navigate.login
-msgid "Log in"
-msgstr ""
-
-#: navigate.login.title
-msgid "Log in for personalized features"
-msgstr ""
-
-#: navigate.logout
-#: navigate.logout.title
-msgid "Log out"
-msgstr ""
-
-#: opac.navigate.selectNewOrg
-msgid "Choose a different library"
-msgstr ""
-
-#: opac.navigate.selectOrg
-#: library.select.help
-msgid "Choose a library to search"
-msgstr ""
-
-#: navigate.loggedinas
-msgid "You are logged in as "
-msgstr ""
-
-#: navigate.loggedinas.title
-msgid "Logged in as..."
-msgstr ""
-
-#: navigate.titleGroupResults
-msgid "My Search Results"
-msgstr ""
-
-#: navigate.titleResults
-msgid "My Title Results"
-msgstr ""
-
-#: navigate.title.details
-msgid "My Title Details"
-msgstr ""
-
-#: navigate.record.details
-msgid "Record Details"
-msgstr ""
-
-#: footer.find.library
-msgid "Find a Library Near Me"
-msgstr ""
-
-#: footer.find.url
-msgid "http://www.georgialibraries.org/lib/directories/pineslibdir.html"
-msgstr ""
-
-#: footer.help.url
-msgid "http://open-ils.org/dokuwiki/doku.php?id=evergreen-user:opac_help"
-msgstr ""
-
-#: footer.help
-msgid "Help"
-msgstr ""
-
-#: footer.library.url
-msgid "http://www.georgialibraries.org/public/pines.html"
-msgstr ""
-
-#: footer.library.about
-msgid "About PINES"
-msgstr ""
-
-#: footer.union.url
-msgid "http://www.galileo.usg.edu/"
-msgstr ""
-
-#: footer.union
-msgid "GALILEO"
-msgstr ""
-
-#: footer.copyright
-msgid "Copyright &#xA9; 2006 Georgia Public Library Service"
-msgstr ""
-
-# Introduces the logo for the project
-#: footer.logo
-msgid "Powered by"
-msgstr ""
-
-# =================================================================
-# My OPAC
-# =================================================================
-#: myopac.account
-msgid "Account Summary"
-msgstr ""
-
-#: myopac.checkouts
-msgid "Items Checked Out"
-msgstr ""
-
-#: myopac.holds
-msgid "Items on Hold"
-msgstr ""
-
-#: myopac.fines
-msgid "Fines"
-msgstr ""
-
-#: myopac.preferences
-msgid "Account Preferences"
-msgstr ""
-
-# =================================================================
-# Sidebar
-# =================================================================
-#: sidebar.relevantSubjects.headerLabel
-msgid "Relevant Subjects"
-msgstr ""
-
-#: sidebar.relevantAuthors.headerLabel
-msgid "Relevant Authors"
-msgstr ""
-
-#: sidebar.relevantSeries.headerLabel
-msgid "Relevant Series"
-msgstr ""
-
-#: sidebar.relevantReviews.headerLabel
-#: rdetail.extras.reviews
-msgid "Reviews"
-msgstr ""
-
-#: sidebar.copy.not.found
-msgid "No copy with the requested barcode was found"
-msgstr ""
-
-# =================================================================
-# Search formats
-# =================================================================
-#: opac.search.books
-msgid "Books"
-msgstr ""
-
-#: opac.search.allFormats
-msgid "All Formats"
-msgstr ""
-
-#: opac.search.largePrint
-msgid "Large Print Books"
-msgstr ""
-
-#: opac.search.audioBooks
-msgid "Audiobooks"
-msgstr ""
-
-#: opac.search.videoRecordings
-msgid "Video Recordings"
-msgstr ""
-
-#: opac.search.music
-msgid "Music"
-msgstr ""
-
-#: opac.search.electronic
-msgid "Electronic Resources"
-msgstr ""
-
-#: opac.search.nowSearching
-msgid "Now Searching"
-msgstr ""
-
-# =================================================================
-# Page Titles
-# =================================================================
-#: opac.title.home
-msgid "Evergreen Home"
-msgstr ""
-
-#: opac.title.mresult
-msgid "Evergreen Title Groups"
-msgstr ""
-
-#: opac.title.rresult
-msgid "Evergreen Titles"
-msgstr ""
-
-#: opac.title.myopac
-msgid "Evergreen My Account"
-msgstr ""
-
-#: opac.title.rdetail
-msgid "Evergreen Title Details"
-msgstr ""
-
-#: opac.title.advanced
-msgid "Evergreen Advanced Search"
-msgstr ""
-
-#: opac.title.reqitems
-msgid "Evergreen Request Items"
-msgstr ""
-
-#: opac.title.cnbrowse
-msgid "Evergreen Call Number Browse"
-msgstr ""
-
-#: opac.holds.forMe
-msgid "Place this hold for myself"
-msgstr ""
-
-#: opac.holds.xulRecipient
-msgid "Enter recipient barcode"
-msgstr ""
-
-#: opac.holds.recipient
-msgid "Recipient"
-msgstr ""
-
-#: opac.holds.placeHold
-msgid "Place Hold"
-msgstr ""
-
-#: opac.holds.contactPhone
-msgid "Contact telephone number"
-msgstr ""
-
-#: opac.holds.contactEmail
-msgid "Contact email address"
-msgstr ""
-
-#: opac.holds.pickupLocation
-msgid "Pickup location"
-msgstr ""
-
-#: opac.holds.success
-msgid "Hold was successfully placed"
-msgstr ""
-
-#: opac.holds.failure
-msgid "Hold was not successfully placed"
-msgstr ""
-
-# =================================================================
-# Advanced
-# =================================================================
-#: advanced.search.title
-msgid "Search Input"
-msgstr ""
-
-#: advanced.add.row
-msgid "Add Search Row"
-msgstr ""
-
-#: advanced.search.submit
-msgid "Submit Search"
-msgstr ""
-
-#: advanced.search.filters
-msgid "Search Filters"
-msgstr ""
-
-#: advanced.item.form
-msgid "Item Form"
-msgstr ""
-
-#: advanced.item.type
-msgid "Item Type"
-msgstr ""
-
-#: advanced.link
-msgid "Advanced"
-msgstr ""
-
-#: advanced.basic.link
-msgid "Basic"
-msgstr ""
-
-#: advanced.literary.form
-msgid "Literary&nbsp;Form"
-msgstr ""
-
-#: advanced.non.fiction
-msgid "Non Fiction"
-msgstr ""
-
-#: advanced.fiction
-msgid "Fiction"
-msgstr ""
-
-#: advanced.language
-msgid "Language"
-msgstr ""
-
-#: advanced.audience
-msgid "Audience"
-msgstr ""
-
-#: advanced.adult
-msgid "Adult"
-msgstr ""
-
-#: advanced.juvenile
-msgid "Juvenile"
-msgstr ""
-
-#: advanced.general
-msgid "General"
-msgstr ""
-
-#: advanced.sort.criteria
-msgid "Sort Criteria"
-msgstr ""
-
-#: advanced.search.library
-msgid "Search Library"
-msgstr ""
-
-#: advanced.relevance
-msgid "Relevance"
-msgstr ""
-
-#: advanced.pubdate
-msgid "Publication date"
-msgstr ""
-
-#: advanced.sort.asc
-msgid "Ascending / A to Z"
-msgstr ""
-
-#: advanced.sort.desc
-msgid "Descending / Z to A"
-msgstr ""
-
-#: advanced.frbrize
-msgid "Group Formats and Editions"
-msgstr ""
-
-#: advanced.go
-msgid "Go"
-msgstr ""
-
-# =================================================================
-# Rdetail
-# =================================================================
-#: rdetail.print
-msgid "print these details"
-msgstr ""
-
-#: rdetail.cn.barcode
-msgid "Barcode"
-msgstr ""
-
-#: rdetail.cn.location
-msgid "Location"
-msgstr ""
-
-#: rdetail.cn.hold.age
-msgid "Age Hold Protection"
-msgstr ""
-
-#: rdetail.cn.genesis
-msgid "Create Date"
-msgstr ""
-
-#: rdetail.cn.holdable
-msgid "Holdable"
-msgstr ""
-
-#: rdetail.cn.more
-msgid "more info..."
-msgstr ""
-
-#: rdetail.cn.less
-msgid "less info"
-msgstr ""
-
-#: rdetail.cn.hold
-#: rdetail.copyInfo.hold
-msgid "place hold"
-msgstr ""
-
-#: rdetail.cn.disabled
-msgid "- Disabled -"
-msgstr ""
-
-#: rdetail.cn.note
-msgid "Copy Note"
-msgstr ""
-
-#: rdetail.cn.category
-msgid "Copy Category"
-msgstr ""
-
-#: rdetail.cn.print
-msgid "Print Page"
-msgstr ""
-
-#: rdetail.page.results
-msgid "First results page"
-msgstr ""
-
-# Result # &common.of; #
-#: rdetail.result
-msgid "Result"
-msgstr ""
-
-#: rdetail.start
-msgid "Start"
-msgstr ""
-
-#: rdetail.page.previous
-msgid "Previous page"
-msgstr ""
-
-#: rdetail.page.next
-msgid "Next page"
-msgstr ""
-
-#: rdetail.page.last
-msgid "Last results page"
-msgstr ""
-
-#: rdetail.end
-msgid "End"
-msgstr ""
-
-#: rdetail.more
-msgid "More Actions..."
-msgstr ""
-
-#: rdetail.bookbag.add
-msgid "Add to bookbag"
-msgstr ""
-
-#: rdetail.bookbag.create
-msgid "Create a new bookbag"
-msgstr ""
-
-#: rdetail.record.deleted
-msgid "This record has been deleted from the database. "
-"We recommend that you remove this title from any bookbags it may have been added to."
-msgstr ""
-
-#: rdetail.none
-msgid "(none)"
-msgstr ""
-
-#: rdetail.bookbag.add.success
-msgid "Item successfully added to bookbag"
-msgstr ""
-
-#: rdetail.bookbag.name
-msgid "Enter the name of the new bookbag"
-msgstr ""
-
-#: rdetail.bookbag.create.success
-msgid "Bookbag successfully created"
-msgstr ""
-
-#: rdetail.detailMain.headerLabel
-msgid "Record Summary"
-msgstr ""
-
-#: rdetail.detailMain.subjects
-msgid "Subjects"
-msgstr ""
-
-#: rdetail.detailMain.abstract
-msgid "Abstract"
-msgstr ""
-
-#: rdetail.detailMain.viewMarc
-msgid "View MARC"
-msgstr ""
-
-#: rdetail.detailMain.hideMarc
-msgid "Return to title details"
-msgstr ""
-
-#: rdetail.author.search
-msgid "Perform an author search"
-msgstr ""
-
-#: rdetail.copyInfo.headerLabel
-msgid "Copy Information"
-msgstr ""
-
-#: rdetail.copyInfo.callnumber
-msgid "Callnumber"
-msgstr ""
-
-#: rdetail.copyInfo.local
-msgid "View Copy Information for this location only"
-msgstr ""
-
-#: rdetail.copyInfo.all
-msgid "View copy information for all libraries"
-msgstr ""
-
-#: rdetail.copyInfo.actions
-msgid "Actions"
-msgstr ""
-
-#: rdetail.copyInfo.print
-msgid "Print Call Numbers for this library"
-msgstr ""
-
-#: rdetail.copyInfo.details
-msgid "details"
-msgstr ""
-
-#: rdetail.copyInfo.browse
-msgid "browse"
-msgstr ""
-
-#: rdetail.extras.summary
-msgid "Copy Summary"
-msgstr ""
-
-#: rdetail.extras.toc
-msgid "Table of Contents"
-msgstr ""
-
-#: rdetail.extras.excerpt
-msgid "Excerpt"
-msgstr ""
-
-#: rdetail.extras.author.notes
-msgid "Author Notes"
-msgstr ""
-
-#: rdetail.extras.annotation
-msgid "Annotation"
-msgstr ""
-
-#: rdetail.extras.marc
-msgid "MARC Record"
-msgstr ""
-
-#: rdetail.extras.call.null
-msgid "There are no call numbers for this item at this location."
-msgstr ""
-
-#: rdetail.extras.call.local
-msgid "Local Call Numbers:"
-msgstr ""
-
-#: rdetail.loading
-msgid "Loading copy infomation..."
-msgstr ""
-
-#: rdetail.noneAvailable
-msgid " * There are no copies in this location"
-msgstr ""
-
-#: rdetail.summary.online
-msgid "Online Resources"
-msgstr ""
-
-#: result.sort_by
-msgid "Sort Results by Relevance"
-msgstr ""
-
-#: result.sort_by.title
-msgid "Sort Results by Title"
-msgstr ""
-
-#: result.sort_by.author
-msgid "Sort Results by Author"
-msgstr ""
-
-#: result.sort_by.pubdate
-msgid "Sort Results by Publication Date"
-msgstr ""
-
-#: result.limit2avail
-msgid "Limit to Available"
-msgstr ""
-
-#: result.info.copies
-msgid "Available copies / Total copies"
-msgstr ""
-
-#: result.info.no.items
-msgid "No items with the selected format were found in this location."
-msgstr ""
-
-#: result.info.format.items
-msgid "Listed below are all items in the catalog with the chosen format."
-msgstr ""
-
-#: result.info.show
-msgid "Show records for"
-msgstr ""
-
-#: result.lowhits.few
-msgid "Few hits were returned for your search."
-msgstr ""
-
-#: result.lowhits.zero
-msgid "Zero hits were returned for your search."
-msgstr ""
-
-#: result.lowhits.did.you.mean
-msgid "Maybe you meant:"
-msgstr ""
-
-#: result.lowhits.formats
-msgid "You will find more hits when searching all item formats:"
-msgstr ""
-
-#: result.lowhits.formats.search
-msgid "Search again with all formats?"
-msgstr ""
-
-#: result.lowhits.related
-msgid "You may also like to try these related searches:"
-msgstr ""
-
-#: result.lowhits.expand
-msgid "You may also wish to expand your search range to:"
-msgstr ""
-
-#: result.lowhits.class
-msgid "You can try searching the same terms by:"
-msgstr ""
-
-#: result.lowhits.title
-msgid "title"
-msgstr ""
-
-#: result.lowhits.author
-msgid "author"
-msgstr ""
-
-#: result.lowhits.subject
-msgid "subject"
-msgstr ""
-
-#: result.lowhits.series
-msgid "series"
-msgstr ""
-
-#: result.lowhits.keyword
-msgid "keyword"
-msgstr ""
-
-#: result.table.keyword
-msgid "View titles for this record"
-msgstr ""
-
-#: result.table.author
-msgid "Perform an Author Search"
-msgstr ""
-
-#: common.call.number.label
-msgid "Call Number:"
-msgstr ""
-
-#: common.isbn.label
-msgid "ISBN:"
-msgstr ""
-
-#: common.issn.label
-msgid "ISSN:"
-msgstr ""
-
-#: common.copy.barcode.label
-msgid "Copy Barcode:"
-msgstr ""
-
-#: common.hold.place
-msgid "Place hold for me"
-msgstr ""
-
-#: common.hold.check
-msgid "Checking for possibility of hold fulfillment..."
-msgstr ""
-
-#: common.hold.create
-msgid "Create / Edit a Hold"
-msgstr ""
-
-#: common.hold.update
-msgid "Update Hold"
-msgstr ""
-
-#: common.hold.type.label
-msgid "Hold Type:"
-msgstr ""
-
-#: common.hold.volume
-msgid "Volume Hold"
-msgstr ""
-
-#: common.hold.copy
-msgid "Copy Hold"
-msgstr ""
-
-#: common.hold.advanced
-msgid "Advanced Hold Options"
-msgstr ""
-
-#: common.hold.delivery
-msgid "Please select a physical location where your hold can be delivered."
-msgstr ""
-
-#: common.hold.exists
-msgid "A hold already exists on the requested item."
-msgstr ""
-
-#: common.hold.exists.override
-msgid "A hold already exists on the requested "
-"item. Would you like to create the hold anyway?"
-msgstr ""
-
-#: common.hold.barred
-msgid "PATRON BARRED. Please see any notes in the "
-"\"Staff Notes\" section of your \"My Account\" page or contact your local library."
-msgstr ""
-
-#: common.hold.item.invalid
-msgid "This hold is no longer valid. It's likely that the "
-"target for the hold was deleted from the system.  Please cancel this hold and "
-"place a new one."
-msgstr ""
-
-#: common.hold.patron.invalid
-msgid "The patron barcode entered as the hold recipient is invalid."
-msgstr ""
-
-# Was (??), perhaps change to a button or icon?
-#: common.help
-msgid "(Help)"
-msgstr ""
-
-#: common.phone.format.help
-msgid "The phone number does not have the correct format. The expected format is XXX-YYY-ZZZZ"
-msgstr ""
-
-#: common.hold.failed
-msgid "No items were found that could fulfill the requested holds. "
-"It's possible that choosing a different format will result in a successful hold. "
-"It is also possible that you have exceeded the number of allowable holds. "
-"For further information, please consult your local librarian."
-msgstr ""
-
-#: common.control.click
-msgid "(control-click to select multiple formats)"
-msgstr ""
-
-#: common.format.alternatives
-msgid "Acceptable Alternative Formats:"
-msgstr ""
-
-#: common.phone.format
-msgid "(XXX-YYY-ZZZZ)"
-msgstr ""
-
-#: common.phone.enable
-msgid "Enable phone notifications for this hold?"
-msgstr ""
-
-#: common.email.enable
-msgid "Enable email notifications for this hold?"
-msgstr ""
-
-#: common.email.none
-msgid "(Patron has no configured email address)"
-msgstr ""
-
-#: common.email.set
-msgid "(See <a class='classic_link' id='holds.no_email.my_account'>My Account</a> for setting your email address)"
-msgstr ""
-
-#: common.keywords.label
-msgid "Keywords:"
-msgstr ""
-
-#: common.physical.label
-msgid "Physical Description:"
-msgstr ""
-
-#: common.series.label
-msgid "Series:"
-msgstr ""
-
-#: common.subject.label
-msgid "Subject:"
-msgstr ""
-
-#: common.title.label
-msgid "Title:"
-msgstr ""
-
-#: common.author.label
-msgid "Author:"
-msgstr ""
-
-#: common.format.label
-msgid "Format:"
-msgstr ""
-
-#: library.select
-msgid "Find results in"
-msgstr ""
-
-#: library.select.label
-msgid "Choose a different library..."
-msgstr ""
-
-#: login.username
-msgid "Enter your username or library barcode"
-msgstr ""
-
-#: login.password.change
-msgid "Change Password"
-msgstr ""
-
-#: login.first.time
-msgid "This appears to be the first time you have logged in. "
-"You will need to change your password."
-msgstr ""
-
-#: login.password.current.enter
-msgid "Enter your current password"
-msgstr ""
-
-#: login.password.new.enter
-msgid "Enter the new password"
-msgstr ""
-
-#: login.password.new.reenter
-msgid "Re-type the new password for verification"
-msgstr ""
-
-#: login.password.update
-msgid "Update Password"
-msgstr ""
-
-#: login.password.nomatch
-msgid "Passwords do not match"
-msgstr ""
-
-#: login.password.strength
-msgid "The password provided is not strong enough."
-msgstr ""
-
-#: login.barcode.inactive
-msgid "The barcode used to login is marked as inactive.  Please contact your local library."
-msgstr ""
-
-#: login.account.inactive
-msgid "This account has been deactivated.  Please contact your local library."
-msgstr ""
-
-#: login.failed
-msgid "Login failed. The username or password provided was not valid. "
-"Ensure Caps-Lock is off and try again or contact your local library."
-msgstr ""
-
-#: button.go
-msgid "Go!"
-msgstr ""
-
-# =================================================================
-# Slimpac Simple Search
-# =================================================================
-#: slimpac.start.title
-msgid "Simple Search"
-msgstr ""
-
-#: slimpac.start.nowSearching
-msgid "Now searching: "
-msgstr ""
-
-#: slimpac.start.dynamic
-msgid "Dynamic Catalog"
-msgstr ""
-
-# =================================================================
-# Slimpac Advanced Search
-# =================================================================
-#: slimpac.advanced.language
-msgid "Item Language"
-msgstr ""
-
-#: slimpac.advanced.create_date
-msgid "Record Creation Date"
-msgstr ""
-
-#: slimpac.advanced.edit_date
-msgid "Record Edit Date"
-msgstr ""
-
-#: opac.image_provided
-msgid "Image provided by"
-msgstr ""
-
-#: vendor.name
-msgid "Amazon"
-msgstr ""
-
-#: vendor.base_link
-msgid "http://amazon.com/dp/"
-msgstr ""
diff --git a/build/i18n/scripts/ils_events.py b/build/i18n/scripts/ils_events.py
new file mode 100755 (executable)
index 0000000..0efb37d
--- /dev/null
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+# ils_events.py
+"""
+This class enables translation of Evergreen's ils_events XML file.
+
+Requires polib from http://polib.googlecode.com
+
+Source event definitions are structured as follows:
+<ils_events>
+    <event code='1' textcode='UNKNOWN'>
+        <desc xml:lang="en-US">Placeholder event.  Used for development only</desc>
+     </event>
+</ils_events>
+
+This generates an updated file with the following structure:
+<ils_events>
+    <event code='1' textcode='UNKNOWN'>
+        <desc xml:lang="en-US">Placeholder event.  Used for development only</desc>
+        <desc xml:lang="fr-CA">Exemple - seulement developpement</desc>
+    </event>
+</ils_events>
+"""
+# Copyright 2007 Dan Scott <dscott@laurentian.ca>
+#
+# 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.
+
+import basel10n
+import optparse
+import polib
+import re
+import sys
+import xml.sax
+import xml.sax.handler
+
+class ILSEvents(basel10n.BaseL10N):
+    """
+    This class provides methods for extracting translatable strings from
+    Evergreen's ils_events XML file, generating a translatable POT file,
+    reading translated PO files, and generating an updated ils_events.xml
+    file with the additional language strings.
+    """
+
+    def __init__(self):
+        self.pot = None
+        basel10n.BaseL10N.__init__(self)
+        self.definitions = []
+        self.locale = None
+
+    def get_strings(self, source):
+        """
+        Extracts translatable strings from the //desc[@lang='en-US'] attributes
+        in Evergreen's ils_events.xml file.
+        """
+        self.pothead()
+
+        locator = xml.sax.xmlreader.Locator()
+        parser = xml.sax.make_parser()
+        handler = ILSEventHandler()
+        handler.setDocumentLocator(locator)
+        parser.setContentHandler(handler)
+        parser.parse(source)
+
+        for entry in handler.events:
+            poe = polib.POEntry()
+            poe.occurrences = handler.events[entry]
+            poe.msgid = entry
+            self.pot.append(poe)
+
+    def create_events(self):
+        """
+        Creates an ILS events XML file based on a translated PO file.
+
+        Each PO entry has one or more file comment with the following structure:
+
+        #: numcode.textcode:lineno
+        """
+
+        event = """    <event code='%d' textcode='%s'>
+        <desc xml:lang='%s'>%s</desc>\n    </event>"""
+
+        # We should generate this in a real XML way, rather than faking it
+        # But we'll fake it for now
+        for entry in self.pot:
+            for name in entry.occurrences:
+                # regex name here
+                pat = re.compile(r'(\d+)\.(\w+)').match(name[0])
+                numcode = pat.group(1)
+                textcode = pat.group(2)
+
+                if entry.msgstr == '':
+                    # No translation available; use the en-US definition
+                    self.definitions.append(event % (int(numcode), textcode, self.locale, entry.msgid))
+                else:
+                    self.definitions.append(event % (int(numcode), textcode, self.locale, entry.msgstr))
+
+class ILSEventHandler(xml.sax.handler.ContentHandler):
+    """
+    Parses an ils_events.xml file to get at event[@code] attributes and
+    the contained desc[@lang='en-US'] elements.
+
+    Generates a list of events and their English descriptions.
+    """
+
+    def __init__(self):
+        xml.sax.handler.ContentHandler.__init__(self)
+        self.events = dict()
+        self.desc = u''
+        self.en_us_flag = False
+        self.numcode = None
+        self.textcode = None
+        self.locator = None
+
+    def setDocumentLocator(self, locator):
+        """
+        Override setDocumentLocator so we can track line numbers
+        """
+        self.locator = locator
+
+    def startElement(self, name, attributes):
+        """
+        Grab the event code attribute value for each class
+        or field element.
+        """
+        if name == 'event':
+            self.numcode = attributes['code']
+            self.textcode = attributes['textcode']
+        if name == 'desc' and attributes['xml:lang'] == 'en-US':
+            self.en_us_flag = True
+
+    def characters(self, content):
+        """
+        Build the ILS event description
+        """
+        if self.en_us_flag is True and content is not None:
+            self.desc += content
+
+    def endElement(self, name):
+        """
+        Generate the event with the closed description
+        """
+        if name == 'desc' and self.en_us_flag is True:
+            lineno = self.locator.getLineNumber()
+            event = "%d.%s" % (int(self.numcode), self.textcode)
+            if self.events.has_key(self.desc):
+                self.events[self.desc].append([str(event), lineno])
+            else:
+                self.events[self.desc] = [[str(event), lineno]]
+
+            # Reset event values
+            self.desc = u''
+            self.en_us_flag = False
+            self.numcode = None
+            self.textcode = None
+
+def main():
+    """
+    Determine what action to take
+    """
+    opts = optparse.OptionParser()
+    opts.add_option('-p', '--pot', action='store', \
+        help='Create a POT file from the specified ils_events.xml file', \
+        metavar='FILE')
+    opts.add_option('-c', '--create', action='store', \
+        help='Create an ils_events.xml file from a translated PO FILE', \
+        metavar='FILE')
+    opts.add_option('-l', '--locale', action='store', \
+        help='Locale of the ils_events.xml file that will be generated', \
+        metavar='FILE')
+    opts.add_option('-o', '--output', dest='outfile', \
+        help='Write output to FILE (defaults to STDOUT)', metavar='FILE')
+    (options, args) = opts.parse_args()
+
+    pot = ILSEvents()
+
+    # Generate a new POT file from the ils_events.xml file
+    if options.pot:
+        pot.get_strings(options.pot)
+        if options.outfile:
+            pot.savepot(options.outfile)
+        else:
+            sys.stdout.write(pot.pot.__str__())
+
+    # Generate an ils_events.xml file from a PO file
+    elif options.create:
+        if options.locale:
+            pot.locale = options.locale
+        else:
+            opts.error('Must specify an output locale to create an XML file')
+
+        head = """<?xml version="1.0" encoding="utf-8"?>
+<ils_events>
+        """
+        
+        tail = "</ils_events>"
+
+        pot.loadpo(options.create)
+        pot.create_events()
+        if options.outfile:
+            outfile = open(options.outfile, 'w')
+            outfile.write(head)
+            for event in pot.definitions: 
+                outfile.write(event + "\n")
+            outfile.write(tail)
+        else:
+            print(head)
+            for event in pot.definitions:
+                print(event)
+            print(tail)
+
+    # No options were recognized - print help and bail
+    else:
+        opts.print_help()
+
+if __name__ == '__main__':
+    main()
diff --git a/build/i18n/scripts/marc_tooltip_maker.py b/build/i18n/scripts/marc_tooltip_maker.py
new file mode 100644 (file)
index 0000000..3979766
--- /dev/null
@@ -0,0 +1,315 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# vim:et:ts=4:sw=4:
+
+# Copyright (C) 2008 Laurentian University
+# Dan Scott <dscott@laurentian.ca>
+# 
+# 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.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+"""
+The MARC editor offers tooltips generated from the Library of Congress Concise
+MARC Record documentation available online.
+
+This script generates a French version of those tooltips based on the Library
+and Archives Canada translation of the LoC documentation.
+"""
+
+from BeautifulSoup import BeautifulSoup
+
+# Simple case:
+# Get <a id="#mrcb(###)">: map $1 to tag attribute
+#   From within that A event, retrieve the SMALL event
+#     If SMALL.cdata == '\s*(R)\s*' then repeatable = yes  
+#     If SMALL.cdata == '\s*(NR)\s*' then repeatable = no
+#   Get the next P event: map to <description> element
+#
+# Target:
+#  <field repeatable="true" tag="006">
+#    <description>This field contains 18 character positions (00-17)
+#    that provide for coding information about special aspects of
+#    the item being cataloged that cannot be coded in field 008
+#    (Fixed-Length Data Elements). It is used in cases when an item
+#    has multiple characteristics. It is also used to record the coded
+#    serial aspects of nontextual continuing resources.</description>
+#  </field>
+
+# Complex case:
+
+# field and tag and repeatable description as above
+# check for <h3>Indicateurs</h3> before next <h2>
+#   check for <li>Premier indicateur or <li>Second indicateur to set indicator.position
+#   check for <li class="sqf">(\d)\s*-\s*([^<]*)< for indicator.position.value = def__init__ion
+#   ignore if "Non d&#233;fini"
+# check for <h3>Codes do sous-zones
+#   for each <li>:
+#     CDATA (stripped of tags, with (NR) or (R) stripped out) = field.subfield.def__init__ion
+#     (NR) or (R) means field.subfield.repeatable = false or true
+
+#  <field repeatable="true" tag="800">
+#    <description>An author/title series added entry in which the
+#      author portion is a personal name.</description>
+#    <indicator position="1" value="0">
+#      <description>Forename</description>
+#    </indicator>
+#    <indicator position="1" value="1">
+#      <description>Surname</description>
+#    </indicator>
+#    <indicator position="1" value="3">
+#      <description>Family name</description>
+#    </indicator>
+#    <subfield code="a" repeatable="false">
+#      <description>Personal name </description>
+#    </subfield>
+#    <subfield code="b" repeatable="false">
+#      <description>Numeration </description>
+#    </subfield>
+
+class MarcCollection(object):
+    """
+    Contains a set of descriptions of MARC fields organized by tag
+    """
+    
+    def __init__(self):
+        self.fields = {}
+
+    def add_field(self, field):
+        """
+        Add a MARC field to our collection
+        """
+        self.fields[field.tag] = field
+
+    def to_xml(self):
+        """
+        Convert the MARC field collection to XML representation
+        """
+        xml = "<?xml version='1.0' encoding='utf-8'?>\n"
+        xml += "<fields>\n"
+        keys = self.fields.keys()
+        keys.sort()
+        for key in keys:
+            xml += self.fields[key].to_xml()
+        xml += "\n</fields>\n"
+        return xml
+
+class MarcField(object):
+    """
+    Describes the properties of a MARC field
+
+    You can directly access and manipulate the indicators and subfields lists
+    """
+    def __init__(self, tag, name, repeatable, description):
+        self.tag = tag
+        self.name = name
+        self.repeatable = repeatable
+        self.description = description
+        self.indicators = []
+        self.subfields = []
+
+    def to_xml(self):
+        """
+        Convert the MARC field to XML representation
+        """
+        xml = u"  <field repeatable='%s' tag='%s'>\n" % (self.repeatable, self.tag)
+        xml += u"    <name>%s</name>\n" % (self.name)
+        xml += u"    <description>%s</description>\n" % (self.description)
+        for ind in self.indicators:
+            xml += ind.to_xml()
+            xml += '\n'
+        for subfield in self.subfields:
+            xml += subfield.to_xml()
+            xml += '\n'
+        xml += u"  </field>\n"
+
+        return xml
+
+class Subfield(object):
+    """
+    Describes the properties of a MARC subfield
+    """
+    def __init__(self, code, repeatable, description):
+        self.code = code
+        self.repeatable = repeatable
+        self.description = description
+
+    def to_xml(self):
+        """
+        Convert the subfield to XML representation
+        """
+        xml = u"    <subfield code='%s' repeatable='%s'>\n" % (self.code, self.repeatable)
+        xml += u"      <description>%s</description>\n" %  (self.description)
+        xml += u"    </subfield>\n"
+        return xml
+  
+class Indicator(object):
+    """
+    Describes the properties of an indicator-value pair for a MARC field
+    """
+    def __init__(self, position, value, description):
+        self.position = position
+        self.value = value
+        self.description = description
+
+    def to_xml(self):
+        """
+        Convert the indicator-value pair to XML representation
+        """
+        xml = u"    <indicator position='%s' value='%s'>\n" % (self.position, self.value)
+        xml += u"      <description>%s</description>\n" %  (self.description)
+        xml += u"    </indicator>\n"
+        return xml
+def process_indicator(field, position, raw_ind):
+    """
+    Given an XML chunk holding indicator data,
+    append Indicator objects to a MARC field
+    """
+    if (re.compile(r'indicateur\s*-\s*Non').search(raw_ind.contents[0])):
+        return None
+    if (not raw_ind.ul):
+        print "No %d indicator for %s, although not not defined either..." % (position, field.tag)
+        return None
+    ind_values = raw_ind.ul.findAll('li')
+    for value in ind_values:
+        text = ''.join(value.findAll(text=True))
+        if (re.compile(u'non précisé').search(text)):
+            continue
+        matches = re.compile(r'^(\S(-\S)?)\s*-\s*(.+)$', re.S).search(text)
+        if matches is None: 
+            continue
+        new_ind = Indicator(position, matches.group(1).replace('\n', ' ').rstrip(), matches.group(3).replace('\n', ' ').rstrip())
+        field.indicators.append(new_ind)
+
+def process_subfield(field, subfield):
+    """
+    Given an XML chunk holding subfield data,
+    append a Subfield object to a MARC field
+    """
+    repeatable = 'true'
+
+    if (subfield.span):
+        if (re.compile(r'\(R\)').search(subfield.span.renderContents())):
+            repeatable = 'false'
+        subfield.span.extract()
+    elif (subfield.small):
+        if (re.compile(r'\(R\)').search(subfield.small.renderContents())):
+            repeatable = 'false'
+        subfield.small.extract()
+    else:
+        print "%s has no small or span tags?" % (field.tag)
+
+    subfield_text = re.compile(r'\n').sub(' ', ''.join(subfield.findAll(text=True)))
+    matches = re.compile(r'^\$(\w)\s*-\s*(.+)$', re.S).search(subfield_text)
+    if (not matches):
+        print "No subfield match for field: " + field.tag
+        return None
+    field.subfields.append(Subfield(matches.group(1).replace('\n', ' ').rstrip(), repeatable, matches.group(2).replace('\n', ' ').rstrip()))
+
+def process_tag(tag):
+    """
+    Given a chunk of XML representing a MARC field, generate a MarcField object
+    """
+    repeatable = 'true'
+    name = u''
+    description = u''
+
+    # Get tag
+    tag_num = re.compile(r'^mrcb(\d+)').sub(r'\1', tag['id'])
+    if (len(tag_num) != 3):
+        return None
+
+    # Get repeatable - most stored in <span>, some stored in <small>
+    if (re.compile(r'\(NR\)').search(tag.renderContents())):
+        repeatable = 'false'
+
+    # Get name - stored in <h2> like:
+    # <h2><a id="mrcb250">250 - Mention d'&#233;dition <span class="small">(NR)</span></a>
+    name = re.compile(r'^.+?-\s*(.+)\s*\(.+$', re.S).sub(r'\1', ''.join(tag.findAll(text=True)))
+    name = name.replace('\n', ' ').rstrip()
+
+    # Get description
+    desc = tag.parent.findNextSibling('p')
+    if (not desc):
+        print "No description for %s" % (tag_num)
+    else:
+        if (str(desc.__class__) == 'BeautifulSoup.Tag'):
+            try:
+                description += u''.join(desc.findAll(text=True))
+            except:
+                print "Bad description for: " + tag_num
+                print u' '.join(desc.findAll(text=True))
+        else:
+            description += desc.string
+    description = description.replace('\n', ' ').rstrip()
+
+    # Create the tag
+    field = MarcField(tag_num, name, repeatable, description)
+
+    for desc in tag.parent.findNextSiblings():
+        if (str(desc.__class__) == 'BeautifulSoup.Tag'):
+            if (desc.name == 'h2'):
+                break
+            elif (desc.name == 'h3' and re.compile(r'Indicateurs').search(desc.string)):
+                # process indicators
+                first_ind = desc.findNextSibling('ul').li
+                second_ind = first_ind.findNextSibling('li')
+                if (not second_ind):
+                    second_ind = first_ind.parent.findNextSibling('ul').li
+                process_indicator(field, 1, first_ind)
+                process_indicator(field, 2, second_ind)
+            elif (desc.name == 'h3' and re.compile(r'Codes de sous').search(desc.string)):
+                # Get subfields
+                subfield = desc.findNextSibling('ul').li
+                while (subfield):
+                    process_subfield(field, subfield)
+                    subfield = subfield.findNextSibling('li')
+
+    return field
+
+if __name__ == '__main__':
+    import copy
+    import os
+    import re
+    import subprocess
+
+    ALL_MY_FIELDS = MarcCollection()
+
+    # Run through the LAC-BAC MARC files we care about and convert like crazy   
+    for filename in os.listdir('.'):
+
+        if (not re.compile(r'^040010-1\d\d\d-f.html').search(filename)):
+            continue
+        print filename
+        devnull = open('/dev/null', 'w')
+        file = subprocess.Popen(
+            ('tidy', '-asxml', '-n', '-q', '-utf8', filename),
+            stdout=subprocess.PIPE, stderr=devnull).communicate()[0]
+
+        # Strip out the hard spaces on our way through
+        hardMassage = [(re.compile(r'&#160;'), lambda match: ' ')]
+        myHardMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE)
+        myHardMassage.extend(myHardMassage)
+
+        filexml = BeautifulSoup(file, markupMassage=myHardMassage)
+
+        tags = filexml.findAll('a', id=re.compile(r'^mrcb'))
+        for tag in tags:
+            field = process_tag(tag)
+            if (field):
+                ALL_MY_FIELDS.add_field(field)
+
+    MARCOUT = open('marcedit-tooltips-fr.xml', 'w')
+    MARCOUT.write(ALL_MY_FIELDS.to_xml().encode('UTF-8'))
+    MARCOUT.close()
diff --git a/build/i18n/tests/check_properties.py b/build/i18n/tests/check_properties.py
new file mode 100644 (file)
index 0000000..e2b9e42
--- /dev/null
@@ -0,0 +1,165 @@
+#!/usr/bin/env python
+# -----------------------------------------------------------------------
+# Copyright (C) 2008  Laurentian University
+# Dan Scott <dscott@laurentian.ca>
+# 
+# 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.
+# -----------------------------------------------------------------------
+
+# vim:et:sw=4:ts=4: set fileencoding=utf-8 :
+
+"""
+Parse i18n properties files and XUL / JavaScript files looking for trouble
+    * Invalid strings
+    * Unused strings
+    * Missing strings
+"""
+
+import os
+import re
+
+DEBUG = False
+
+PROP_DIRS = (
+        '../../../Open-ILS/xul/staff_client/server/locale/en-US/',
+        '../../../Open-ILS/xul/staff_client/chrome/locale/en-US/'
+        )
+
+XUL_DIRS = (
+        '../../../Open-ILS/xul/staff_client/server/',
+        '../../../Open-ILS/xul/staff_client/chrome/',
+        )
+
+def parse_properties():
+    """
+    Parse the properties files in known places
+    """
+
+    basedir = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
+
+    properties = {}
+
+    prop_files = []
+
+    for p_dir in PROP_DIRS:
+        p_dir = os.path.normpath(os.path.join(basedir, p_dir))
+        file_list = os.listdir(p_dir)
+        for p_file in file_list:
+            if os.path.splitext(p_file)[1] == '.properties':
+                prop_files.append(os.path.join(p_dir, p_file))
+
+    prefix = os.path.commonprefix(prop_files)
+
+    for p_file in prop_files:
+
+        # Get the shortest unique address for this file
+        short_pf = p_file[len(prefix):]
+
+        prop_file = open(p_file, 'r')
+
+        line_num = 1
+
+        for line in prop_file:
+            line_num += 1
+
+            # Get rid of trailing linefeed
+            line = line[0:-1]
+
+            # Skip comments
+            if not line or line[0] == '#':
+                continue
+
+            # Split property/value on first = sign
+            unpack = re.split('=', line, 1)
+
+            # If a line doesn't have an = sign, is that okay (run-on from previous?) or illegal?
+            # I think it's illegal
+            if len(unpack) != 2:
+                print("%s:%d: No property in line [%s]" % (short_pf, line_num, line))
+                continue
+
+            prop_key, value = unpack
+
+            if not properties.has_key(prop_key):
+                properties[prop_key] = [{'value': value, 'file': short_pf}]
+                continue
+
+            for entry in properties[prop_key]:
+                if ['file'] == short_pf:
+                    print("%s:%d: Duplicate key '%s' in line [%s]" % (short_pf, line_num, prop_key, line[0:-1]))
+                    continue
+
+            properties[prop_key].append({'value': value, 'file': short_pf})
+
+        prop_file.close()
+
+    return properties
+
+def check_xul_files(props):
+    """
+    Finds all the XUL and JavaScript files
+    """
+
+    basedir = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
+
+    xul_files = []
+
+    for x_dir in XUL_DIRS:
+        for root, dirs, files in os.walk(x_dir):
+            for x_file in files:
+                if os.path.splitext(x_file)[1] == '.xul' or os.path.splitext(x_file)[1] == '.js':
+                    check_xul(root, x_file, props)
+
+def check_xul(root, filename, props):
+    """
+    Parse all getString() and getFormattedString() calls in XUL and JavaScript
+    files to ensure:
+      * that the requested property exists
+      * that every property is actually required
+    """
+
+    num_strings = 0
+
+    # Typical example of a getString request:
+    # document.getElementById('catStrings').getString('staff.cat.bib_brief.deleted')
+    strings = re.compile(r'''\(\s*?(['"])([^'"]+?)Strings\1\s*?\)\.getString\(\s*?(['"])([^'"]+?)\3\s*?\)''')
+
+    # Typical example of a getFormattedString request:
+    # document.getElementById('catStrings').getFormattedString('staff.cat.bib_brief.record_id', [docid])
+    formed_strings = re.compile(r'''\(\s*?(['"])([^'"]+?)Strings\1\s*?\)\.getFormattedString\(\s*?(['"])([^'"]+?)\3\s*?,\s*\[(.+?)\]\s*\)\)''')
+
+    xul = open(os.path.join(root, filename), 'r')
+    content = xul.read()
+    xul.close()
+
+    if DEBUG:
+        print "File: %s" % (os.path.normpath(os.path.join(root, filename)))
+
+    for s_match in strings.finditer(content):
+        num_strings += 1
+        #print "\tStringset: %s ID: %s" % (s_match.group(2), s_match.group(4))
+        if not props.has_key(s_match.group(4)):
+            print "File: %s" % (os.path.normpath(os.path.join(root, filename)))
+            print "\tID %s not found, expected in %sStrings" % (s_match.group(4), s_match.group(2))
+
+    for s_match in formed_strings.finditer(content):
+        num_strings += 1
+        #print "\tStringset: %s ID: %s, data: %s" % (s_match.group(2), s_match.group(4), s_match.group(5))
+        if not props.has_key(s_match.group(4)):
+            print "File: %s" % (os.path.normpath(os.path.join(root, filename)))
+            print "\tID %s not found, expected in %sStrings" % (s_match.group(4), s_match.group(2))
+
+    if DEBUG:
+        print "\t%d i18n calls found" % (num_strings)
+
+if __name__ == '__main__':
+    props = parse_properties() 
+    check_xul_files(props)
index 737c4bf..2fca956 100644 (file)
@@ -14,10 +14,13 @@ class TestPOFramework(unittest.TestCase):
     po_sources = ('../../Open-ILS/web/opac/locale/en-US/*.dtd',
         '../../Open-ILS/xul/staff_client/chrome/locale/en-US/*.properties',
         '../../Open-ILS/examples/fm_IDL.xml',
+        '../../Open-ILS/src/extras/ils_events.xml',
         '../../Open-ILS/src/sql/Pg/950.data.seed-values.sql')
 
-    po_tmp_files = ('tests/tmp/po/test.properties.pot', 'tests/tmp/po/ll-LL/temp.properties.po')
-    pot_dir = 'tests/tmp/po'
+    po_tmp_files = ('tests/tmp/po/en-US/test.properties.pot', 'tests/tmp/po/ll-LL/temp.properties.po')
+    pot_dir = 'tests/tmp/po/en-US'
+    po_in_dir = 'POINDIR=tests/tmp/po'
+    po_out_dir = 'POOUTDIR=tests/tmp/po'
     locale = 'll-LL'
     locale_dir = 'tests/tmp/po/ll-LL'
     project_dir = 'tests/tmp/locale'
@@ -25,19 +28,20 @@ class TestPOFramework(unittest.TestCase):
     newdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
 
     def setUp(self):
-        print os.getcwd()
         os.chdir(self.newdir)
         self.tearDown()
         devnull = open('/dev/null', 'w')
         os.mkdir('tests/tmp')
         os.mkdir(self.project_dir)
         subprocess.Popen(('cp', '-r', 'po', 'tests/tmp'), 0, None, None, devnull, devnull).wait()
-        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpot'), 0, None, None, devnull, devnull).wait()
-        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpo'), 0, None, None, devnull, devnull).wait()
-        subprocess.Popen(('make', 'LOCALE=ll-LL', 'PROJECT=tests/tmp/locale', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newproject'), 0, None, None, devnull, devnull).wait()
+        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POTSRC=tests/tmp/po/en-US', self.po_in_dir, self.po_out_dir, 'newpot'), 0, None, None, devnull, devnull).wait()
+        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POTSRC=tests/tmp/po/en-US', self.po_in_dir, self.po_out_dir, 'newpo'), 0, None, None, devnull, devnull).wait()
+        subprocess.Popen(('make', 'LOCALE=ll-LL', 'PROJECT=tests/tmp/locale', self.po_in_dir, 'newproject'), 0, None, None, devnull, devnull).wait()
         devnull.close()
 
     def tearDown(self):
+        devnull = open('/dev/null', 'w')
+        subprocess.Popen(('cp', '-r', 'tests/tmp', 'done'), 0, None, None, devnull, devnull).wait()
         for root, dirs, files in os.walk(os.path.join(self.newdir, 'tests/tmp'), topdown=False):
             for name in files:
                 os.remove(os.path.join(root, name))
@@ -101,7 +105,7 @@ class TestPOFramework(unittest.TestCase):
 
         # Regenerate the project files to get the translated strings in place
         devnull = open('/dev/null', 'w')
-        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updateproject'), 0, None, None, devnull, devnull).wait()
+        subprocess.Popen(('make', 'LOCALE=ll-LL', self.po_in_dir, self.po_out_dir, 'updateproject'), 0, None, None, devnull, devnull).wait()
 
         self.assertEqual(filecmp.cmp(commonprops, testprops), 1)
 
@@ -136,7 +140,7 @@ class TestPOFramework(unittest.TestCase):
 
         # Update the PO files to get the translated strings in place
         devnull = open('/dev/null', 'w')
-        subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updatepo'), 0, None, None, devnull, devnull).wait()
+        subprocess.Popen(('make', 'LOCALE=ll-LL', self.po_in_dir, self.po_out_dir, 'updatepo'), 0, None, None, devnull, devnull).wait()
 
         commonprops = os.path.join(self.locale_dir, 'common.properties.po')
         tempprops = os.path.join(self.locale_dir, 'temp.properties.po')
index 74677b3..32839e0 100755 (executable)
@@ -261,6 +261,7 @@ function cleanMe {
        loadConfig;
        make "TMP=$TMP" -s -C "$OPENILSDIR"  clean;
        make "TMP=$TMP" -s -C "$EVERGREENDIR" clean;
+       make "TMP=$TMP" -s -C "$OPENILSDIR/../xul/staff_client"  clean;
 }
 
 function usage {